1c87c5fbaSopenharmony_ci/* 2c87c5fbaSopenharmony_ci * This file was copied from the following newsgroup posting: 3c87c5fbaSopenharmony_ci * 4c87c5fbaSopenharmony_ci * Newsgroups: mod.std.unix 5c87c5fbaSopenharmony_ci * Subject: public domain AT&T getopt source 6c87c5fbaSopenharmony_ci * Date: 3 Nov 85 19:34:15 GMT 7c87c5fbaSopenharmony_ci * 8c87c5fbaSopenharmony_ci * Here's something you've all been waiting for: the AT&T public domain 9c87c5fbaSopenharmony_ci * source for getopt(3). It is the code which was given out at the 1985 10c87c5fbaSopenharmony_ci * UNIFORUM conference in Dallas. I obtained it by electronic mail 11c87c5fbaSopenharmony_ci * directly from AT&T. The people there assure me that it is indeed 12c87c5fbaSopenharmony_ci * in the public domain. 13c87c5fbaSopenharmony_ci */ 14c87c5fbaSopenharmony_ci 15c87c5fbaSopenharmony_ci#include <stdio.h> 16c87c5fbaSopenharmony_ci#include <string.h> 17c87c5fbaSopenharmony_ci 18c87c5fbaSopenharmony_cistatic int optind = 1; 19c87c5fbaSopenharmony_cistatic int optopt; 20c87c5fbaSopenharmony_cistatic char *optarg; 21c87c5fbaSopenharmony_ci 22c87c5fbaSopenharmony_cistatic int 23c87c5fbaSopenharmony_cigetopt(int argc, char *argv[], const char *opts) { 24c87c5fbaSopenharmony_ci static int sp = 1; 25c87c5fbaSopenharmony_ci int c; 26c87c5fbaSopenharmony_ci char *cp; 27c87c5fbaSopenharmony_ci 28c87c5fbaSopenharmony_ci if (sp == 1) { 29c87c5fbaSopenharmony_ci if (optind >= argc || 30c87c5fbaSopenharmony_ci argv[optind][0] != '-' || argv[optind][1] == '\0') 31c87c5fbaSopenharmony_ci return EOF; 32c87c5fbaSopenharmony_ci else if (!strcmp(argv[optind], "--")) { 33c87c5fbaSopenharmony_ci optind++; 34c87c5fbaSopenharmony_ci return EOF; 35c87c5fbaSopenharmony_ci } 36c87c5fbaSopenharmony_ci } 37c87c5fbaSopenharmony_ci optopt = c = argv[optind][sp]; 38c87c5fbaSopenharmony_ci if (c == ':' || !(cp = strchr(opts, c))) { 39c87c5fbaSopenharmony_ci fprintf(stderr, ": illegal option -- %c\n", c); 40c87c5fbaSopenharmony_ci if (argv[optind][++sp] == '\0') { 41c87c5fbaSopenharmony_ci optind++; 42c87c5fbaSopenharmony_ci sp = 1; 43c87c5fbaSopenharmony_ci } 44c87c5fbaSopenharmony_ci return '?'; 45c87c5fbaSopenharmony_ci } 46c87c5fbaSopenharmony_ci if (*++cp == ':') { 47c87c5fbaSopenharmony_ci if (argv[optind][sp+1] != '\0') 48c87c5fbaSopenharmony_ci optarg = &argv[optind++][sp+1]; 49c87c5fbaSopenharmony_ci else if (++optind >= argc) { 50c87c5fbaSopenharmony_ci fprintf(stderr, ": option requires an argument -- %c\n", c); 51c87c5fbaSopenharmony_ci sp = 1; 52c87c5fbaSopenharmony_ci return '?'; 53c87c5fbaSopenharmony_ci } else 54c87c5fbaSopenharmony_ci optarg = argv[optind++]; 55c87c5fbaSopenharmony_ci sp = 1; 56c87c5fbaSopenharmony_ci } else { 57c87c5fbaSopenharmony_ci if (argv[optind][++sp] == '\0') { 58c87c5fbaSopenharmony_ci sp = 1; 59c87c5fbaSopenharmony_ci optind++; 60c87c5fbaSopenharmony_ci } 61c87c5fbaSopenharmony_ci optarg = NULL; 62c87c5fbaSopenharmony_ci } 63c87c5fbaSopenharmony_ci 64c87c5fbaSopenharmony_ci return c; 65c87c5fbaSopenharmony_ci} 66