summaryrefslogtreecommitdiffstats
path: root/usr.bin/f2c/parse_args.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/f2c/parse_args.c')
-rw-r--r--usr.bin/f2c/parse_args.c502
1 files changed, 0 insertions, 502 deletions
diff --git a/usr.bin/f2c/parse_args.c b/usr.bin/f2c/parse_args.c
deleted file mode 100644
index f978383..0000000
--- a/usr.bin/f2c/parse_args.c
+++ /dev/null
@@ -1,502 +0,0 @@
-/****************************************************************
-Copyright 1990 by AT&T Bell Laboratories and Bellcore.
-
-Permission to use, copy, modify, and distribute this software
-and its documentation for any purpose and without fee is hereby
-granted, provided that the above copyright notice appear in all
-copies and that both that the copyright notice and this
-permission notice and warranty disclaimer appear in supporting
-documentation, and that the names of AT&T Bell Laboratories or
-Bellcore or any of their entities not be used in advertising or
-publicity pertaining to distribution of the software without
-specific, written prior permission.
-
-AT&T and Bellcore disclaim all warranties with regard to this
-software, including all implied warranties of merchantability
-and fitness. In no event shall AT&T or Bellcore be liable for
-any special, indirect or consequential damages or any damages
-whatsoever resulting from loss of use, data or profits, whether
-in an action of contract, negligence or other tortious action,
-arising out of or in connection with the use or performance of
-this software.
-****************************************************************/
-
-/* parse_args
-
- This function will parse command line input into appropriate data
- structures, output error messages when appropriate and provide some
- minimal type conversion.
-
- Input to the function consists of the standard argc,argv
- values, and a table which directs the parser. Each table entry has the
- following components:
-
- prefix -- the (optional) switch character string, e.g. "-" "/" "="
- switch -- the command string, e.g. "o" "data" "file" "F"
- flags -- control flags, e.g. CASE_INSENSITIVE, REQUIRED_PREFIX
- arg_count -- number of arguments this command requires, e.g. 0 for
- booleans, 1 for filenames, INFINITY for input files
- result_type -- how to interpret the switch arguments, e.g. STRING,
- CHAR, FILE, OLD_FILE, NEW_FILE
- result_ptr -- pointer to storage for the result, be it a table or
- a string or whatever
- table_size -- if the arguments fill a table, the maximum number of
- entries; if there are no arguments, the value to
- load into the result storage
-
- Although the table can be used to hold a list of filenames, only
- scalar values (e.g. pointers) can be stored in the table. No vector
- processing will be done, only pointers to string storage will be moved.
-
- An example entry, which could be used to parse input filenames, is:
-
- "-", "o", 0, oo, OLD_FILE, infilenames, INFILE_TABLE_SIZE
-
-*/
-
-#include <stdio.h>
-#ifndef NULL
-/* ANSI C */
-#include <stddef.h>
-#endif
-#include "parse.h"
-#include <math.h> /* For atof */
-#include <ctype.h>
-#include "defs.h"
-
-#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)
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-typedef int boolean;
-
-
-char *lower_string (/* char [], char * */);
-
-static char *this_program = "";
-
-#ifndef atol
-extern long atol();
-#endif
-static int arg_parse (/* char *, arg_info * */);
-
-
-boolean parse_args (argc, argv, table, entries, others, other_count)
-int argc;
-char *argv[];
-arg_info table[];
-int entries;
-char *others[];
-int other_count;
-{
- boolean arg_verify (/* argv, table, entries */);
- void init_store (/* table, entries */);
-
- boolean result;
-
- if (argv)
- this_program = argv[0];
-
-/* Check the validity of the table and its parameters */
-
- result = arg_verify (argv, table, entries);
-
-/* Initialize the storage values */
-
- init_store (table, entries);
-
- if (result) {
- boolean use_prefix = TRUE;
- char *argv0;
-
- argc--;
- argv0 = *++argv;
- while (argc) {
- int index, length;
-
- index = match_table (*argv, table, entries, use_prefix, &length);
- if (index < 0) {
-
-/* The argument doesn't match anything in the table */
-
- if (others) {
-
- if (*argv > argv0)
- *--*argv = '-'; /* complain at invalid flag */
-
- if (other_count > 0) {
- *others++ = *argv;
- other_count--;
- } else {
- fprintf (stderr, "%s: too many parameters: ",
- this_program);
- fprintf (stderr, "'%s' ignored\n", *argv);
- } /* else */
- } /* if (others) */
- argv0 = *++argv;
- argc--;
- } else {
-
-/* A match was found */
-
- if (length >= strlen (*argv)) {
- argc--;
- argv0 = *++argv;
- use_prefix = TRUE;
- } else {
- (*argv) += length;
- use_prefix = FALSE;
- } /* else */
-
-/* Parse any necessary arguments */
-
- if (arg_count (table[index]) != P_NO_ARGS) {
-
-/* Now length will be used to store the number of parsed characters */
-
- length = arg_parse(*argv, &table[index]);
- if (*argv == NULL)
- argc = 0;
- else if (length >= strlen (*argv)) {
- argc--;
- argv0 = *++argv;
- use_prefix = TRUE;
- } else {
- (*argv) += length;
- use_prefix = FALSE;
- } /* else */
- } /* if (argv_count != P_NO_ARGS) */
- else
- *arg_result_ptr(table[index]) =
- arg_table_size(table[index]);
- } /* else */
- } /* while (argc) */
- } /* if (result) */
-
- return result;
-} /* parse_args */
-
-
-boolean arg_verify (argv, table, entries)
-char *argv[];
-arg_info table[];
-int entries;
-{
- int i;
- char *this_program = "";
-
- if (argv)
- this_program = argv[0];
-
- for (i = 0; i < entries; i++) {
- arg_info *arg = &table[i];
-
-/* Check the argument flags */
-
- if (arg_flags (*arg) & ~(P_CASE_INSENSITIVE | P_REQUIRED_PREFIX)) {
- fprintf (stderr, "%s [arg_verify]: too many ", this_program);
- fprintf (stderr, "flags in entry %d: '%x' (hex)\n", i,
- arg_flags (*arg));
- } /* if */
-
-/* Check the argument count */
-
- { int count = arg_count (*arg);
-
- if (count != P_NO_ARGS && count != P_ONE_ARG && count !=
- P_INFINITE_ARGS) {
- fprintf (stderr, "%s [arg_verify]: invalid ", this_program);
- fprintf (stderr, "argument count in entry %d: '%d'\n", i,
- count);
- } /* if count != P_NO_ARGS ... */
-
-/* Check the result field; want to be able to store results */
-
- else
- if (arg_result_ptr (*arg) == (int *) NULL) {
- fprintf (stderr, "%s [arg_verify]: ", this_program);
- fprintf (stderr, "no argument storage given for ");
- fprintf (stderr, "entry %d\n", i);
- } /* if arg_result_ptr */
- }
-
-/* Check the argument type */
-
- { int type = arg_result_type (*arg);
-
- if (type < P_STRING || type > P_DOUBLE)
- fprintf(stderr,
- "%s [arg_verify]: bad arg type in entry %d: '%d'\n",
- this_program, i, type);
- }
-
-/* Check table size */
-
- { int size = arg_table_size (*arg);
-
- if (arg_count (*arg) == P_INFINITE_ARGS && size < 1) {
- fprintf (stderr, "%s [arg_verify]: bad ", this_program);
- fprintf (stderr, "table size in entry %d: '%d'\n", i,
- size);
- } /* if (arg_count == P_INFINITE_ARGS && size < 1) */
- }
-
- } /* for i = 0 */
-
- return TRUE;
-} /* arg_verify */
-
-
-/* match_table -- returns the index of the best entry matching the input,
- -1 if no match. The best match is the one of longest length which
- appears lowest in the table. The length of the match will be returned
- in length ONLY IF a match was found. */
-
-int match_table (norm_input, table, entries, use_prefix, length)
-register char *norm_input;
-arg_info table[];
-int entries;
-boolean use_prefix;
-int *length;
-{
- extern int match (/* char *, char *, arg_info *, boolean */);
-
- char low_input[MAX_INPUT_SIZE];
- register int i;
- int best_index = -1, best_length = 0;
-
-/* FUNCTION BODY */
-
- (void) lower_string (low_input, norm_input);
-
- for (i = 0; i < entries; i++) {
- int this_length = match (norm_input, low_input, &table[i], use_prefix);
-
- if (this_length > best_length) {
- best_index = i;
- best_length = this_length;
- } /* if (this_length > best_length) */
- } /* for (i = 0) */
-
- if (best_index > -1 && length != (int *) NULL)
- *length = best_length;
-
- return best_index;
-} /* match_table */
-
-
-/* match -- takes an input string and table entry, and returns the length
- of the longer match.
-
- 0 ==> input doesn't match
-
- For example:
-
- INPUT PREFIX STRING RESULT
-----------------------------------------------------------------------
- "abcd" "-" "d" 0
- "-d" "-" "d" 2 (i.e. "-d")
- "dout" "-" "d" 1 (i.e. "d")
- "-d" "" "-d" 2 (i.e. "-d")
- "dd" "d" "d" 2 <= here's the weird one
-*/
-
-int match (norm_input, low_input, entry, use_prefix)
-char *norm_input, *low_input;
-arg_info *entry;
-boolean use_prefix;
-{
- char *norm_prefix = arg_prefix (*entry);
- char *norm_string = arg_string (*entry);
- boolean prefix_match = FALSE, string_match = FALSE;
- int result = 0;
-
-/* Buffers for the lowercased versions of the strings being compared.
- These are used when the switch is to be case insensitive */
-
- static char low_prefix[MAX_INPUT_SIZE];
- static char low_string[MAX_INPUT_SIZE];
- int prefix_length = strlen (norm_prefix);
- int string_length = strlen (norm_string);
-
-/* Pointers for the required strings (lowered or nonlowered) */
-
- register char *input, *prefix, *string;
-
-/* FUNCTION BODY */
-
-/* Use the appropriate strings to handle case sensitivity */
-
- if (arg_flags (*entry) & P_CASE_INSENSITIVE) {
- input = low_input;
- prefix = lower_string (low_prefix, norm_prefix);
- string = lower_string (low_string, norm_string);
- } else {
- input = norm_input;
- prefix = norm_prefix;
- string = norm_string;
- } /* else */
-
-/* First, check the string formed by concatenating the prefix onto the
- switch string, but only when the prefix is not being ignored */
-
- if (use_prefix && prefix != NULL && *prefix != '\0')
- prefix_match = (strncmp (input, prefix, prefix_length) == 0) &&
- (strncmp (input + prefix_length, string, string_length) == 0);
-
-/* Next, check just the switch string, if that's allowed */
-
- if (!use_prefix && (arg_flags (*entry) & P_REQUIRED_PREFIX) == 0)
- string_match = strncmp (input, string, string_length) == 0;
-
- if (prefix_match)
- result = prefix_length + string_length;
- else if (string_match)
- result = string_length;
-
- return result;
-} /* match */
-
-
-char *lower_string (dest, src)
-char *dest, *src;
-{
- char *result = dest;
- register int c;
-
- if (dest == NULL || src == NULL)
- result = NULL;
- else
- while (*dest++ = (c = *src++) >= 'A' && c <= 'Z' ? tolower(c) : c);
-
- return result;
-} /* lower_string */
-
-
-/* arg_parse -- returns the number of characters parsed for this entry */
-
-static int arg_parse (str, entry)
-char *str;
-arg_info *entry;
-{
- int length = 0;
-
- if (arg_count (*entry) == P_ONE_ARG) {
- char **store = (char **) arg_result_ptr (*entry);
-
- length = put_one_arg (arg_result_type (*entry), str, store,
- arg_prefix (*entry), arg_string (*entry));
-
- } /* if (arg_count == P_ONE_ARG) */
- else { /* Must be a table of arguments */
- char **store = (char **) arg_result_ptr (*entry);
-
- if (store) {
- while (*store)
- store++;
-
- length = put_one_arg (arg_result_type (*entry), str, store++,
- arg_prefix (*entry), arg_string (*entry));
-
- *store = (char *) NULL;
- } /* if (store) */
- } /* else */
-
- return length;
-} /* arg_parse */
-
-
-int put_one_arg (type, str, store, prefix, string)
-int type;
-char *str;
-char **store;
-char *prefix, *string;
-{
- int length = 0;
- long L;
-
- if (store) {
- switch (type) {
- case P_STRING:
- case P_FILE:
- case P_OLD_FILE:
- case P_NEW_FILE:
- if (str == NULL)
- fprintf (stderr, "%s: Missing argument after '%s%s'\n",
- this_program, prefix, string);
- *store = copys(str);
- length = str ? strlen (str) : 0;
- break;
- case P_CHAR:
- *((char *) store) = *str;
- length = 1;
- break;
- case P_SHORT:
- L = atol(str);
- *(short *)store = (short) L;
- if (L != *(short *)store)
- fprintf(stderr,
- "%s%s parameter '%ld' is not a SHORT INT (truncating to %d)\n",
- prefix, string, L, *(short *)store);
- length = strlen (str);
- break;
- case P_INT:
- L = atol(str);
- *(int *)store = (int)L;
- if (L != *(int *)store)
- fprintf(stderr,
- "%s%s parameter '%ld' is not an INT (truncating to %d)\n",
- prefix, string, L, *(int *)store);
- length = strlen (str);
- break;
- case P_LONG:
- *(long *)store = atol(str);
- length = strlen (str);
- break;
- case P_FLOAT:
- *((float *) store) = (float) atof (str);
- length = strlen (str);
- break;
- case P_DOUBLE:
- *((double *) store) = (double) atof (str);
- length = strlen (str);
- break;
- default:
- fprintf (stderr, "put_one_arg: bad type '%d'\n",
- type);
- break;
- } /* switch */
- } /* if (store) */
-
- return length;
-} /* put_one_arg */
-
-
-void init_store (table, entries)
-arg_info *table;
-int entries;
-{
- int index;
-
- for (index = 0; index < entries; index++)
- if (arg_count (table[index]) == P_INFINITE_ARGS) {
- char **place = (char **) arg_result_ptr (table[index]);
-
- if (place)
- *place = (char *) NULL;
- } /* if arg_count == P_INFINITE_ARGS */
-
-} /* init_store */
-
OpenPOWER on IntegriCloud