home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- int get_int (name, sig, var, argv)
-
- char *name; /* string to search for */
- int sig; /* number of significant characters */
- int *var; /* pointer to output variable */
- char *argv[]; /* argument vector pointer from main */
- {
- int argc, match;
- char *scan;
-
- if (name == NULL || name[0] == '\0' || --sig < 1) /* bounds check */
- return (-1);
-
- if (sig > strlen (name)) sig = strlen (name);
-
- for (argc = 0; argv[argc] != NULL; argc++) /* scan through arg list */
- {
- for (match=0; name[match] == argv[argc][match]; match++)
- ;
-
- if (match > sig) /* enough characters matched */
- {
- if (argv[argc][match] != '=') /* search for '=' */
- return (-2);
- else
- ++match;
-
- scan = match + argv[argc]; /* points to rhs of equals */
- if (scan[0] == '\0')
- return (-3);
-
- if (scan[0] == '-') /* the number could be negative */
- match = 1;
- else
- match = 0;
-
- while (isdigit (scan[match++])) /* check that all are digits */
- ;
- if (scan[match-1] != '\0')
- return (-4);
-
- sscanf (scan, "%d", var);
- while (argv[argc] != NULL) /* delete this parameter */
- {
- argv[argc] = argv[argc+1];
- ++argc;
- }
- --argc; /* back up one */
- break; /* break out of for loop */
- }
- }
- return (argc);
- }
-
- int get_float (name, sig, var, argv)
-
- char *name; /* string to search for */
- int sig; /* number of significant characters */
- float *var; /* pointer to output variable */
- char *argv[]; /* argument vector pointer from main */
- {
- int argc, match, loc, dec, neg, exp;
- char *scan;
-
- if (name == NULL || name[0] == '\0' || --sig < 1) /* bounds check */
- return (-1);
-
- if (sig > strlen (name)) sig = strlen (name);
-
- for (argc = 0; argv[argc] != NULL; argc++) /* scan through arg list */
- {
- for (match=0; name[match] == argv[argc][match]; match++)
- ;
-
- if (match > sig) /* enough characters matched */
- {
- if (argv[argc][match] != '=') /* search for '=' */
- return (-2);
- else
- ++match;
-
- scan = match + argv[argc]; /* points to rhs of equals */
- if (scan[0] == '\0')
- return (-3);
-
- /* parse it to be sure it's a float */
- loc = -1; /* parse cursor */
- exp = 0; /* exponent flag */
- dec = 0; /* decimal point flag */
- neg = 0; /* negative flag */
-
- while (scan[++loc] != '\0')
- if (scan[loc] == '-')
- ++neg;
- else if (scan[loc] == '.')
- ++dec;
- else if (scan[loc] == 'e' || scan[loc] == 'E')
- {
- ++exp;
- if (neg <= 1)
- neg = 0; /* you're allowed another minus here */
- }
- else if (!isdigit (scan[loc]))
- break; /* illegal character */
-
- if (scan[loc] != '\0')
- return (-4);
-
- if (neg > 1 || dec > 1 || exp > 1)
- return (-5);
-
- sscanf (scan, "%f", var);
- while (argv[argc] != NULL) /* delete this parameter */
- {
- argv[argc] = argv[argc+1];
- ++argc;
- }
- --argc; /* back up one */
- break; /* break out of for loop */
- }
- }
- return (argc);
- }
-
- int get_char (name, sig, var, argv)
-
- char *name; /* string to search for */
- int sig; /* number of significant characters */
- char *var; /* pointer to output variable */
- char *argv[]; /* argument vector pointer from main */
- {
- int argc, match, find, i, save, len;
- char *scan, *calloc ();
-
- if (name == NULL || name[0] == '\0' || --sig < 1 || var == NULL)
- return (-1); /* bounds check */
-
- if (sig > strlen (name)) sig = strlen (name);
-
- for (argc = 0; argv[argc] != NULL; argc++) /* scan through arg list */
- {
- for (match=0; name[match] == argv[argc][match]; match++)
- ;
-
- if (match > sig) /* enough characters matched */
- {
- if (argv[argc][match] != '=') /* search for '=' */
- return (-2);
- else
- ++match;
-
- scan = calloc (256, 1);
- strcpy (scan, match + argv[argc]); /* points to rhs of equals */
-
- find = 1;
- if (scan[0] == '"') /* start of macro string */
- {
- /* find the next arg that ends in " */
- for (find=argc; argv[find] != NULL; find++)
- {
- len = strlen (argv[find]) - 1;
- if (argv[find][len] == '"')
- break;
- }
- if (argv[find] == NULL) /* none was found */
- find = 1;
- else
- find = find - argc + 1;
- }
-
- for (i=1; i < find; i++) /* build the string */
- {
- strcat (scan, " ");
- strcat (scan, argv[argc+i]);
- }
-
- len = strlen (scan) - 1;
- if (scan[0] == '"' && scan[len] == '"')
- {
- scan[len] = '\0'; /* delete trailing " */
- ++scan; /* delete leading " */
- strcpy (var, scan);
- free (--scan);
- }
- else
- strcpy (var, scan);
-
- save = argc;
- for (i=0; i<find; i++)
- {
- argc = save;
- while (argv[argc] != NULL) /* delete this parameter */
- {
- argv[argc] = argv[argc+1];
- ++argc;
- }
- }
-
- --argc; /* back up one */
- break; /* break out of 'for' loop */
- }
- }
- return (argc);
- }
-
- int get_flag (name, sig, var, argv)
-
- char *name; /* string to search for */
- int sig; /* number of significant characters */
- int *var; /* pointer to output variable */
- char *argv[]; /* argument vector pointer from main */
- {
- int argc, match;
-
- *var = 0;
- if (name == NULL || name[0] == '\0' || --sig < 1) /* bounds check */
- return (-1);
-
- if (sig > strlen (name)) sig = strlen (name);
-
- for (argc = 0; argv[argc] != NULL; argc++) /* scan through arg list */
- {
- for (match=0; name[match] == argv[argc][match]; match++)
- if (name[match] == '\0' || argv[argc][match] == '\0')
- break;
-
- if (match > sig) /* enough characters matched */
- {
- if (argv[argc][match] != '\0') /* string too long */
- return (-2);
-
- while (argv[argc] != NULL) /* delete this parameter */
- {
- argv[argc] = argv[argc+1];
- ++argc;
- }
- --argc; /* back up one */
- *var = 1; /* indicate that flag was found */
- break; /* break out of for loop */
- }
- }
- return (argc);
- }
-
- main (argc, argv) /* test routine for above functions */
- int argc;
- char *argv[];
- {
- int i, i_test = 9999, g_test = 0;
- float f_test = 999.9;
- char c_test[80];
- strcpy (c_test, "9999");
-
- printf ("argument list is as follows: (%d parameters) \n", argc);
- for (i=0; i < argc; i++)
- printf ("'%s' ", argv[i]);
- printf ("\n\n");
-
- argc = get_int ("int", 3, &i_test, argv);
- if (argc >= 0)
- {
- printf ("\nafter call to GET_INT: (argc = %d) \n", argc);
- for (i=0; i<argc; i++)
- printf ("'%s' ", argv[i]);
- printf ("\nreturned value is %d\n", i_test);
- }
- else
- printf ("\n%d returned from GET_INT\n", argc);
-
- argc = get_float ("float", 3, &f_test, argv);
- if (argc >= 0)
- {
- printf ("\nafter call to GET_FLOAT: (argc = %d) \n", argc);
- for (i=0; i<argc; i++)
- printf ("'%s' ", argv[i]);
- printf ("\nreturned value is %0.4f\n", f_test);
- }
- else
- printf ("\n%d returned from GET_FLOAT\n", argc);
-
- argc = get_char ("char", 3, c_test, argv);
- if (argc >= 0)
- {
- printf ("\nafter call to GET_CHAR: (argc = %d) \n", argc);
- for (i=0; i<argc; i++)
- printf ("'%s' ", argv[i]);
- printf ("\nreturned value is '%s'\n", c_test);
- }
- else
- printf ("\n%d returned from GET_CHAR\n", argc);
-
- argc = get_flag ("flag", 3, &g_test, argv);
- if (argc >= 0)
- {
- printf ("\nafter call to GET_FLAG: (argc = %d) \n", argc);
- for (i=0; i<argc; i++)
- printf ("'%s' ", argv[i]);
- printf ("\nreturned value is '%d'\n", g_test);
- }
- else
- printf ("\n%d returned from GET_FLAG\n", argc);
-
- return (0);
- }
-