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.
128 lines
3.6 KiB
128 lines
3.6 KiB
/******************************Module*Header*******************************\
|
|
* Module Name: extparse.cxx
|
|
*
|
|
* Copyright (c) 1998-2000 Microsoft Corporation
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#include "precomp.hxx"
|
|
|
|
/* 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 parse_Tokenizer(char *cmdstr, char **tok) {
|
|
char *seps=" \t\n"; //white space separators
|
|
int tok_count = 0; //the token count
|
|
char *token = strtok(cmdstr, seps); //get the first token
|
|
while(token) {
|
|
tok[tok_count++]=token;
|
|
token = strtok(NULL, seps);
|
|
}
|
|
return tok_count;
|
|
}
|
|
|
|
/* 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 (parse_iFindToken)
|
|
* but occasionally we need the case sensitive version (parse_FindToken).
|
|
*/
|
|
int parse_FindToken(char **tok, int ntok, char *srchtok) {
|
|
for(int i=0; i<ntok; i++) {
|
|
if(strcmp(tok[i], srchtok)==0) break;
|
|
}
|
|
if(i>=ntok) return -1;
|
|
return i;
|
|
}
|
|
|
|
int parse_iFindToken(char **tok, int ntok, char *srchtok) {
|
|
for(int i=0; i<ntok; i++) {
|
|
if(_strnicmp(tok[i], srchtok, strlen(srchtok))==0) break;
|
|
}
|
|
if(i>=ntok) return -1;
|
|
return i;
|
|
}
|
|
|
|
/* Verifies that the given token at tok[tok_pos] is a switch
|
|
* and contains the switch value sw.
|
|
*
|
|
* Both case sensitive and insensitive versions.
|
|
*/
|
|
int parse_iIsSwitch(char **tok, int tok_pos, char sw) {
|
|
if(tok_pos<0) return 0;
|
|
char *s=tok[tok_pos];
|
|
if((s[0]=='-')||(s[0]=='/')) { //is a switch.
|
|
for(s++; *s; s++) {
|
|
if(toupper(*s)==toupper(sw)) {return 1;}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int parse_IsSwitch(char **tok, int tok_pos, char sw) {
|
|
if(tok_pos<0) return 0;
|
|
char *s=tok[tok_pos];
|
|
if((s[0]=='-')||(s[0]=='/')) { //is a switch.
|
|
for(s++; *s; s++) {
|
|
if(*s==sw) {return 1;} //search each char
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* Finds a switch in a given list of tokens.
|
|
* of the form -xxx(sw)xxx or /xxx(sw)xxx
|
|
* example:
|
|
* searching for 'a' in -jklabw returns true.
|
|
*
|
|
* Again both case sensitive and insensitive versions are needed.
|
|
*/
|
|
int parse_FindSwitch(char **tok, int ntok, char sw) {
|
|
for(int i=0; i<ntok; i++) { //search each token
|
|
if(parse_IsSwitch(tok, i, sw)) {return i;} //found it? return position.
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int parse_iFindSwitch(char **tok, int ntok, char sw) {
|
|
for(int i=0; i<ntok; i++) {
|
|
if(parse_IsSwitch(tok, i, sw)) {return i;} //found it? return position.
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|
|
/* Find the first non-switch token starting from position start
|
|
* Will find token at position start
|
|
*/
|
|
int parse_FindNonSwitch(char **tok, int ntok, int start) {
|
|
for(int i=start; i<ntok; i++) {
|
|
if((tok[i][0]!='-')&&(tok[i][0]!='/')) break;
|
|
}
|
|
if(i>=ntok) return -1;
|
|
return i;
|
|
}
|
|
|
|
/* case insensitive token comparer.
|
|
* returns 1 if chk==tok[tok_pos] otherwise returns 0
|
|
*
|
|
* Pay careful attention to the length specifier in the _strnicmp
|
|
*/
|
|
int parse_iIsToken(char **tok, int tok_pos, char *chk) {
|
|
if(tok_pos<0) {return 0;}
|
|
return (_strnicmp(tok[tok_pos], chk, strlen(chk))==0);
|
|
}
|
|
|
|
/* case sensitive token comparer.
|
|
* returns 1 if chk==tok[tok_pos] otherwise returns 0
|
|
*/
|
|
int parse_IsToken(char **tok, int tok_pos, char *chk) {
|
|
if(tok_pos<0) {return 0;}
|
|
return (strcmp(tok[tok_pos], chk)==0);
|
|
}
|
|
|
|
|