--- pgp/contrib/langtool/getopt.c 2018/04/24 16:41:54 1.1.1.2 +++ pgp/contrib/langtool/getopt.c 2018/04/24 16:45:05 1.1.1.3 @@ -1,86 +1,86 @@ -/* -** @(#)getopt.c 2.5 (smail) 9/15/87 -*/ - -/* -* This is the AT&T public domain source for getopt(3). It is the code -* which was given out at the 1985 UNIFORUM conference in Dallas. -* -* There is no manual page. That is because the one they gave out at -* UNIFORUM was slightly different from the current System V Release 2 -* manual page. The difference apparently involved a note about the -* famous rules 5 and 6, recommending using white space between an -* option and its first argument, and not grouping options that have -* arguments. Getopt itself is currently lenient about both of these -* things. White space is allowed, but not mandatory, and the last option -* in a group can have an argument. That particular version of the man -* page evidently has no official existence. The current SVR2 man page -* reflects the actual behavor of this getopt. -*/ - -#include -#include -#include "getopt.h" - -/*LINTLIBRARY*/ -#ifndef NULL -#define NULL 0 -#endif -#define EOF (-1) -#define ERR(str, chr) (opterr ? fprintf(stderr, "%s%s%c\n", argv[0], str, chr) : 0) - -int opterr = 1; -int optind = 1; -int optopt = 0; -char *optarg = 0; - -int -getopt(int argc, char **argv, char *opts) -{ - static int sp = 1; - register int c; - register char *cp; - - if(sp == 1) { - if(optind >= argc || (argv[optind][0] != '+' && - argv[optind][0] != '-') || argv[optind][1] == '\0') - return EOF; - else if(strcmp(argv[optind], "--") == 0) { - optind++; - return EOF; - } - /* '+' for config options, '+' should not be in the opts list */ - if (argv[optind][0] == '+') { - optarg = argv[optind++] + 1; - return '+'; - } - } - optopt = c = argv[optind][sp]; - if(c == ':' || (cp=strchr(opts, c)) == NULL) { - ERR(": illegal option -- ", c); - if(argv[optind][++sp] == '\0') { - optind++; - sp = 1; - } - return '\0'; - } - if(*++cp == ':') { - if(argv[optind][sp+1] != '\0') - optarg = &argv[optind++][sp+1]; - else if(++optind >= argc) { - ERR(": option requires an argument -- ", c); - sp = 1; - return '\0'; - } else - optarg = argv[optind++]; - sp = 1; - } else { - if(argv[optind][++sp] == '\0') { - sp = 1; - optind++; - } - optarg = NULL; - } - return c; -} - +/* +** @(#)getopt.c 2.5 (smail) 9/15/87 +*/ + +/* +* This is the AT&T public domain source for getopt(3). It is the code +* which was given out at the 1985 UNIFORUM conference in Dallas. +* +* There is no manual page. That is because the one they gave out at +* UNIFORUM was slightly different from the current System V Release 2 +* manual page. The difference apparently involved a note about the +* famous rules 5 and 6, recommending using white space between an +* option and its first argument, and not grouping options that have +* arguments. Getopt itself is currently lenient about both of these +* things. White space is allowed, but not mandatory, and the last option +* in a group can have an argument. That particular version of the man +* page evidently has no official existence. The current SVR2 man page +* reflects the actual behavor of this getopt. +*/ + +#include +#include +#include "getopt.h" + +/*LINTLIBRARY*/ +#ifndef NULL +#define NULL 0 +#endif +#define EOF (-1) +#define ERR(str, chr) (opterr ? fprintf(stderr, "%s%s%c\n", argv[0], str, chr) : 0) + +int opterr = 1; +int optind = 1; +int optopt = 0; +char *optarg = 0; + +int +getopt(int argc, char **argv, char *opts) +{ + static int sp = 1; + register int c; + register char *cp; + + if(sp == 1) { + if(optind >= argc || (argv[optind][0] != '+' && + argv[optind][0] != '-') || argv[optind][1] == '\0') + return EOF; + else if(strcmp(argv[optind], "--") == 0) { + optind++; + return EOF; + } + /* '+' for config options, '+' should not be in the opts list */ + if (argv[optind][0] == '+') { + optarg = argv[optind++] + 1; + return '+'; + } + } + optopt = c = argv[optind][sp]; + if(c == ':' || (cp=strchr(opts, c)) == NULL) { + ERR(": illegal option -- ", c); + if(argv[optind][++sp] == '\0') { + optind++; + sp = 1; + } + return '\0'; + } + if(*++cp == ':') { + if(argv[optind][sp+1] != '\0') + optarg = &argv[optind++][sp+1]; + else if(++optind >= argc) { + ERR(": option requires an argument -- ", c); + sp = 1; + return '\0'; + } else + optarg = argv[optind++]; + sp = 1; + } else { + if(argv[optind][++sp] == '\0') { + sp = 1; + optind++; + } + optarg = NULL; + } + return c; +} +