home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 June
/
SIMTEL_0692.cdr
/
msdos
/
c
/
help.arc
/
GETARGS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-03-10
|
5KB
|
264 lines
/*
*
* Getargs.c
*
*!AU: Michael A. Shiels
*!CD: 21-May-86
*!FR: Dr. Dobb's May 1985
*
*/
#define GETARGS_C
#define LINT_ARGS
#include <stdio.h>
#include <stdlib.h>
#include "masdos.h"
#include "maserr.h"
#include "getargs.h"
extern void usage( void );
extern int stoi( char ** );
typedef int (*PFI)();
char ARG_Switch = '/';
int ARG_ICase = 0;
static char getsoptb[100];
static char *setarg( argp, linep )
ARG *argp ;
char *linep ;
{
++linep ;
switch( argp->type )
{
case ARG_INTEGER :
*argp->variable = stoi( &linep ) ;
break ;
case ARG_FBOOLEAN :
*argp->variable = 1;
break ;
case ARG_TBOOLEAN :
*argp->variable = 0;
break ;
case ARG_SBOOLEAN :
*argp->variable = ( *argp->variable ? 0 : 1 );
break ;
case ARG_CHARACTER :
*argp->variable = *linep++ ;
break ;
case ARG_STRING :
*(char **)argp->variable = linep ;
linep = "" ;
break;
case ARG_PROCESS :
(* (PFI)(argp->variable) )( linep );
linep = "";
break;
default :
fprintf( stderr, "GetArgs: Internal Error: Bad Argument Type\n" );
break ;
}
return( linep ) ;
}
static ARG *findarg( c, tabp, tabsize )
int c, tabsize ;
ARG *tabp ;
{
for( ; --tabsize >= 0 ; tabp++ )
{
if( ARG_ICase && toupper(tabp->arg) == toupper(c) )
return( tabp );
if( tabp->arg == c )
return( tabp );
}
return( NULL );
}
static pr_usage( tabp, tabsize )
ARG *tabp;
int tabsize;
{
for( ; --tabsize >= 0 ; tabp++ )
{
switch( tabp->type )
{
case ARG_INTEGER :
fprintf(stderr, "%c%c<num> %-40s (value is ",
ARG_Switch, tabp->arg, tabp->errmsg) ;
fprintf(stderr, "%-5d)\n", *(tabp->variable) ) ;
break ;
case ARG_TBOOLEAN :
fprintf(stderr, "%c%c T %-40s (value is ",
ARG_Switch, tabp->arg, tabp->errmsg) ;
fprintf(stderr, "%-5s)\n", *(tabp->variable)
? "True" : "False") ;
break ;
case ARG_SBOOLEAN :
fprintf(stderr, "%c%c S %-40s (value is ",
ARG_Switch, tabp->arg, tabp->errmsg) ;
fprintf(stderr, "%-5s)\n", *(tabp->variable)
? "True" : "False") ;
break ;
case ARG_FBOOLEAN :
fprintf(stderr, "%c%c F %-40s (value is ",
ARG_Switch, tabp->arg, tabp->errmsg) ;
fprintf(stderr, "%-5s)\n", *(tabp->variable)
? "True" : "False") ;
break ;
case ARG_CHARACTER :
fprintf(stderr, "%c%c<c> %-40s (value is ",
ARG_Switch, tabp->arg, tabp->errmsg) ;
fprintf(stderr, "%-5c)\n", *(tabp->variable) ) ;
break ;
case ARG_STRING :
fprintf(stderr, "%c%c<str> %-40s (value is ",
ARG_Switch, tabp->arg, tabp->errmsg) ;
fprintf(stderr, "<%s>)\n",
*(char **)tabp->variable) ;
break ;
case ARG_PROCESS :
fprintf(stderr, "%c%c<str> %-40s\n",
ARG_Switch, tabp->arg, tabp->errmsg);
break;
}
}
}
#define ARG_ERRMSG "Illegal argument <%c>. Legal arguments are:\n\n"
int getargs( argc, argv, tabp, tabsize )
int argc, tabsize ;
char **argv ;
ARG *tabp ;
{
register int nargc ;
register char **nargv, *p ;
register ARG *argp ;
char buf[2], *bufp = buf;
if( (bufp = getenv("SWITCHAR")) )
ARG_Switch = *bufp;
nargc = 1 ;
for( nargv = ++argv ; --argc > 0 ; argv++ )
{
if( **argv != ARG_Switch || !strcmp( *argv, "-" ) )
{
*nargv++ = *argv ;
nargc++ ;
}
else
{
p = ( *argv ) + 1 ;
while( *p )
{
if( *p == ARG_Switch )
p++;
else if( argp = findarg( *p, tabp, tabsize ) )
{
p = setarg( argp, p ) ;
}
else
{
usage();
fprintf( stderr, ARG_ERRMSG, *p );
pr_usage( tabp, tabsize );
exit( E_USAGE );
}
}
}
}
return nargc ;
}
void getopts( tabp, tabsize, opts )
int tabsize ;
ARG *tabp ;
char *opts;
{
register char *p ;
register ARG *argp ;
char *buf, *bufp;
if( (buf = getmenv(opts)) )
{
while( bufp = next( &buf, ',', -1 ) )
{
p = ( bufp );
while( *p )
{
if( argp = findarg( *p, tabp, tabsize ) )
{
p = setarg( argp, p ) ;
}
else
{
usage();
fprintf( stderr, ARG_ERRMSG, *p );
pr_usage( tabp, tabsize );
exit( E_USAGE );
}
}
}
}
}
void getsopts( tabp, tabsize, file )
int tabsize ;
ARG *tabp ;
char *file;
{
register char *p ;
register ARG *argp ;
char *buf = getsoptb, *bufp = getsoptb;
FILE *fp = NULL;
strcat( getsoptb, getmenv("GETSOPTS") );
strcat( getsoptb, file );
if( (fp = fopen(getsoptb, "r")) )
{
if( !getl( getsoptb, 255, fp) )
{
fclose( fp );
return;
}
else
{
while( bufp = next( &buf, ',', -1 ) )
{
p = ( bufp );
while( *p )
{
if( argp = findarg( *p, tabp, tabsize ) )
p = setarg( argp, p );
else
{
usage();
fprintf( stderr, ARG_ERRMSG, *p );
pr_usage( tabp, tabsize );
exit( E_USAGE );
}
}
}
}
}
}