home *** CD-ROM | disk | FTP | other *** search
- /*
- getopt.c
-
- modified public-domain AT&T getopt(3)
- */
-
- #include <stdio.h>
- #include <string.h>
-
- #ifdef _POSIX_SOURCE
- # include <unistd.h>
- #else
- # define STDERR_FILENO 2
- # ifdef __STDC__
- extern int write (int fildes, char * buf, unsigned nbyte);
- # else
- extern int write ();
- # endif
- #endif
-
- int opterr = 1;
- int optind = 1;
- int optopt;
- char * optarg;
-
- #ifdef __STDC__
- static void ERR (char ** argv, char * s, char c)
- #else
- static void ERR (argv, s, c)
- char ** argv, * s, c;
- #endif
- {
- char errbuf[2];
-
- #ifdef DF_TRACE_DEBUG
- printf("DF_TRACE_DEBUG: static void ERR () in getopt.c\n");
- #endif
- if (opterr)
- {
- errbuf[0] = c;
- errbuf[1] = '\n';
- (void) write(STDERR_FILENO,argv[0],strlen(argv[0]));
- (void) write(STDERR_FILENO,s,strlen(s));
- (void) write(STDERR_FILENO,errbuf,sizeof errbuf);
- }
- }
-
- #ifdef __STDC__
- int getopt (int argc, char ** argv, char * opts)
- #else
- int getopt (argc, argv, opts)
- int argc;
- char ** argv, * opts;
- #endif
- {
- static int sp = 1, error = (int) '?';
- static char sw = '-', eos = '\0', arg = ':';
- register char c, * cp;
-
- #ifdef DF_TRACE_DEBUG
- printf("DF_TRACE_DEBUG: int getopt () in getopt.c\n");
- #endif
- if (sp == 1)
- if (optind >= argc || argv[optind][0] != sw
- || argv[optind][1] == eos)
- return EOF;
- else if (strcmp(argv[optind],"--") == 0)
- {
- optind++;
- return EOF;
- }
- c = argv[optind][sp];
- optopt = (int) c;
- if (c == arg || (cp = strchr(opts,c)) == NULL)
- {
- ERR(argv,": illegal option--",c);
- if (argv[optind][++sp] == eos)
- {
- optind++;
- sp = 1;
- }
- return error;
- }
- else if (*++cp == arg)
- {
- if (argv[optind][sp + 1] != eos)
- optarg = &argv[optind++][sp + 1];
- else if (++optind >= argc)
- {
- ERR(argv,": option requires an argument--",c);
- sp = 1;
- return error;
- }
- else
- optarg = argv[optind++];
- sp = 1;
- }
- else
- {
- if (argv[optind][++sp] == eos)
- {
- sp = 1;
- optind++;
- }
- optarg = NULL;
- }
- return (int) c;
- }
-