subgetopt.c (1641B)
1 /* subgetopt.c, subgetopt.h: (yet another) improved getopt clone, inner layer 2 D. J. Bernstein, djb@pobox.com. 3 No dependencies. 4 No system requirements. 5 19970228: Cleanups. 6 931129: Adapted from getopt.c. 7 No known patent problems. 8 9 Documentation in subgetopt.3. 10 */ 11 12 #define SUBGETOPTNOSHORT 13 #include "subgetopt.h" 14 15 #define sgopt subgetopt 16 #define optind subgetoptind 17 #define optpos subgetoptpos 18 #define optarg subgetoptarg 19 #define optproblem subgetoptproblem 20 #define optdone subgetoptdone 21 22 int optind = 1; 23 int optpos = 0; 24 char *optarg = 0; 25 int optproblem = 0; 26 int optdone = SUBGETOPTDONE; 27 28 int sgopt(argc,argv,opts) 29 int argc; 30 char **argv; 31 char *opts; 32 { 33 int c; 34 char *s; 35 36 optarg = 0; 37 if (!argv || (optind >= argc) || !argv[optind]) return optdone; 38 if (optpos && !argv[optind][optpos]) { 39 ++optind; 40 optpos = 0; 41 if ((optind >= argc) || !argv[optind]) return optdone; 42 } 43 if (!optpos) { 44 if (argv[optind][0] != '-') return optdone; 45 ++optpos; 46 c = argv[optind][1]; 47 if ((c == '-') || (c == 0)) { 48 if (c) ++optind; 49 optpos = 0; 50 return optdone; 51 } 52 /* otherwise c is reassigned below */ 53 } 54 c = argv[optind][optpos]; 55 ++optpos; 56 s = opts; 57 while (*s) { 58 if (c == *s) { 59 if (s[1] == ':') { 60 optarg = argv[optind] + optpos; 61 ++optind; 62 optpos = 0; 63 if (!*optarg) { 64 optarg = argv[optind]; 65 if ((optind >= argc) || !optarg) { /* argument past end */ 66 optproblem = c; 67 return '?'; 68 } 69 ++optind; 70 } 71 } 72 return c; 73 } 74 ++s; 75 if (*s == ':') ++s; 76 } 77 optproblem = c; 78 return '?'; 79 }