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