4 * Command line argument parser.
6 * Copyright 1996-2003 Glyph & Cog, LLC
15 #include "parseargs.h"
17 static ArgDesc *findArg(ArgDesc *args, char *arg);
18 static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]);
20 GBool parseArgs(ArgDesc *args, int *argc, char *argv[]) {
28 if (!strcmp(argv[i], "--")) {
30 for (j = i; j < *argc; ++j)
33 } else if ((arg = findArg(args, argv[i]))) {
34 if (!grabArg(arg, i, argc, argv))
43 void printUsage(char *program, char *otherArgs, ArgDesc *args) {
49 for (arg = args; arg->arg; ++arg) {
50 if ((w1 = strlen(arg->arg)) > w)
54 fprintf(stderr, "Usage: %s [options]", program);
56 fprintf(stderr, " %s", otherArgs);
57 fprintf(stderr, "\n");
59 for (arg = args; arg->arg; ++arg) {
60 fprintf(stderr, " %s", arg->arg);
61 w1 = 9 + w - strlen(arg->arg);
81 fprintf(stderr, "%-*s", w1, typ);
83 fprintf(stderr, ": %s", arg->usage);
84 fprintf(stderr, "\n");
88 static ArgDesc *findArg(ArgDesc *args, char *arg) {
91 for (p = args; p->arg; ++p) {
92 if (p->kind < argFlagDummy && !strcmp(p->arg, arg))
98 static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]) {
107 *(GBool *)arg->val = gTrue;
111 if (i + 1 < *argc && isInt(argv[i+1])) {
112 *(int *)arg->val = atoi(argv[i+1]);
120 if (i + 1 < *argc && isFP(argv[i+1])) {
122 char *theLocale = setlocale(LC_NUMERIC, "C");
123 *(double *)arg->val = atof(argv[i+1]);
124 setlocale(LC_NUMERIC, theLocale);
134 strncpy((char *)arg->val, argv[i+1], arg->size - 1);
135 ((char *)arg->val)[arg->size - 1] = '\0';
143 fprintf(stderr, "Internal error in arg table\n");
149 for (j = i; j < *argc; ++j)
155 GBool isInt(char *s) {
156 if (*s == '-' || *s == '+')
165 GBool isFP(char *s) {
168 if (*s == '-' || *s == '+')
171 while (isdigit(*s)) {
177 while (isdigit(*s)) {
181 if (n > 0 && (*s == 'e' || *s == 'E')) {
183 if (*s == '-' || *s == '+')
190 } while (isdigit(*s));