1219b2ee8SDavid du Colombier #ifndef _POSIX_SOURCE 2219b2ee8SDavid du Colombier #include <u.h> 3219b2ee8SDavid du Colombier #include <libc.h> 4219b2ee8SDavid du Colombier #endif 5219b2ee8SDavid du Colombier #include <stdio.h> 6219b2ee8SDavid du Colombier #define ERR(str, chr) if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);} 7219b2ee8SDavid du Colombier int opterr = 1; 8219b2ee8SDavid du Colombier int optind = 1; 9219b2ee8SDavid du Colombier int optopt; 10219b2ee8SDavid du Colombier char *optarg; 11219b2ee8SDavid du Colombier char *strchr(); 12219b2ee8SDavid du Colombier 13219b2ee8SDavid du Colombier int 14219b2ee8SDavid du Colombier getopt (argc, argv, opts) 15219b2ee8SDavid du Colombier char **argv, *opts; 16219b2ee8SDavid du Colombier { 17219b2ee8SDavid du Colombier static int sp = 1; 18219b2ee8SDavid du Colombier register c; 19219b2ee8SDavid du Colombier register char *cp; 20219b2ee8SDavid du Colombier 21219b2ee8SDavid du Colombier if (sp == 1) 22219b2ee8SDavid du Colombier if (optind >= argc || 23219b2ee8SDavid du Colombier argv[optind][0] != '-' || argv[optind][1] == '\0') 24219b2ee8SDavid du Colombier return EOF; 25*7ad596ffSDavid du Colombier else if (strcmp(argv[optind], "--") == 0) { 26219b2ee8SDavid du Colombier optind++; 27219b2ee8SDavid du Colombier return EOF; 28219b2ee8SDavid du Colombier } 29219b2ee8SDavid du Colombier optopt = c = argv[optind][sp]; 30219b2ee8SDavid du Colombier if (c == ':' || (cp=strchr(opts, c)) == NULL) { 31219b2ee8SDavid du Colombier ERR (": illegal option -- ", c); 32219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') { 33219b2ee8SDavid du Colombier optind++; 34219b2ee8SDavid du Colombier sp = 1; 35219b2ee8SDavid du Colombier } 36219b2ee8SDavid du Colombier return '?'; 37219b2ee8SDavid du Colombier } 38219b2ee8SDavid du Colombier if (*++cp == ':') { 39219b2ee8SDavid du Colombier if (argv[optind][sp+1] != '\0') 40219b2ee8SDavid du Colombier optarg = &argv[optind++][sp+1]; 41219b2ee8SDavid du Colombier else if (++optind >= argc) { 42219b2ee8SDavid du Colombier ERR (": option requires an argument -- ", c); 43219b2ee8SDavid du Colombier sp = 1; 44219b2ee8SDavid du Colombier return '?'; 45219b2ee8SDavid du Colombier } else 46219b2ee8SDavid du Colombier optarg = argv[optind++]; 47219b2ee8SDavid du Colombier sp = 1; 48219b2ee8SDavid du Colombier } else { 49219b2ee8SDavid du Colombier if (argv[optind][++sp] == '\0') { 50219b2ee8SDavid du Colombier sp = 1; 51219b2ee8SDavid du Colombier optind++; 52219b2ee8SDavid du Colombier } 53219b2ee8SDavid du Colombier optarg = NULL; 54219b2ee8SDavid du Colombier } 55219b2ee8SDavid du Colombier return c; 56219b2ee8SDavid du Colombier } 57