home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------
- *
- * getargs.c
- *
- * command line argument parser
- *
- * by J. Alan Eldridge
- *
- * this code is placed in the public domain
- *
- * 07/18/89 jae fixed bug in parsing integer args of form -i 2
- * 07/28/89 jae made it so an arg appearing more than once is error
- * 04/09/90 jae made multiple character options, added function
- * pointer to validate arg when it is found
- *
- *----------------------------------------------------------*/
-
- #include <ctype.h>
- #include <stddef.h>
-
- #include "getargs.h"
-
- int
- _getargs(acp, av, nargs, argsp, ignorebad)
- int *acp;
- char **av;
- int nargs;
- CMD_ARG *argsp;
- int ignorebad;
- {
- int ac = *acp;
- int argn,
- an = 0,
- slide,
- n;
-
- while (an < ac) {
- if (av[an][0] == '-' || av[an][0] == '+') {
- int len;
-
- for (argn = 0; argn < nargs; argn++) {
- if ((len = strlen(argsp[argn].optstr)) < 2)
- return -2; /* pgmer error */
- if (!strncmp(argsp[argn].optstr, av[an], len))
- break;
- }
- if (argn == nargs) {
- if (ignorebad) {
- an++;
- continue;
- } else
- return -1;
- }
- if (argsp[argn].argtype & ARG_FOUND)
- return -1;
- if (argsp[argn].argtype == ARG_BOOL) {
- if (len == strlen(av[an])) {
- *ARG_IP(argsp[argn].ptr) = !(*ARG_IP(argsp[argn].ptr));
- slide = 1;
- } else
- return -1;
- } else if ((argsp[argn].argtype & ~ARG_REQD) == ARG_INT) {
- if (av[an][len]) {
- if (isdigit(av[an][len]) || av[an][len] == '-')
- *ARG_IP(argsp[argn].ptr) = atoi(av[an] + len);
- else
- return -1;
- slide = 1;
- } else {
- if (an + 1 == ac)
- return -1;
- if (isdigit(av[an + 1][0]) || av[an + 1][0] == '-')
- *ARG_IP(argsp[argn].ptr) = atoi(av[an + 1]);
- else
- return -1;
- slide = 2;
- }
- } else if ((argsp[argn].argtype & ~ARG_REQD) == ARG_STR) {
- if (av[an][len]) {
- *ARG_CPP(argsp[argn].ptr) = av[an] + len;
- slide = 1;
- } else {
- if (an + 1 == ac)
- return -1;
- *ARG_CPP(argsp[argn].ptr) = av[an + 1];
- slide = 2;
- }
- }
- argsp[argn].argtype |= ARG_FOUND;
- argsp[argn].argtype &= ~ARG_REQD;
- if (argsp[argn].valfun != ARG_NOFUNC
- && argsp[argn].valfun(argsp[argn].optstr,
- argsp[argn].ptr) != 0)
- return -1;
- ac -= slide;
- for (n = an; n < ac; n++)
- av[n] = av[n + slide];
- } else {
- an++;
- }
- }
- for (argn = 0; argn < nargs; argn++) {
- if (argsp[argn].argtype & ARG_REQD)
- return -1;
- }
- *acp = ac;
- return 0;
- }
-
- int
- getargs(acp, av, nargs, argsp)
- int *acp;
- char **av;
- int nargs;
- CMD_ARG *argsp;
- {
- return _getargs(acp, av, nargs, argsp, 0);
- }
-
- int
- argfound(
- CMD_ARG *arr,
- int nopts,
- char *opt)
- {
- int n;
-
- for (n = 0; n < nopts; n++)
- if (!strcmp(arr[n].optstr,opt))
- break;
- if (n < nopts) {
- arr[n].argtype &= ~ARG_REQD;
- arr[n].argtype |= ARG_FOUND;
- return 0;
- } else
- return -1;
- }
-
- void
- argfixbl(
- char *str,
- int c)
- {
- while (*str) {
- if (*str == c)
- *str = ' ';
- str++;
- }
- }
-
-