mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
5.0 KiB
218 lines
5.0 KiB
/* --------------------------------------------------------------------
|
|
|
|
Microsoft OS/2 LAN Manager
|
|
Copyright(c) Microsoft Corp., 1990
|
|
|
|
This file contains a class definition for switch processing
|
|
|
|
This is taken practically unchanged from the RPC locator
|
|
written by Steven Zeck
|
|
|
|
-------------------------------------------------------------------- */
|
|
|
|
#include <switch.hxx>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#define RpcStrdup strdup
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
|
|
|
|
#define USED(arg) ((void)(arg))
|
|
|
|
int TailMatch( char * pszPatt, char * pszIn);
|
|
|
|
char *ProcessArgs(
|
|
SwitchList aSLCur,
|
|
char **aArgs
|
|
|
|
// Process a list of arguments
|
|
) //-----------------------------------------------------------------------//
|
|
{
|
|
char * pszArgCur, *pszParm;
|
|
|
|
for (; *aArgs; aArgs++) {
|
|
|
|
for (SWitch *pSW = aSLCur; pSW->name; pSW++) {
|
|
|
|
pszArgCur = *aArgs;
|
|
pszParm = pSW->name;
|
|
|
|
while (*pszParm) {
|
|
|
|
if (*pszParm == '#') {
|
|
|
|
// optional space between flag and argument
|
|
|
|
if (!*pszArgCur) {
|
|
pszArgCur = *(++aArgs);
|
|
|
|
if (!pszArgCur)
|
|
return(aArgs[-1]);
|
|
}
|
|
|
|
if (TailMatch(pszParm, pszArgCur))
|
|
goto found;
|
|
}
|
|
|
|
else if (*pszParm == '*') {
|
|
|
|
// no space allowed between flag and argument
|
|
|
|
if (*pszArgCur && TailMatch(pszParm, pszArgCur))
|
|
goto found;
|
|
|
|
break;
|
|
|
|
}
|
|
else {
|
|
|
|
// do a case insensitive compare, pattern is always lower case
|
|
|
|
if (*pszArgCur >= 'A' && *pszArgCur <= 'Z') {
|
|
if ((*pszArgCur | 0x20) != *pszParm)
|
|
break;
|
|
}
|
|
else if (*pszArgCur != *pszParm)
|
|
break;
|
|
|
|
pszArgCur++; pszParm++;
|
|
|
|
if (! *pszArgCur && !*pszParm)
|
|
goto found;
|
|
}
|
|
}
|
|
}
|
|
|
|
return(*aArgs); // parm in error
|
|
|
|
found:
|
|
if ((*pSW->pProcess)(pSW, pszArgCur))
|
|
return(*aArgs);
|
|
|
|
}
|
|
return(0); // sucess all parms matched
|
|
|
|
}
|
|
|
|
|
|
|
|
int TailMatch( // match substrings from right to left *^
|
|
char * pszPatt, // pattern to match
|
|
char * pszIn // input pszInint to match
|
|
|
|
//compare a tail pszPatt (as in *.c) with a pszIning. if there is no
|
|
//tail, anything matches. (null pszInings are detected elsewhere)
|
|
//the current implementation only allows one wild card
|
|
)//-----------------------------------------------------------------------//
|
|
{
|
|
register char * pszPattT = pszPatt;
|
|
register char * pszInT = pszIn;
|
|
|
|
if (pszPattT[1] == 0) /* wild card is the last thing in the pszPatt, it matches */
|
|
return(TRUE);
|
|
|
|
while(pszPattT[1]) pszPattT++; // find char in front of null in pszPatt
|
|
|
|
while(pszInT[1]) pszInT++; // find char in front of null in pszIning to check
|
|
|
|
while(1) { // check chars walking towards front
|
|
|
|
// do a case insensitive compare, pattern is always lower case
|
|
|
|
if (*pszInT >= 'A' && *pszInT <= 'Z') {
|
|
if ((*pszInT | 0x20) != *pszPattT)
|
|
return (FALSE);
|
|
}
|
|
else if (*pszInT != *pszPattT)
|
|
return(FALSE);
|
|
|
|
pszInT--;
|
|
pszPattT--;
|
|
|
|
/* if we're back at the beginning of the pszPatt and
|
|
* the pszIn is either at the beginning (but not before)
|
|
* or somewhere inside then we have a match. */
|
|
|
|
if (pszPattT == pszPatt)
|
|
return(pszInT >= pszIn);
|
|
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
int ProcessInt( // Set a flag numeric value *^
|
|
SWitch *pSW, // pSW to modify
|
|
char * pszText // pointer to number to set
|
|
)/*-----------------------------------------------------------------------*/
|
|
{
|
|
for (char * psz=pszText; *psz; ++psz)
|
|
if (*psz < '0' || *psz > '9')
|
|
return(TRUE);
|
|
|
|
*(int *)pSW->p = atoi(pszText);
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
int ProcessLong( // Set a flag numeric value *^
|
|
SWitch *pSW, // pSW to modify
|
|
char * pszText // pointer to number to set
|
|
)/*-----------------------------------------------------------------------*/
|
|
{
|
|
for (char * psz=pszText; *psz; ++psz)
|
|
if (*psz < '0' || *psz > '9')
|
|
return(TRUE);
|
|
|
|
*(long *)pSW->p = atol(pszText);
|
|
return(FALSE);
|
|
}
|
|
|
|
int ProcessChar( // Set a flag numeric value *^
|
|
SWitch *pSW, // pSW to modify
|
|
char * pszText // pointer to number to set
|
|
)/*-----------------------------------------------------------------------*/
|
|
{
|
|
// if (*(char * *)pSW->p) // can only set char *'s once
|
|
// return(TRUE);
|
|
|
|
int size = strlen(pszText) + 1;
|
|
*(char * *)pSW->p = new char[size];
|
|
strcpy(*(char * *)pSW->p,pszText);
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
int ProcessSetFlag( // Set a flag numeric value *^
|
|
SWitch *pSW, // pSW to modify
|
|
char * pszText // pointer to number to set
|
|
)/*-----------------------------------------------------------------------*/
|
|
{
|
|
USED(pszText);
|
|
|
|
*(int *)pSW->p = TRUE;
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
int ProcessResetFlag( // Set a flag numeric value *^
|
|
SWitch *pSW, // pSW to modify
|
|
char * pszText // pointer to number to set
|
|
)/*-----------------------------------------------------------------------*/
|
|
{
|
|
USED(pszText);
|
|
|
|
*(int *)pSW->p = FALSE;
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
int ProcessYesNo( // Set a flag numeric value, either Yes or No *^
|
|
SWitch *pSW, // pSW to modify
|
|
char * pszText // pointer to number to set
|
|
)/*-----------------------------------------------------------------------*/
|
|
{
|
|
*(int *)pSW->p = (*pszText | 0x20) == 'y';
|
|
return(FALSE);
|
|
}
|