4
* Command line argument parser.
6
* Copyright 1996-2002 Glyph & Cog, LLC
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));