/* * getopt.c * * Replacement for a Unix style getopt function * * Quick, clean, and portable to funky systems that don't have getopt() * for whatever reason. * */ #include #include #ifndef MSDOS_16BIT #define cdecl #endif int optind = 1; int optopt = 0; const char *optarg = NULL; int cdecl getopt (int argc, char *argv[], const char *options) { static int pos = 1; const char *p; if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == 0) return EOF; optopt = argv[optind][pos++]; optarg = NULL; if (argv[optind][pos] == 0) { pos = 1; optind++; } p = strchr (options, optopt); if (optopt == ':' || p == NULL) { fputs ("illegal option -- ", stdout); goto error; } else if (p[1] == ':') { if (optind >= argc) { fputs ("option requires an argument -- ", stdout); goto error; } else { optarg = argv[optind]; if (pos != 1) optarg += pos; pos = 1; optind++; } } return optopt; error: fputc (optopt, stdout); fputc ('\n', stdout); return '?'; }/* getopt */