home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
- * TITEL : Argument-Parser *
- * *
- * DATEI : arg.c *
- * VERSION : 1.0 *
- * AUTOR : Joachim Eckart *
- * DATUM : 12/86 *
- ********************************************************************/
-
- #include "arg.h" /* Definitionen für Argument Parser */
-
- #define islower(c) ((c)>='a' && (c)<='z') /* Kleinbuchstabe ? */
- #define toupper(c) (islower(c) ? (c)-32 : (c)) /* mache gro₧ */
-
- typedef int (*PFIP)(); /* Typ definieren: Zeiger auf Funktion */
-
- /*******************************************************************/
- /* parse_args() */
- /*******************************************************************/
-
- parse_args(argc,argv,arg_tab,tsize)
- int argc; /* argc,argv wie aus Kommandozeile */
- char **argv;
- register ARGUMENTS *arg_tab; /* Zeiger auf 1.Element des Vektors */
- int tsize; /* Anzahl Elemente des Vektors */
-
- {
- register char **hargv; /* Hilfszeiger für argv */
- register int i; /* Zähler für argc */
- register int found; /* Boolean wird TRUE wenn Argument aus
- ARGUMENTS in argv gefunden oder wenn
- dieses optional ist */
- int requ_arg; /* Anzahl nötiger Argumente := tsize */
- short used[20]; /* Argument bereits benutzt ? */
-
- argc--; /* 0.tes Element irrelevant */
- requ_arg = tsize; /* Anzahl erforderlicher Argumente */
- /* alle Argumente noch nicht benutzt: */
- for(i = 0; i < 20; i++) used[i] = 0;
- /* SCHLEIFE über ARGUMENTE in arg_tab: */
- for(;--tsize >= 0;arg_tab++)
- {
- hargv = argv; /* Hilfszeiger auf args aus Kommandozeile */
- i = argc; /* Anzahl Argumente auf i kopieren */
- found = 0; /* gefunden auf FALSE setzen */
- /* WHILE LOOP solange Argumente vorhanden,
- aber kein passendes gefunden wurde: */
- while(i-- && !found)
- {
- hargv++; /* zeigt zu Beginn auf 2. argv */
- if(used[i] == 1) /* Argument bereits besetzt */
- continue; /* Argument wurde schon bearbeitet */
- /* SWITCH schalter: */
- switch(arg_tab->schalter)
- {
- case SCHALTER : /* SHALTER wird gesucht */
- if(**hargv == '-' &&
- toupper(*(*hargv + 1)) == toupper(arg_tab->s_char))
- { /* gefunden ! */
- /* SWITCH type: */
- switch(arg_tab->type)
- {
- case STRING : /* STRING SCHALTER mu₧ mehr
- als 2 Zeichen haben */
- if(strlen(*hargv) > 2)
- {
- *(char **)arg_tab->zeiger = *hargv + 2;
- /* Adresse des Strings wird mit
- Zeichenfolge ohne switch belegt */
- found = 1;
- }
- else
- return(MIS_STRING);
- break;
- case CHAR : /* CHAR SCHALTER hat genau
- 3 Zeichen zu haben */
- if(strlen(*hargv) == 3)
- {
- *(char *)arg_tab->zeiger = *(*hargv + 2);
- found = 1;
- }
- else
- return(MIS_CHAR);
- break;
- case BOOLEAN : /* BOOLEAN SCHALTER
- hat genau 2 Zeichen */
- if(strlen(*hargv) == 2)
- {
- *(int *)arg_tab->zeiger = 1;
- found = 1;
- }
- else
- return(WRONG_ARG);
- break;
- case INTEGER : /* INTEGER SCHALTER wie String,
- sollte aber Ziffern enth. */
- if(strlen(*hargv) > 2)
- {
- *(int *)arg_tab->zeiger = atoi(*hargv + 2);
- found = 1;
- }
- else
- return(MIS_INT);
- break;
- case FUNC : /* FUNKTIONS SCHALTER
- Die Funktion wird hier aufgerufen */
- if(strlen(*hargv) < 3) /* no Parameter */
- (* (PFIP)(arg_tab->zeiger) )("");
- else /* Parameter */
- (* (PFIP)(arg_tab->zeiger) )(*hargv + 2);
- found = 1;
- break;
- default : /* alles andere undefiniert */
- return(WRONG_ARG);
- } /* END SWITCH type */
-
- } /* END IF */
- break;
- case NO_SCHLT : /* Zeichenfolge ohne '-' gesucht */
- if(**hargv != '-') /* '-' ist nicht gefragt */
- {
- if(arg_tab->type == FUNC /* Funktion ? */
- || arg_tab->type == FORCE_FUNC) /* aufrufen */
- (* (PFIP)(arg_tab->zeiger) )(*hargv);
- else /* String */
- *(char **)arg_tab->zeiger = *hargv;
- found = 1; /* gefunden */
- }
- break;
- default : /* undefiniert */
- return(WRONG_ARG);
- break;
- } /* END SWITCH schalter */
- if(found)
- used[i] = 1; /* Argument als benutzt kennzeichnen */
- } /* END WHILE LOOP */
- if(!found /* FORCE_FUNC auch aufrufen, wenn nicht gefunden */
- && arg_tab->type == FORCE_FUNC
- && arg_tab->schalter == NO_SCHLT)
- {
- (* (PFIP)(arg_tab->zeiger) )("");
- found = 1; /* Funktion immer aufrufen */
- }
- if(found || arg_tab->option)
- requ_arg--; /* Argumentnachfrage befriedigt */
-
- } /* END SCHLEIFE über ARGUMENTS */
- return(requ_arg); /* sollte 0 sein, wenn alles ok */
- } /* END parse_args */
-
-