runit

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

subgetopt.c (1419B)


      1 /* Public domain. */
      2 
      3 #define SUBGETOPTNOSHORT
      4 #include "subgetopt.h"
      5 
      6 #define sgopt subgetopt
      7 #define optind subgetoptind
      8 #define optpos subgetoptpos
      9 #define optarg subgetoptarg
     10 #define optproblem subgetoptproblem
     11 #define optdone subgetoptdone
     12 
     13 int optind = 1;
     14 int optpos = 0;
     15 const char *optarg = 0;
     16 int optproblem = 0;
     17 int optdone = SUBGETOPTDONE;
     18 
     19 int sgopt(int argc,const char *const *argv,const char *opts)
     20 {
     21   int c;
     22   const char *s;
     23 
     24   optarg = 0;
     25   if (!argv || (optind >= argc) || !argv[optind]) return optdone;
     26   if (optpos && !argv[optind][optpos]) {
     27     ++optind;
     28     optpos = 0;
     29     if ((optind >= argc) || !argv[optind]) return optdone;
     30   }
     31   if (!optpos) {
     32     if (argv[optind][0] != '-') return optdone;
     33     ++optpos;
     34     c = argv[optind][1];
     35     if ((c == '-') || (c == 0)) {
     36       if (c) ++optind;
     37       optpos = 0;
     38       return optdone;
     39     }
     40     /* otherwise c is reassigned below */
     41   }
     42   c = argv[optind][optpos];
     43   ++optpos;
     44   s = opts;
     45   while (*s) {
     46     if (c == *s) {
     47       if (s[1] == ':') {
     48         optarg = argv[optind] + optpos;
     49         ++optind;
     50         optpos = 0;
     51         if (!*optarg) {
     52           optarg = argv[optind];
     53           if ((optind >= argc) || !optarg) { /* argument past end */
     54             optproblem = c;
     55             return '?';
     56           }
     57           ++optind;
     58         }
     59       }
     60       return c;
     61     }
     62     ++s;
     63     if (*s == ':') ++s;
     64   }
     65   optproblem = c;
     66   return '?';
     67 }