Article View: alt.msdos.programmer
Article #594getopt(3) code
From: Paul Heffner
Date: Fri, 16 Oct 1992 14:09
Date: Fri, 16 Oct 1992 14:09
110 lines
3343 bytes
3343 bytes
Sorry folks!
In a followup posting I sent out the getopt code without the referenced
getopt.h file. Here both are again. Hope the other post doesn't screw
up too many people. (The header file isn't too crucial, but the lack
of it may cause anxiety...)
Heff
================ Begin getopt.h ============================
extern int getopt();
extern int optind;
extern char *optarg;
================ Begin getopt.c ============================
/*
** @(#)getopt.c 2.2 (smail) 1/26/87
*/
/*
* 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
* in the public domain.
*
* 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.
*/
#ifdef BSD
#include <strings.h>
#else
#include <string.h>
#define index strchr
#endif
/*LINTLIBRARY*/
#define NULL 0
#define EOF (-1)
#define ERR(s, c) if(opterr){\
extern int write();\
char errbuf[2];\
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);}
#include "getopt.h"
int opterr = 1;
int optind = 1;
int optopt;
char *optarg;
int
getopt(argc, argv, opts)
int argc;
char **argv, *opts;
{
static int sp = 1;
register int c;
register char *cp;
if(sp == 1)
if(optind >= argc ||
argv[optind][0] != '-' || argv[optind][1] == '\0')
return(EOF);
else if(strcmp(argv[optind], "--") == NULL) {
optind++;
return(EOF);
}
optopt = c = argv[optind][sp];
if(c == ':' || (cp=index(opts, c)) == NULL) {
ERR(": illegal option -- ", c);
if(argv[optind][++sp] == '\0') {
optind++;
sp = 1;
}
return('?');
}
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('?');
} else
optarg = argv[optind++];
sp = 1;
} else {
if(argv[optind][++sp] == '\0') {
sp = 1;
optind++;
}
optarg = NULL;
}
return(c);
}
Technical Details
Message-ID:
<Bw7wo8.Iy@fang.att.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!portal!lll-winken!uwm.edu!linac!att!att!fang!pheffnerShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!portal!lll-winken!uwm.edu!linac!att!att!fang!pheffner From: pheffner@fang.att.com (Paul Heffner) Newsgroups: alt.msdos.programmer Subject: getopt(3) code Keywords: getopt Message-ID: <Bw7wo8.Iy@fang.att.com> Date: 16 Oct 92 14:09:42 GMT Organization: AT&T Tax Systems Development, Maitland FL Lines: 110