Windows NT 4.0 source code leak
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.
|
|
/* --------------------------------------------------------------------
Microsoft OS/2 LAN Manager Copyright(c) Microsoft Corp., 1990
RPC locator - Written by Steven Zeck
This file contains a class definition for switch processing -------------------------------------------------------------------- */
#include <switch.hxx>
#include <string.h>
#include <stdlib.h>
#if defined (RPC_CXX_20)
#define RpcStrdup _strdup
#else
#define RpcStrdup strdup
#endif
#ifndef TRUE
#define TRUE (~0)
#endif
#define FALSE 0
#define USED(arg) ((void)(arg))
typedef char *SZ;
int TailMatch( SZ szPatt, SZ szIn);
char *ProcessArgs( SwitchList aSLCur, char **aArgs
// Process a list of arguments
) //-----------------------------------------------------------------------//
{ SZ szArgCur, szParm;
for (; *aArgs; aArgs++) {
for (SWitch *pSW = aSLCur; pSW->name; pSW++) {
szArgCur = *aArgs; szParm = pSW->name;
while (*szParm) {
if (*szParm == '#') {
// optional space between flag and argument
if (!*szArgCur) { szArgCur = *(++aArgs);
if (!szArgCur) return(aArgs[-1]); }
if (TailMatch(szParm, szArgCur)) goto found; }
else if (*szParm == '*') {
// no space allowed between flag and argument
if (*szArgCur && TailMatch(szParm, szArgCur)) goto found;
break;
} else {
// do a case insensitive compare, pattern is always lower case
if (*szArgCur >= 'A' && *szArgCur <= 'Z') { if ((*szArgCur | 0x20) != *szParm) break; } else if (*szArgCur != *szParm) break;
szArgCur++; szParm++;
if (! *szArgCur && !*szParm) goto found; } } }
return(*aArgs); // parm in error
found: if ((*pSW->pProcess)(pSW, szArgCur)) return(*aArgs);
} return(0); // sucess all parms matched
}
int TailMatch( // match substrings from right to left *^
SZ szPatt, // pattern to match
SZ szIn // input szInint to match
//compare a tail szPatt (as in *.c) with a szIning. if there is no
//tail, anything matches. (null szInings are detected elsewhere)
//the current implementation only allows one wild card
)//-----------------------------------------------------------------------//
{ register SZ szPattT = szPatt; register SZ szInT = szIn;
if (szPattT[1] == 0) /* wild card is the last thing in the szPatt, it matches */ return(TRUE);
while(szPattT[1]) szPattT++; // find char in front of null in szPatt
while(szInT[1]) szInT++; // find char in front of null in szIning to check
while(1) { // check chars walking towards front
// do a case insensitive compare, pattern is always lower case
if (*szInT >= 'A' && *szInT <= 'Z') { if ((*szInT | 0x20) != *szPattT) return (FALSE); } else if (*szInT != *szPattT) return(FALSE);
szInT--; szPattT--;
/* if we're back at the beginning of the szPatt and
* the szIn is either at the beginning (but not before) * or somewhere inside then we have a match. */
if (szPattT == szPatt) return(szInT >= szIn);
} return(FALSE); }
int ProcessInt( // Set a flag numeric value *^
SWitch *pSW, // pSW to modify
SZ szText // pointer to number to set
)/*-----------------------------------------------------------------------*/ { for (SZ sz=szText; *sz; ++sz) if (*sz < '0' || *sz > '9') return(TRUE);
*(int *)pSW->p = atoi(szText); return(FALSE); }
int ProcessLong( // Set a flag numeric value *^
SWitch *pSW, // pSW to modify
SZ szText // pointer to number to set
)/*-----------------------------------------------------------------------*/ { for (SZ sz=szText; *sz; ++sz) if (*sz < '0' || *sz > '9') return(TRUE);
*(long *)pSW->p = atol(szText); return(FALSE); }
int ProcessChar( // Set a flag numeric value *^
SWitch *pSW, // pSW to modify
SZ szText // pointer to number to set
)/*-----------------------------------------------------------------------*/ { // if (*(SZ *)pSW->p) // can only set SZ's once
// return(TRUE);
*(SZ *)pSW->p = RpcStrdup(szText); return(FALSE); }
int ProcessSetFlag( // Set a flag numeric value *^
SWitch *pSW, // pSW to modify
SZ szText // pointer to number to set
)/*-----------------------------------------------------------------------*/ { USED(szText);
*(int *)pSW->p = TRUE; return(FALSE); }
int ProcessResetFlag( // Set a flag numeric value *^
SWitch *pSW, // pSW to modify
SZ szText // pointer to number to set
)/*-----------------------------------------------------------------------*/ { USED(szText);
*(int *)pSW->p = FALSE; return(FALSE); }
int ProcessYesNo( // Set a flag numeric value, either Yes or No *^
SWitch *pSW, // pSW to modify
SZ szText // pointer to number to set
)/*-----------------------------------------------------------------------*/ { *(int *)pSW->p = (*szText | 0x20) == 'y'; return(FALSE); }
|