1*219b2ee8SDavid du Colombier #include <stdlib.h> 2*219b2ee8SDavid du Colombier #include <string.h> 3*219b2ee8SDavid du Colombier #include <stdio.h> 4*219b2ee8SDavid du Colombier #define ERR(str, chr) if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);} 5*219b2ee8SDavid du Colombier int opterr = 1; 6*219b2ee8SDavid du Colombier int optind = 1; 7*219b2ee8SDavid du Colombier int optopt; 8*219b2ee8SDavid du Colombier char *optarg; 9*219b2ee8SDavid du Colombier 10*219b2ee8SDavid du Colombier int 11*219b2ee8SDavid du Colombier getopt (int argc, char **argv, char *opts) 12*219b2ee8SDavid du Colombier { 13*219b2ee8SDavid du Colombier static int sp = 1; 14*219b2ee8SDavid du Colombier register c; 15*219b2ee8SDavid du Colombier register char *cp; 16*219b2ee8SDavid du Colombier 17*219b2ee8SDavid du Colombier if (sp == 1) 18*219b2ee8SDavid du Colombier if (optind >= argc || 19*219b2ee8SDavid du Colombier argv[optind][0] != '-' || argv[optind][1] == '\0') 20*219b2ee8SDavid du Colombier return EOF; 21*219b2ee8SDavid du Colombier else if (strcmp(argv[optind], "--") == NULL) { 22*219b2ee8SDavid du Colombier optind++; 23*219b2ee8SDavid du Colombier return EOF; 24*219b2ee8SDavid du Colombier } 25*219b2ee8SDavid du Colombier optopt = c = argv[optind][sp]; 26*219b2ee8SDavid du Colombier if (c == ':' || (cp=strchr(opts, c)) == NULL) { 27*219b2ee8SDavid du Colombier ERR (": illegal option -- ", c); 28*219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') { 29*219b2ee8SDavid du Colombier optind++; 30*219b2ee8SDavid du Colombier sp = 1; 31*219b2ee8SDavid du Colombier } 32*219b2ee8SDavid du Colombier return '?'; 33*219b2ee8SDavid du Colombier } 34*219b2ee8SDavid du Colombier if (*++cp == ':') { 35*219b2ee8SDavid du Colombier if (argv[optind][sp+1] != '\0') 36*219b2ee8SDavid du Colombier optarg = &argv[optind++][sp+1]; 37*219b2ee8SDavid du Colombier else if (++optind >= argc) { 38*219b2ee8SDavid du Colombier ERR (": option requires an argument -- ", c); 39*219b2ee8SDavid du Colombier sp = 1; 40*219b2ee8SDavid du Colombier return '?'; 41*219b2ee8SDavid du Colombier } else 42*219b2ee8SDavid du Colombier optarg = argv[optind++]; 43*219b2ee8SDavid du Colombier sp = 1; 44*219b2ee8SDavid du Colombier } else { 45*219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') { 46*219b2ee8SDavid du Colombier sp = 1; 47*219b2ee8SDavid du Colombier optind++; 48*219b2ee8SDavid du Colombier } 49*219b2ee8SDavid du Colombier optarg = NULL; 50*219b2ee8SDavid du Colombier } 51*219b2ee8SDavid du Colombier return c; 52*219b2ee8SDavid du Colombier } 53