/* option2.h
========= */
/* Sessai Special version of option.h(c) */
/*
$Log: option.c,v $
Revision 1.2 1997/04/25 10:40:45 root
Added check for null pointer on opterr.
Revision 1.1 1997/04/25 10:22:32 root
Initial revision
*/
/*
$Revision: 1.2 $
*/
#if 0
// #include <stdio.h>
// #include <string.h>
// #include <stdlib.h>
// #include "option2.h"
#endif
char *scan_entry2(FILE *file) {
int c=1;
int chr;
char *parse=NULL;
if ((parse=malloc(256)) ==NULL) return NULL;
do {
/* skip whitespace */
while ( ((chr=fgetc(file)) != EOF) &&
( (chr==' ') || (chr == '\n') || (chr== '\t') ) );
if (chr=='#') { /* skip this line its a comment */
while ( ((chr=fgetc(file)) !=EOF) && (chr !='\n'));
chr='#';
}
} while (chr=='#');
parse[0]=(char) chr;
while ( (c<256) && ((chr=fgetc(file)) != EOF) &&
(chr !=' ') && (chr != '\n') && (chr != '\t') ) {
parse[c]=(char) chr;
c++;
}
if ((chr==EOF) && (c==1)) {
free(parse);
return NULL;
}
parse[c]=0;
parse=realloc(parse,c+1);
return parse;
}
int process_option2 (int argc,char *argv[], struct option *opt,
void (*opterr)(char *)) {
int i=1;
while (i<argc) {
int j=0;
if (argv[i][0] !='-') {
if (i==argc-1) return i;
fprintf(stderr,
"illeagal argument \'%s\' found, skip it!\n",&argv[i][0]);
if (opterr !=NULL) (*opterr)(&argv[i][0]);
i++;
continue;
}
while ( (opt[j].optname !=NULL) &&
(strcmp(&argv[i][1],opt[j].optname) !=0) ) j++;
if (opt[j].optname==NULL) {
fprintf(stderr,
"illeagal option \'%s\' found, skip it!\n",&argv[i][0]);
if (opterr !=NULL) (*opterr)(&argv[i][1]);
i++;
continue;
}
if (( (opt[j].type=='s')||(opt[j].type=='l')||(opt[j].type=='f')
||(opt[j].type=='d')||(opt[j].type=='t')) && ((i+1) >=argc)) {
fprintf(stderr,
"option \'%s\' has no argument!, skip it!\n",&argv[i][0]);
if (opterr !=NULL) (*opterr)(&argv[i][0]);
i++;
continue;
}
i++;
// opt[j].set=1;
opt[j].set++;
switch (opt[j].type) {
case 's' : /* short integer */
if (opt[j].ptr !=NULL) {
if ((argv[i][0]=='-')&&((short int) atoi(argv[i])==0)) {
fprintf(stderr,
"option \'%s\' looks no argument!, skip it!\n"
,&argv[i-1][0]);
opt[j].set--;
continue;
}
*( (short int *) opt[j].ptr)=(short int) atoi(argv[i]);
}
i++;
break;
case 'l' : /* long integer */
if (opt[j].ptr !=NULL) {
if ((argv[i][0]=='-')&&((long int) atol(argv[i])==0L)) {
fprintf(stderr,
"option \'%s\' looks no argument!, skip it!\n"
,&argv[i-1][0]);
opt[j].set--;
continue;
}
*( (long int *) opt[j].ptr)=(long int) atol(argv[i]);
}
i++;
break;
case 'f' : /* float */
if (opt[j].ptr !=NULL) {
if ((argv[i][0]=='-')&&((float) atof(argv[i])==0.0)) {
fprintf(stderr,
"option \'%s\' looks no argument!, skip it!\n"
,&argv[i-1][0]);
opt[j].set--;
continue;
}
*( (float *) opt[j].ptr)=(float) atof(argv[i]);
}
i++;
break;
case 'd' : /* double */
if (opt[j].ptr !=NULL) {
if ((argv[i][0]=='-')&&((double) atof(argv[i])==0.0)) {
fprintf(stderr,
"option \'%s\' looks no argument!, skip it!\n"
,&argv[i-1][0]);
opt[j].set--;
continue;
}
*( (double *) opt[j].ptr)=(double) atof(argv[i]);
}
i++;
break;
case 't' : /* string */
// if (opt[j].ptr !=NULL) strcpy(opt[j].ptr,argv[i]);
if (opt[j].ptr !=NULL) strncpy(opt[j].ptr,argv[i],255);
// opt[j].set=i; /* will always be > 1 - so no problem */
i++;
break;
default :
if (opt[j].ptr !=NULL)
*( (short int *) opt[j].ptr)=*( (short int *) opt[j].ptr)+1;
break;
}
}
return i;
}
void process_file2(FILE *fp,struct option *opt,void (*opterr)(char *)) {
int fargc=1;
char *fargv[256];
while ((fargc<256) && ((fargv[fargc]=scan_entry2(fp)) !=NULL)) fargc++;
process_option2(fargc,fargv,opt,opterr);
}
/* a new function by Sessai */
int optset (char *optname, struct option *opt) {
int j=0;
while ( (opt[j].optname !=NULL) &&
(strcmp(optname,opt[j].optname) !=0) ) j++;
if (opt[j].optname==NULL) return 0;
return opt[j].set;
}