4 * Command line argument parser.
6 * Copyright 1996 Derek B. Noonburg
14 #include "parseargs.h"
16 static ArgDesc *findArg(ArgDesc *args, char *arg);
17 static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]);
19 GBool parseArgs(ArgDesc *args, int *argc, char *argv[]) {
27 if (!strcmp(argv[i], "--")) {
29 for (j = i; j < *argc; ++j)
32 } else if ((arg = findArg(args, argv[i]))) {
33 if (!grabArg(arg, i, argc, argv))
42 void printUsage(char *program, char *otherArgs, ArgDesc *args) {
48 for (arg = args; arg->arg; ++arg) {
49 if ((w1 = strlen(arg->arg)) > w)
53 fprintf(stderr, "Usage: %s [options]", program);
55 fprintf(stderr, " %s", otherArgs);
56 fprintf(stderr, "\n");
58 for (arg = args; arg->arg; ++arg) {
59 fprintf(stderr, " %s", arg->arg);
60 w1 = 9 + w - strlen(arg->arg);
80 fprintf(stderr, "%-*s", w1, typ);
82 fprintf(stderr, ": %s", arg->usage);
83 fprintf(stderr, "\n");
87 static ArgDesc *findArg(ArgDesc *args, char *arg) {
90 for (p = args; p->arg; ++p) {
91 if (p->kind < argFlagDummy && !strcmp(p->arg, arg))
97 static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]) {
106 *(GBool *)arg->val = gTrue;
110 if (i + 1 < *argc && isInt(argv[i+1])) {
111 *(int *)arg->val = atoi(argv[i+1]);
119 if (i + 1 < *argc && isFP(argv[i+1])) {
120 *(double *)arg->val = atof(argv[i+1]);
129 strncpy((char *)arg->val, argv[i+1], arg->size - 1);
130 ((char *)arg->val)[arg->size - 1] = '\0';
138 fprintf(stderr, "Internal error in arg table\n");
144 for (j = i; j < *argc; ++j)
150 GBool isInt(char *s) {
151 if (*s == '-' || *s == '+')
160 GBool isFP(char *s) {
163 if (*s == '-' || *s == '+')
166 while (isdigit(*s)) {
172 while (isdigit(*s)) {
176 if (n > 0 && (*s == 'e' || *s == 'E')) {
178 if (*s == '-' || *s == '+')
185 } while (isdigit(*s));