123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #include <unistd.h>
- #include <wchar.h>
- #include <string.h>
- #include <limits.h>
- #include <stdlib.h>
- char *optarg;
- int optind=1, opterr=1, optopt;
- static int optpos;
- int getopt(int argc, char * const argv[], const char *optstring)
- {
- int i;
- wchar_t c, d;
- int k, l;
- char *optchar;
- if (optind >= argc || !argv[optind] || argv[optind][0] != '-' || !argv[optind][1])
- return -1;
- if (argv[optind][1] == '-' && !argv[optind][2])
- return optind++, -1;
- if (!optpos) optpos++;
- if ((k = mbtowc(&c, argv[optind]+optpos, MB_LEN_MAX)) < 0) {
- k = 1;
- c = 0xfffd; /* replacement char */
- }
- optchar = argv[optind]+optpos;
- optopt = c;
- optpos += k;
- if (!argv[optind][optpos]) {
- optind++;
- optpos = 0;
- }
- for (i=0; (l = mbtowc(&d, optstring+i, MB_LEN_MAX)) && d!=c; i+=l>0?l:1);
- if (d != c) {
- if (optstring[0] != ':' && opterr) {
- write(2, argv[0], strlen(argv[0]));
- write(2, ": illegal option: ", 18);
- write(2, optchar, k);
- write(2, "\n", 1);
- }
- return '?';
- }
- if (optstring[i+1] == ':') {
- if (optind >= argc) {
- if (optstring[0] == ':') return ':';
- if (opterr) {
- write(2, argv[0], strlen(argv[0]));
- write(2, ": option requires an argument: ", 31);
- write(2, optchar, k);
- write(2, "\n", 1);
- }
- return '?';
- }
- optarg = argv[optind++] + optpos;
- optpos = 0;
- }
- return c;
- }
|