ftp.nice.ch/pub/next/science/physics/delta-sigma.s.tar.gz#/delta-sigma.src/utilities/parseArgs.c

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.