static char NFSTestID
[] = "@(#)getopt.c 1.1 Lachman ONC Test Suite source";
* Here's something you've all been waiting for: the AT&T public domain
* source for getopt(3). It is the code which was given out at the 1985
* UNIFORUM conference in Dallas. I obtained it by electronic mail
* directly from AT&T. The people there assure me that it is indeed
* 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, and my source at AT&T did not send a copy.
* The current SVR2 man page reflects the actual behavor of this getopt.
* However, I am not about to post a copy of anything licensed by AT&T.
#define ERR(s, c) if(opterr){\
errbuf[0] = c; errbuf[1] = '\n';\
(void) write(2, argv[0], (unsigned)strlen(argv[0]));\
(void) write(2, s, (unsigned)strlen(s));\
(void) write(2, errbuf, 2);}
argv
[optind
][0] != '-' || argv
[optind
][1] == '\0')
else if(strcmp(argv
[optind
], "--") == NULL
) {
optopt
= c
= argv
[optind
][sp
];
if(c
== ':' || (cp
=strchr(opts
, c
)) == NULL
) {
if(c
== ':' || (cp
=index(opts
, c
)) == NULL
) {
ERR(": illegal option -- ", c
);
if(argv
[optind
][++sp
] == '\0') {
if(argv
[optind
][sp
+1] != '\0')
optarg
= &argv
[optind
++][sp
+1];
else if(++optind
>= argc
) {
ERR(": option requires an argument -- ", c
);
if(argv
[optind
][++sp
] == '\0') {
fprintf(stderr
, "usage: getopt legal-args $*\n");
while ((i
= getopt(ac
- 1, &av
[1], av
[1])) != EOF
) {
sprintf(buf
, "-%c", i
& 0xff);
sprintf(buf
, " -%c", i
& 0xff);
sprintf(buf
, " %s", optarg
);
for (; optind
< ac
; optind
++) {
sprintf(buf
, " %s", av
[optind
]);