Leaked source code of windows server 2003
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.
 
 
 
 
 
 

269 lines
6.8 KiB

/******************************Module*Header***********************************\
*
* *******************
* * GDI SAMPLE CODE *
* *******************
*
* Module Name: extparse.cxx
*
* Contains all the token parser functions
*
* Copyright (C) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (C) 1995-1999 Microsoft Corporation. All rights reserved.
******************************************************************************/
#include "dbgext.hxx"
/**********************************Public*Routine******************************\
*
* Command line parsing routines
*
* This routine should return an array of char* 's in the idx parameter with the
* beginning of each token in the array.
* It also returns the number of tokens found.
*
******************************************************************************/
int
iParseTokenizer(char* pcCmdStr,
char** ppcTok)
{
char* pcSeps = " \t\n"; // white space separators
char* pcToken = strtok(pcCmdStr, pcSeps); // get the first token
int iTokCount = 0; // the token count
while ( pcToken )
{
ppcTok[iTokCount++] = pcToken;
pcToken = strtok(NULL, pcSeps);
}
return iTokCount;
}// iParseTokenizer()
/**********************************Public*Routine******************************\
*
* This routine finds the token specified in srchtok
* and returns the index into tok.
* A return value of -1 is used if the token is not found.
*
* Generally we use the case insensitive version (iParseiFindToken)
* but occasionally we need the case sensitive version (iParseFindToken).
*
******************************************************************************/
int
iParseFindToken(char** ppcTok,
int iTok,
char* pcSrchTok)
{
for ( int iTemp = 0; iTemp < iTok; ++iTemp )
{
if ( strcmp(ppcTok[iTemp], pcSrchTok) == 0 )
{
break;
}
}
if ( iTemp >= iTok )
{
return -1;
}
return iTemp;
}// iParseFindToken()
/**********************************Public*Routine******************************\
*
* Case insensitive version of iParseFindToken
*
******************************************************************************/
int
iParseiFindToken(char** ppcTok,
int iTok,
char* pcSrchTok)
{
for ( int iTemp = 0; iTemp < iTok; ++iTemp )
{
if ( _strnicmp(ppcTok[iTemp], pcSrchTok, strlen(pcSrchTok)) == 0 )
{
break;
}
}
if ( iTemp >= iTok )
{
return -1;
}
return iTemp;
}// iParseiFindToken()
/**********************************Public*Routine******************************\
*
* Verifies that the given token at tok[iTokPos] is a switch
* and contains the switch value cSwitch.
*
* Both case sensitive and insensitive versions.
*
******************************************************************************/
int
iParseiIsSwitch(char** ppcTok,
int iTokPos,
char cSwitch)
{
if ( iTokPos < 0 )
{
return 0;
}
char* pcTemp = ppcTok[iTokPos];
if ( (pcTemp[0] == '-' ) || ( pcTemp[0] == '/' ) )
{
//
// Is a switch.
//
for ( pcTemp++; *pcTemp; pcTemp++ )
{
if ( toupper(*pcTemp) == toupper(cSwitch) )
{
return 1;
}
}
}
return 0;
}// iParseiIsSwitch()
int
iParseIsSwitch(char** ppcTok,
int iTokPos,
char cSwitch)
{
if ( iTokPos < 0 )
{
return 0;
}
char* pcTemp = ppcTok[iTokPos];
if ( (pcTemp[0] == '-') || (pcTemp[0] == '/') )
{
//
// Is a switch.
//
for ( pcTemp++; *pcTemp; pcTemp++ )
{
if ( *pcTemp == cSwitch )
{
return 1;
}// search each char
}
}
return 0;
}// iParseIsSwitch()
/**********************************Public*Routine******************************\
*
* Finds a switch in a given list of tokens.
* of the form -xxx(cSwitch)xxx or /xxx(cSwitch)xxx
* example:
* searching for 'a' in -jklabw returns true.
*
* Again both case sensitive and insensitive versions are needed.
*
******************************************************************************/
int
iParseFindSwitch(char** ppcTok,
int iTok,
char cSwitch)
{
//
// Search each token
//
for ( int iTemp = 0; iTemp < iTok; ++iTemp )
{
if ( iParseIsSwitch(ppcTok, iTemp, cSwitch) )
{
return iTemp;
}// found it? return position.
}
return -1;
}// iParseIsSwitch()
int
iParseiFindSwitch(char** ppcTok,
int iTok,
char cSwitch)
{
for ( int iTemp = 0; iTemp < iTok; ++iTemp )
{
if ( iParseIsSwitch(ppcTok, iTemp, cSwitch) )
{
return iTemp;
}//found it? return position.
}
return -1;
}// iParseIsSwitch()
/**********************************Public*Routine******************************\
*
* Find the first non-switch token starting from position start
* Will find token at position start
*
******************************************************************************/
int
iParseFindNonSwitch(char** ppcTok,
int iTok,
int iStart)
{
for (int iTemp = iStart; iTemp < iTok; ++iTemp )
{
if ( (ppcTok[iTemp][0]!='-')&&(ppcTok[iTemp][0]!='/') )
{
break;
}
}
if ( iTemp >= iTok )
{
return -1;
}
return iTemp;
}// iParseFindNonSwitch()
/**********************************Public*Routine******************************\
*
* Case insensitive token comparer.
* returns 1 if pcChk == ppcTok[iTokPos] otherwise returns 0
*
* Pay careful attention to the length specifier in the _strnicmp
*
******************************************************************************/
int
iParseiIsToken(char** ppcTok,
int iTokPos,
char* pcChk)
{
if ( iTokPos < 0 )
{
return 0;
}
return(_strnicmp(ppcTok[iTokPos], pcChk, strlen(pcChk)) == 0);
}// iParseiIsToken()
int
iParseIsToken(char** ppcTok,
int iTokPos,
char* pcChk)
{
if ( iTokPos < 0 )
{
return 0;
}
return(strcmp(ppcTok[iTokPos], pcChk) == 0);
}// iParseIsToken()