23#define alloca __builtin_alloca
47char* GetOpt::nextchar = 0;
48int GetOpt::first_nonopt = 0;
49int GetOpt::last_nonopt = 0;
51GetOpt::GetOpt (
int argc,
char **argv,
const char *optstring)
52 :opterr (1), nargc (argc), nargv (argv), noptstring (optstring)
59 first_nonopt = last_nonopt = optind = 1;
60 optarg = nextchar = 0;
64 if (optstring[0] ==
'-')
65 ordering = RETURN_IN_ORDER;
66 else if (getenv (
"_POSIX_OPTION_ORDER") != 0)
67 ordering = REQUIRE_ORDER;
73GetOpt::exchange (
char **argv)
75 int nonopts_size = (last_nonopt - first_nonopt) *
sizeof(
char *);
78 std::vector<char> temp(nonopts_size);
82 memcpy (temp.data(), &argv[first_nonopt], nonopts_size);
88 memcpy (&argv[first_nonopt], &argv[last_nonopt],
89 (optind - last_nonopt) *
sizeof (
char *));
91 memmove (&argv[first_nonopt], &argv[last_nonopt],
92 (optind - last_nonopt) *
sizeof (
char *));
94 memcpy (&argv[first_nonopt + optind - last_nonopt], temp.data(),
99 first_nonopt += (optind - last_nonopt);
100 last_nonopt = optind;
143GetOpt::operator () (
void)
145 if (nextchar == 0 || *nextchar == 0)
147 if (ordering == PERMUTE)
152 if (first_nonopt != last_nonopt && last_nonopt != optind)
154 else if (last_nonopt != optind)
155 first_nonopt = optind;
160 while (optind < nargc
161 && (nargv[optind][0] !=
'-'
162 || nargv[optind][1] == 0))
164 last_nonopt = optind;
172 if (optind != nargc && !strcmp (nargv[optind],
"--"))
176 if (first_nonopt != last_nonopt && last_nonopt != optind)
178 else if (first_nonopt == last_nonopt)
179 first_nonopt = optind;
192 if (first_nonopt != last_nonopt)
193 optind = first_nonopt;
200 if (nargv[optind][0] !=
'-' || nargv[optind][1] == 0)
202 if (ordering == REQUIRE_ORDER)
204 optarg = nargv[optind++];
211 nextchar = nargv[optind] + 1;
217 char c = *nextchar++;
218 char *temp = (
char *) strchr (noptstring, c);
224 if (temp == 0 || c ==
':')
228 if (c < 040 || c >= 0177)
229 fprintf (stderr,
"%s: unrecognized option, character code 0%o\n",
232 fprintf (stderr,
"%s: unrecognized option `-%c'\n",
261 else if (optind == nargc)
264 fprintf (stderr,
"%s: no argument for `-%c' option\n",
271 optarg = nargv[optind++];