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
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()
|
|
|
|
|