diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/dvitops/getopt.c |
Initial commit
Diffstat (limited to 'dviware/dvitops/getopt.c')
-rw-r--r-- | dviware/dvitops/getopt.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/dviware/dvitops/getopt.c b/dviware/dvitops/getopt.c new file mode 100644 index 0000000000..84c8fd5a79 --- /dev/null +++ b/dviware/dvitops/getopt.c @@ -0,0 +1,151 @@ +static char rcsid[] = "$Header: /usr/jjc/dvitops/RCS/getopt.c,v 1.3 90/08/14 13:06:48 jjc Rel $"; + +#include "dvitops.h" + +#ifdef SWITCHAR +#include <dos.h> +#endif + +int opterr = 1; +int optind = 1; +int optopt; +char *optarg; + +#ifndef OPTION_CHAR +#define OPTION_CHAR '-' +#endif + +int getopt(argc, argv, opts) +int argc; +char **argv; +char *opts; +{ +#ifdef SWITCHAR + union REGS regs; + static char switchar = '\0'; +#endif + static int sp = 1; + register int c; + register char *cp; + char *message; +#ifdef SWITCHAR + if (switchar == '\0') { + regs.x.ax = 0x3700; + intdos(®s, ®s); + if (!regs.x.cflag) + switchar = regs.h.dl; + else + switchar = '/'; + } +#endif + if (sp == 1) { + if (optind >= argc) + return EOF; + if (( +#ifdef SWITCHAR + argv[optind][0] != switchar && +#endif + argv[optind][0] != OPTION_CHAR) || argv[optind][1] == '\0') { +#ifdef REORDER_ARGS + int i; + for (i = optind; i < argc; i++) + if (( +#ifdef SWITCHAR + argv[i][0] == switchar || +#endif + argv[i][0] == OPTION_CHAR) && argv[i][1] != '\0') + break; + if (i < argc) { + c = argv[i][1]; +#ifdef CASE_INSENSITIVE_OPTIONS + if (isupper(c)) + c = tolower(c); +#endif + if (c != ':' && c != OPTION_CHAR && (cp = strchr(opts, c)) != NULL + && cp[1] == ':' && argv[i][2] == 0 && i < argc - 1) { + int j; + char *temp1 = argv[i]; + char *temp2 = argv[i+1]; + for (j = i - 1; j >= optind; j--) + argv[j+2] = argv[j]; + argv[optind] = temp1; + argv[optind+1] = temp2; + } + else { + int j; + char *temp = argv[i]; + for (j = i - 1; j >= optind; j--) + argv[j+1] = argv[j]; + argv[optind] = temp; + } + } + else +#endif + return EOF; + } + if ((argv[optind][0] == OPTION_CHAR && argv[optind][1] == OPTION_CHAR + && argv[optind][2] == '\0') +#ifdef SWITCHAR + || (argv[optind][0] == switchar && argv[optind][1] == switchar + && argv[optind][2] == '\0') +#endif + ) { + optind++; + return(EOF); + } + } + optopt = c = argv[optind][sp]; +#ifdef CASE_INSENSITIVE_OPTIONS + if (isascii(c) && isupper(c)) + optopt = c = tolower(c); +#endif + if (c == ':' || (cp = strchr(opts, c)) == NULL) { + if (argv[optind][++sp] == '\0') { + optind++; + sp = 1; + } + message = ": illegal option -- "; + goto bad; + } + if (*++cp == ':') { + if (argv[optind][sp+1] != '\0') + optarg = &argv[optind++][sp+1]; + else if (++optind >= argc) { + sp = 1; + message = ": option requires an argument -- "; + goto bad; + } + else + optarg = argv[optind++]; + sp = 1; + } + else { + if (argv[optind][++sp] == '\0') { + sp = 1; + optind++; + } + optarg = NULL; + } + return c; +bad: + if (opterr) { + fputs(argv[0], stderr); + fputs(message, stderr); + fputc(optopt, stderr); + fputc('\n', stderr); + } + return '?'; +} + + +/* +Local Variables: +c-indent-level: 4 +c-continued-statement-offset: 4 +c-brace-offset: 4 +c-argdecl-indent: 4 +c-label-offset: -4 +tab-width: 4 +End: +*/ + |