This is parseArgs.c in view mode; [Download] [Up]
#include <stream.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "parseArgs.h" extern char *cmdName; // A general-purpose parser of command-line arguments. // Arguments starting with a '-' are assumed to be flags, // arguments containing an '=' are assumed to be parameters, // and other arguments are left alone (LATER!!) // Parameters can have suffixes (T,G,M,K,m,u,p,f,a) void parseArgs( int& argc, char *argv[], parameterStruct parms[], flagStruct flags[] ){ cmdName = argv[0]; int i, unparsedArgs=0; char **argptr=argv++; double expression(char*); while( --argc >0 ){ char *s, *argstr=*argv++; if( argstr[0] == '-' ){ // This is a flag ++argstr; for( i=0; s=flags[i].string; ++i){ if( strcmp(argstr,s)==0 ){ *(flags[i].flag) = 1; // cerr << "Setting flag "<<s<<"\n"; break; } } if( s==NULL ){ cerr << cmdName << ": the flag "<< argstr << " is unrecognizable.\n"; exit( -1 ); } } else if( strchr(argstr,'=') ){ // This is a parameter for( i=0; s=parms[i].string; ++i){ int len=strlen(s); if( strncmp(argstr,s,len)==0 && argstr[len]=='='){ *(parms[i].parameter) = expression(argstr +len +1); // cerr << "Changing "<<s<<" to "<< *(parms[i].parameter) << "\n"; break; } } if( s == NULL ){ cerr << cmdName << ": the parameter assignment "<< argstr << " is unrecognizable.\n"; exit( -1 ); } } // else else{ // just put it back into the argv[] array *argptr++ = argstr; unparsedArgs++; } } // while(...) argc = unparsedArgs; } double expression( char *s ){ double x=0; char suffix[3]; if( sscanf( s, "%lf%3s", &x, suffix ) == 2){ // there is a suffix if( strcmp( suffix, "T" ) == 0 ) x *= 1e12; else if( strcmp( suffix, "G" ) == 0 ) x *= 1e9; else if( strcmp( suffix, "M" ) == 0 || strcmp( suffix, "meg" ) == 0 ) x *= 1e6; else if( strcmp( suffix, "m" ) == 0 ) x *= 1e-3; else if( strcmp( suffix, "u" ) == 0 ) x *= 1e-6; else if( strcmp( suffix, "n" ) == 0 ) x *= 1e-9; else if( strcmp( suffix, "p" ) == 0 ) x *= 1e-12; else if( strcmp( suffix, "f" ) == 0 ) x *= 1e-15; else if( strcmp( suffix, "a" ) == 0 ) x *= 1e-18; else if( strcmp( suffix, "dB" ) == 0 ) x = pow(10.0, x/20 ); else{ cerr << cmdName << ": " << suffix << " is an unrecognizable suffix.\n"; exit(-1); } } return x; } void printParameters( parameterStruct parms[] ){ int i; for( i=0; parms[i].string; ++i) cout << parms[i].string << "=" << *(parms[i].parameter) << '\n'; } void printFlags( flagStruct flags[] ){ int i; for( i=0; flags[i].string; ++i) cout << flags[i].string << "=" << *(flags[i].flag) << '\n'; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.