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.