Doxygen Source Code Documentation
parse_args.c File Reference
#include "stdlib.h"#include <stdio.h>#include <stddef.h>#include "string.h"#include "parse.h"#include <math.h>#include <ctype.h>Go to the source code of this file.
Defines | |
| #define | MAX_INPUT_SIZE 1000 |
| #define | arg_prefix(x) ((x).prefix) |
| #define | arg_string(x) ((x).string) |
| #define | arg_flags(x) ((x).flags) |
| #define | arg_count(x) ((x).count) |
| #define | arg_result_type(x) ((x).result_type) |
| #define | arg_result_ptr(x) ((x).result_ptr) |
| #define | arg_table_size(x) ((x).table_size) |
| #define | TRUE 1 |
| #define | FALSE 0 |
Typedefs | |
| typedef int | boolean |
Functions | |
| int arg_parse | Argdcl ((char *, arg_info *)) |
| char *lower_string | Argdcl ((char *, char *)) |
| int match | Argdcl ((char *, char *, arg_info *, boolean)) |
| int put_one_arg | Argdcl ((int, char *, char **, char *, char *)) |
| boolean | parse_args (int argc, char **argv, arg_info *table, int entries, char **others, int other_count) |
| boolean | arg_verify (char **argv, arg_info *table, int entries) |
| int | match_table (register char *norm_input, arg_info *table, int entries, boolean use_prefix, int *length) |
| int | match (char *norm_input, char *low_input, arg_info *entry, boolean use_prefix) |
| char * | lower_string (char *dest, char *src) |
| int | arg_parse (char *str, arg_info *entry) |
| int | put_one_arg (int type, char *str, char **store, char *prefix, char *string) |
| void | init_store (arg_info *table, int entries) |
Variables | |
| char * | this_program = "" |
| int | badargs |
Define Documentation
|
|
Definition at line 78 of file parse_args.c. Referenced by arg_parse(), arg_verify(), init_store(), and parse_args(). |
|
|
Definition at line 77 of file parse_args.c. Referenced by arg_verify(), and match(). |
|
|
Definition at line 75 of file parse_args.c. Referenced by arg_parse(), and match(). |
|
|
Definition at line 80 of file parse_args.c. Referenced by arg_parse(), arg_verify(), init_store(), and parse_args(). |
|
|
Definition at line 79 of file parse_args.c. Referenced by arg_parse(), and arg_verify(). |
|
|
Definition at line 76 of file parse_args.c. Referenced by arg_parse(), and match(). |
|
|
Definition at line 81 of file parse_args.c. Referenced by arg_verify(), and parse_args(). |
|
|
Definition at line 87 of file parse_args.c. Referenced by match(), and parse_args(). |
|
|
Definition at line 73 of file parse_args.c. Referenced by match(), and match_table(). |
|
|
Definition at line 84 of file parse_args.c. Referenced by arg_verify(), and parse_args(). |
Typedef Documentation
|
|
Definition at line 89 of file parse_args.c. |
Function Documentation
|
||||||||||||
|
Definition at line 430 of file parse_args.c. References arg_count, arg_prefix, arg_result_ptr, arg_result_type, arg_string, P_ONE_ARG, and put_one_arg(). Referenced by parse_args().
00432 {
00433 int length = 0;
00434
00435 if (arg_count (*entry) == P_ONE_ARG) {
00436 char **store = (char **) arg_result_ptr (*entry);
00437
00438 length = put_one_arg (arg_result_type (*entry), str, store,
00439 arg_prefix (*entry), arg_string (*entry));
00440
00441 } /* if (arg_count == P_ONE_ARG) */
00442 else { /* Must be a table of arguments */
00443 char **store = (char **) arg_result_ptr (*entry);
00444
00445 if (store) {
00446 while (*store)
00447 store++;
00448
00449 length = put_one_arg(arg_result_type (*entry), str, store++,
00450 arg_prefix (*entry), arg_string (*entry));
00451
00452 *store = (char *) NULL;
00453 } /* if (store) */
00454 } /* else */
00455
00456 return length;
00457 } /* arg_parse */
|
|
||||||||||||||||
|
Definition at line 207 of file parse_args.c. References arg, arg_count, arg_flags, arg_result_ptr, arg_result_type, arg_table_size, badargs, i, P_CASE_INSENSITIVE, P_DOUBLE, P_INFINITE_ARGS, P_NO_ARGS, P_ONE_ARG, P_REQUIRED_PREFIX, this_program, and TRUE. Referenced by parse_args().
00209 {
00210 int i;
00211 char *this_program = "";
00212
00213 if (argv)
00214 this_program = argv[0];
00215
00216 for (i = 0; i < entries; i++) {
00217 arg_info *arg = &table[i];
00218
00219 /* Check the argument flags */
00220
00221 if (arg_flags (*arg) & ~(P_CASE_INSENSITIVE | P_REQUIRED_PREFIX)) {
00222 fprintf (stderr, "%s [arg_verify]: too many ", this_program);
00223 fprintf (stderr, "flags in entry %d: '%x' (hex)\n", i,
00224 arg_flags (*arg));
00225 badargs++;
00226 } /* if */
00227
00228 /* Check the argument count */
00229
00230 { int count = arg_count (*arg);
00231
00232 if (count != P_NO_ARGS && count != P_ONE_ARG && count !=
00233 P_INFINITE_ARGS) {
00234 fprintf (stderr, "%s [arg_verify]: invalid ", this_program);
00235 fprintf (stderr, "argument count in entry %d: '%d'\n", i,
00236 count);
00237 badargs++;
00238 } /* if count != P_NO_ARGS ... */
00239
00240 /* Check the result field; want to be able to store results */
00241
00242 else
00243 if (arg_result_ptr (*arg) == (int *) NULL) {
00244 fprintf (stderr, "%s [arg_verify]: ", this_program);
00245 fprintf (stderr, "no argument storage given for ");
00246 fprintf (stderr, "entry %d\n", i);
00247 badargs++;
00248 } /* if arg_result_ptr */
00249 }
00250
00251 /* Check the argument type */
00252
00253 { int type = arg_result_type (*arg);
00254
00255 if (type < P_STRING || type > P_DOUBLE) {
00256 fprintf(stderr,
00257 "%s [arg_verify]: bad arg type in entry %d: '%d'\n",
00258 this_program, i, type);
00259 badargs++;
00260 }
00261 }
00262
00263 /* Check table size */
00264
00265 { int size = arg_table_size (*arg);
00266
00267 if (arg_count (*arg) == P_INFINITE_ARGS && size < 1) {
00268 fprintf (stderr, "%s [arg_verify]: bad ", this_program);
00269 fprintf (stderr, "table size in entry %d: '%d'\n", i,
00270 size);
00271 badargs++;
00272 } /* if (arg_count == P_INFINITE_ARGS && size < 1) */
00273 }
00274
00275 } /* for i = 0 */
00276
00277 return TRUE;
00278 } /* arg_verify */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
Definition at line 545 of file parse_args.c. References arg_count, arg_result_ptr, and P_INFINITE_ARGS. Referenced by parse_args().
00547 {
00548 int index;
00549
00550 for (index = 0; index < entries; index++)
00551 if (arg_count (table[index]) == P_INFINITE_ARGS) {
00552 char **place = (char **) arg_result_ptr (table[index]);
00553
00554 if (place)
00555 *place = (char *) NULL;
00556 } /* if arg_count == P_INFINITE_ARGS */
00557
00558 } /* init_store */
|
|
||||||||||||
|
Definition at line 407 of file parse_args.c. References c. Referenced by match(), and match_table().
|
|
||||||||||||||||||||
|
Definition at line 346 of file parse_args.c. References arg_flags, arg_prefix, arg_string, FALSE, lower_string(), MAX_INPUT_SIZE, P_CASE_INSENSITIVE, and P_REQUIRED_PREFIX.
00348 {
00349 char *norm_prefix = arg_prefix (*entry);
00350 char *norm_string = arg_string (*entry);
00351 boolean prefix_match = FALSE, string_match = FALSE;
00352 int result = 0;
00353
00354 /* Buffers for the lowercased versions of the strings being compared.
00355 These are used when the switch is to be case insensitive */
00356
00357 static char low_prefix[MAX_INPUT_SIZE];
00358 static char low_string[MAX_INPUT_SIZE];
00359 int prefix_length = strlen (norm_prefix);
00360 int string_length = strlen (norm_string);
00361
00362 /* Pointers for the required strings (lowered or nonlowered) */
00363
00364 register char *input, *prefix, *string;
00365
00366 /* FUNCTION BODY */
00367
00368 /* Use the appropriate strings to handle case sensitivity */
00369
00370 if (arg_flags (*entry) & P_CASE_INSENSITIVE) {
00371 input = low_input;
00372 prefix = lower_string (low_prefix, norm_prefix);
00373 string = lower_string (low_string, norm_string);
00374 } else {
00375 input = norm_input;
00376 prefix = norm_prefix;
00377 string = norm_string;
00378 } /* else */
00379
00380 /* First, check the string formed by concatenating the prefix onto the
00381 switch string, but only when the prefix is not being ignored */
00382
00383 if (use_prefix && prefix != NULL && *prefix != '\0')
00384 prefix_match = (strncmp (input, prefix, prefix_length) == 0) &&
00385 (strncmp (input + prefix_length, string, string_length) == 0);
00386
00387 /* Next, check just the switch string, if that's allowed */
00388
00389 if (!use_prefix && (arg_flags (*entry) & P_REQUIRED_PREFIX) == 0)
00390 string_match = strncmp (input, string, string_length) == 0;
00391
00392 if (prefix_match)
00393 result = prefix_length + string_length;
00394 else if (string_match)
00395 result = string_length;
00396
00397 return result;
00398 } /* match */
|
|
||||||||||||||||||||||||
|
Definition at line 295 of file parse_args.c. References i, lower_string(), match(), and MAX_INPUT_SIZE. Referenced by parse_args().
00297 {
00298 char low_input[MAX_INPUT_SIZE];
00299 register int i;
00300 int best_index = -1, best_length = 0;
00301
00302 /* FUNCTION BODY */
00303
00304 (void) lower_string (low_input, norm_input);
00305
00306 for (i = 0; i < entries; i++) {
00307 int this_length = match(norm_input, low_input, &table[i], use_prefix);
00308
00309 if (this_length > best_length) {
00310 best_index = i;
00311 best_length = this_length;
00312 } /* if (this_length > best_length) */
00313 } /* for (i = 0) */
00314
00315 if (best_index > -1 && length != (int *) NULL)
00316 *length = best_length;
00317
00318 return best_index;
00319 } /* match_table */
|
|
||||||||||||||||||||||||||||
|
Definition at line 111 of file parse_args.c. References arg_count, arg_parse(), arg_result_ptr, arg_table_size, arg_verify(), argc, badargs, FALSE, init_store(), match_table(), P_NO_ARGS, this_program, and TRUE. Referenced by main().
00113 {
00114 boolean result;
00115
00116 if (argv)
00117 this_program = argv[0];
00118
00119 /* Check the validity of the table and its parameters */
00120
00121 result = arg_verify (argv, table, entries);
00122
00123 /* Initialize the storage values */
00124
00125 init_store (table, entries);
00126
00127 if (result) {
00128 boolean use_prefix = TRUE;
00129 char *argv0;
00130
00131 argc--;
00132 argv0 = *++argv;
00133 while (argc) {
00134 int index, length;
00135
00136 index = match_table (*argv, table, entries, use_prefix, &length);
00137 if (index < 0) {
00138
00139 /* The argument doesn't match anything in the table */
00140
00141 if (others) {
00142
00143 if (*argv > argv0)
00144 *--*argv = '-'; /* complain at invalid flag */
00145
00146 if (other_count > 0) {
00147 *others++ = *argv;
00148 other_count--;
00149 } else {
00150 fprintf (stderr, "%s: too many parameters: ",
00151 this_program);
00152 fprintf (stderr, "'%s' ignored\n", *argv);
00153 badargs++;
00154 } /* else */
00155 } /* if (others) */
00156 argv0 = *++argv;
00157 argc--;
00158 } else {
00159
00160 /* A match was found */
00161
00162 if (length >= strlen (*argv)) {
00163 argc--;
00164 argv0 = *++argv;
00165 use_prefix = TRUE;
00166 } else {
00167 (*argv) += length;
00168 use_prefix = FALSE;
00169 } /* else */
00170
00171 /* Parse any necessary arguments */
00172
00173 if (arg_count (table[index]) != P_NO_ARGS) {
00174
00175 /* Now length will be used to store the number of parsed characters */
00176
00177 length = arg_parse(*argv, &table[index]);
00178 if (*argv == NULL)
00179 argc = 0;
00180 else if (length >= strlen (*argv)) {
00181 argc--;
00182 argv0 = *++argv;
00183 use_prefix = TRUE;
00184 } else {
00185 (*argv) += length;
00186 use_prefix = FALSE;
00187 } /* else */
00188 } /* if (argv_count != P_NO_ARGS) */
00189 else
00190 *arg_result_ptr(table[index]) =
00191 arg_table_size(table[index]);
00192 } /* else */
00193 } /* while (argc) */
00194 } /* if (result) */
00195
00196 return result;
00197 } /* parse_args */
|
|
||||||||||||||||||||||||
|
Definition at line 469 of file parse_args.c. References badargs, L, P_CHAR, P_DOUBLE, P_FILE, P_FLOAT, P_INT, P_LONG, P_NEW_FILE, P_OLD_FILE, P_SHORT, P_STRING, and this_program. Referenced by arg_parse().
00471 {
00472 int length = 0;
00473 long L;
00474
00475 if (store) {
00476 switch (type) {
00477 case P_STRING:
00478 case P_FILE:
00479 case P_OLD_FILE:
00480 case P_NEW_FILE:
00481 if (str == NULL) {
00482 fprintf(stderr, "%s: Missing argument after '%s%s'\n",
00483 this_program, prefix, string);
00484 length = 0;
00485 badargs++;
00486 }
00487 else
00488 length = strlen(*store = str);
00489 break;
00490 case P_CHAR:
00491 *((char *) store) = *str;
00492 length = 1;
00493 break;
00494 case P_SHORT:
00495 L = atol(str);
00496 *(short *)store = (short) L;
00497 if (L != *(short *)store) {
00498 fprintf(stderr,
00499 "%s%s parameter '%ld' is not a SHORT INT (truncating to %d)\n",
00500 prefix, string, L, *(short *)store);
00501 badargs++;
00502 }
00503 length = strlen (str);
00504 break;
00505 case P_INT:
00506 L = atol(str);
00507 *(int *)store = (int)L;
00508 if (L != *(int *)store) {
00509 fprintf(stderr,
00510 "%s%s parameter '%ld' is not an INT (truncating to %d)\n",
00511 prefix, string, L, *(int *)store);
00512 badargs++;
00513 }
00514 length = strlen (str);
00515 break;
00516 case P_LONG:
00517 *(long *)store = atol(str);
00518 length = strlen (str);
00519 break;
00520 case P_FLOAT:
00521 *((float *) store) = (float) atof(str);
00522 length = strlen (str);
00523 break;
00524 case P_DOUBLE:
00525 *((double *) store) = (double) atof(str);
00526 length = strlen (str);
00527 break;
00528 default:
00529 fprintf (stderr, "put_one_arg: bad type '%d'\n", type);
00530 badargs++;
00531 break;
00532 } /* switch */
00533 } /* if (store) */
00534
00535 return length;
00536 } /* put_one_arg */
|
Variable Documentation
|
|
Definition at line 98 of file parse_args.c. Referenced by arg_verify(), parse_args(), and put_one_arg(). |
|
|
Definition at line 92 of file parse_args.c. Referenced by arg_verify(), parse_args(), and put_one_arg(). |