1 /*
2 * File automatically generated by
3 * gengen 1.4.2 by Lorenzo Bettini
4 * http://www.gnu.org/software/gengen
5 */
6
7 #include "custom_getopt_gen.h"
8
9 void
generate_custom_getopt_gen(ostream & stream,unsigned int indent)10 custom_getopt_gen_gen_class::generate_custom_getopt_gen(ostream &stream, unsigned int indent)
11 {
12 string indent_str (indent, ' ');
13 indent = 0;
14
15 stream << "/*";
16 stream << "\n";
17 stream << indent_str;
18 stream << " * Extracted from the glibc source tree, version 2.3.6";
19 stream << "\n";
20 stream << indent_str;
21 stream << " *";
22 stream << "\n";
23 stream << indent_str;
24 stream << " * Licensed under the GPL as per the whole glibc source tree.";
25 stream << "\n";
26 stream << indent_str;
27 stream << " *";
28 stream << "\n";
29 stream << indent_str;
30 stream << " * This file was modified so that getopt_long can be called";
31 stream << "\n";
32 stream << indent_str;
33 stream << " * many times without risking previous memory to be spoiled.";
34 stream << "\n";
35 stream << indent_str;
36 stream << " *";
37 stream << "\n";
38 stream << indent_str;
39 stream << " * Modified by Andre Noll and Lorenzo Bettini for use in";
40 stream << "\n";
41 stream << indent_str;
42 stream << " * GNU gengetopt generated files.";
43 stream << "\n";
44 stream << indent_str;
45 stream << " *";
46 stream << "\n";
47 stream << indent_str;
48 stream << " */";
49 stream << "\n";
50 stream << indent_str;
51 stream << "\n";
52 stream << indent_str;
53 stream << "/* ";
54 stream << "\n";
55 stream << indent_str;
56 stream << " * we must include anything we need since this file is not thought to be";
57 stream << "\n";
58 stream << indent_str;
59 stream << " * inserted in a file already using getopt.h";
60 stream << "\n";
61 stream << indent_str;
62 stream << " *";
63 stream << "\n";
64 stream << indent_str;
65 stream << " * Lorenzo";
66 stream << "\n";
67 stream << indent_str;
68 stream << " */";
69 stream << "\n";
70 stream << indent_str;
71 stream << "\n";
72 stream << indent_str;
73 stream << "struct option";
74 stream << "\n";
75 stream << indent_str;
76 stream << "{";
77 stream << "\n";
78 stream << indent_str;
79 stream << " const char *name;";
80 stream << "\n";
81 stream << indent_str;
82 stream << " /* has_arg can't be an enum because some compilers complain about";
83 stream << "\n";
84 stream << indent_str;
85 stream << " type mismatches in all the code that assumes it is an int. */";
86 stream << "\n";
87 stream << indent_str;
88 stream << " int has_arg;";
89 stream << "\n";
90 stream << indent_str;
91 stream << " int *flag;";
92 stream << "\n";
93 stream << indent_str;
94 stream << " int val;";
95 stream << "\n";
96 stream << indent_str;
97 stream << "};";
98 stream << "\n";
99 stream << indent_str;
100 stream << "\n";
101 stream << indent_str;
102 stream << "/* This version of `getopt' appears to the caller like standard Unix `getopt'";
103 stream << "\n";
104 stream << indent_str;
105 stream << " but it behaves differently for the user, since it allows the user";
106 stream << "\n";
107 stream << indent_str;
108 stream << " to intersperse the options with the other arguments.";
109 stream << "\n";
110 stream << indent_str;
111 stream << "\n";
112 stream << indent_str;
113 stream << " As `getopt' works, it permutes the elements of ARGV so that,";
114 stream << "\n";
115 stream << indent_str;
116 stream << " when it is done, all the options precede everything else. Thus";
117 stream << "\n";
118 stream << indent_str;
119 stream << " all application programs are extended to handle flexible argument order.";
120 stream << "\n";
121 stream << indent_str;
122 stream << "*/";
123 stream << "\n";
124 stream << indent_str;
125 stream << "/*";
126 stream << "\n";
127 stream << indent_str;
128 stream << " If the field `flag' is not NULL, it points to a variable that is set";
129 stream << "\n";
130 stream << indent_str;
131 stream << " to the value given in the field `val' when the option is found, but";
132 stream << "\n";
133 stream << indent_str;
134 stream << " left unchanged if the option is not found.";
135 stream << "\n";
136 stream << indent_str;
137 stream << "\n";
138 stream << indent_str;
139 stream << " To have a long-named option do something other than set an `int' to";
140 stream << "\n";
141 stream << indent_str;
142 stream << " a compiled-in constant, such as set a value from `custom_optarg', set the";
143 stream << "\n";
144 stream << indent_str;
145 stream << " option's `flag' field to zero and its `val' field to a nonzero";
146 stream << "\n";
147 stream << indent_str;
148 stream << " value (the equivalent single-letter option character, if there is";
149 stream << "\n";
150 stream << indent_str;
151 stream << " one). For long options that have a zero `flag' field, `getopt'";
152 stream << "\n";
153 stream << indent_str;
154 stream << " returns the contents of the `val' field. */";
155 stream << "\n";
156 stream << indent_str;
157 stream << "\n";
158 stream << indent_str;
159 stream << "/* Names for the values of the `has_arg' field of `struct option'. */";
160 stream << "\n";
161 stream << indent_str;
162 stream << "#ifndef no_argument";
163 stream << "\n";
164 stream << indent_str;
165 stream << "#define no_argument 0";
166 stream << "\n";
167 stream << indent_str;
168 stream << "#endif";
169 stream << "\n";
170 stream << indent_str;
171 stream << "\n";
172 stream << indent_str;
173 stream << "#ifndef required_argument";
174 stream << "\n";
175 stream << indent_str;
176 stream << "#define required_argument 1";
177 stream << "\n";
178 stream << indent_str;
179 stream << "#endif";
180 stream << "\n";
181 stream << indent_str;
182 stream << "\n";
183 stream << indent_str;
184 stream << "#ifndef optional_argument";
185 stream << "\n";
186 stream << indent_str;
187 stream << "#define optional_argument 2";
188 stream << "\n";
189 stream << indent_str;
190 stream << "#endif";
191 stream << "\n";
192 stream << indent_str;
193 stream << "\n";
194 stream << indent_str;
195 stream << "struct custom_getopt_data {";
196 stream << "\n";
197 stream << indent_str;
198 stream << " /*";
199 stream << "\n";
200 stream << indent_str;
201 stream << " * These have exactly the same meaning as the corresponding global variables,";
202 stream << "\n";
203 stream << indent_str;
204 stream << " * except that they are used for the reentrant versions of getopt.";
205 stream << "\n";
206 stream << indent_str;
207 stream << " */";
208 stream << "\n";
209 stream << indent_str;
210 stream << " int custom_optind;";
211 stream << "\n";
212 stream << indent_str;
213 stream << " int custom_opterr;";
214 stream << "\n";
215 stream << indent_str;
216 stream << " int custom_optopt;";
217 stream << "\n";
218 stream << indent_str;
219 stream << " char *custom_optarg;";
220 stream << "\n";
221 stream << indent_str;
222 stream << "\n";
223 stream << indent_str;
224 stream << " /* True if the internal members have been initialized. */";
225 stream << "\n";
226 stream << indent_str;
227 stream << " int initialized;";
228 stream << "\n";
229 stream << indent_str;
230 stream << "\n";
231 stream << indent_str;
232 stream << " /*";
233 stream << "\n";
234 stream << indent_str;
235 stream << " * The next char to be scanned in the option-element in which the last option";
236 stream << "\n";
237 stream << indent_str;
238 stream << " * character we returned was found. This allows us to pick up the scan where";
239 stream << "\n";
240 stream << indent_str;
241 stream << " * we left off. If this is zero, or a null string, it means resume the scan by";
242 stream << "\n";
243 stream << indent_str;
244 stream << " * advancing to the next ARGV-element.";
245 stream << "\n";
246 stream << indent_str;
247 stream << " */";
248 stream << "\n";
249 stream << indent_str;
250 stream << " char *nextchar;";
251 stream << "\n";
252 stream << indent_str;
253 stream << "\n";
254 stream << indent_str;
255 stream << " /*";
256 stream << "\n";
257 stream << indent_str;
258 stream << " * Describe the part of ARGV that contains non-options that have been skipped.";
259 stream << "\n";
260 stream << indent_str;
261 stream << " * `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is";
262 stream << "\n";
263 stream << indent_str;
264 stream << " * the index after the last of them.";
265 stream << "\n";
266 stream << indent_str;
267 stream << " */";
268 stream << "\n";
269 stream << indent_str;
270 stream << " int first_nonopt;";
271 stream << "\n";
272 stream << indent_str;
273 stream << " int last_nonopt;";
274 stream << "\n";
275 stream << indent_str;
276 stream << "};";
277 stream << "\n";
278 stream << indent_str;
279 stream << "\n";
280 stream << indent_str;
281 stream << "/*";
282 stream << "\n";
283 stream << indent_str;
284 stream << " * the variables optarg, optind, opterr and optopt are renamed with";
285 stream << "\n";
286 stream << indent_str;
287 stream << " * the custom_ prefix so that they don't interfere with getopt ones.";
288 stream << "\n";
289 stream << indent_str;
290 stream << " *";
291 stream << "\n";
292 stream << indent_str;
293 stream << " * Moreover they're static so they are visible only from within the";
294 stream << "\n";
295 stream << indent_str;
296 stream << " * file where this very file will be included.";
297 stream << "\n";
298 stream << indent_str;
299 stream << " */";
300 stream << "\n";
301 stream << indent_str;
302 stream << "\n";
303 stream << indent_str;
304 stream << "/*";
305 stream << "\n";
306 stream << indent_str;
307 stream << " * For communication from `custom_getopt' to the caller. When `custom_getopt' finds an";
308 stream << "\n";
309 stream << indent_str;
310 stream << " * option that takes an argument, the argument value is returned here.";
311 stream << "\n";
312 stream << indent_str;
313 stream << " */";
314 stream << "\n";
315 stream << indent_str;
316 stream << "static char *custom_optarg;";
317 stream << "\n";
318 stream << indent_str;
319 stream << "\n";
320 stream << indent_str;
321 stream << "/*";
322 stream << "\n";
323 stream << indent_str;
324 stream << " * Index in ARGV of the next element to be scanned. This is used for";
325 stream << "\n";
326 stream << indent_str;
327 stream << " * communication to and from the caller and for communication between";
328 stream << "\n";
329 stream << indent_str;
330 stream << " * successive calls to `custom_getopt'.";
331 stream << "\n";
332 stream << indent_str;
333 stream << " *";
334 stream << "\n";
335 stream << indent_str;
336 stream << " * On entry to `custom_getopt', 1 means this is the first call; initialize.";
337 stream << "\n";
338 stream << indent_str;
339 stream << " *";
340 stream << "\n";
341 stream << indent_str;
342 stream << " * When `custom_getopt' returns -1, this is the index of the first of the non-option";
343 stream << "\n";
344 stream << indent_str;
345 stream << " * elements that the caller should itself scan.";
346 stream << "\n";
347 stream << indent_str;
348 stream << " *";
349 stream << "\n";
350 stream << indent_str;
351 stream << " * Otherwise, `custom_optind' communicates from one call to the next how much of ARGV";
352 stream << "\n";
353 stream << indent_str;
354 stream << " * has been scanned so far.";
355 stream << "\n";
356 stream << indent_str;
357 stream << " *";
358 stream << "\n";
359 stream << indent_str;
360 stream << " * 1003.2 says this must be 1 before any call.";
361 stream << "\n";
362 stream << indent_str;
363 stream << " */";
364 stream << "\n";
365 stream << indent_str;
366 stream << "static int custom_optind = 1;";
367 stream << "\n";
368 stream << indent_str;
369 stream << "\n";
370 stream << indent_str;
371 stream << "/*";
372 stream << "\n";
373 stream << indent_str;
374 stream << " * Callers store zero here to inhibit the error message for unrecognized";
375 stream << "\n";
376 stream << indent_str;
377 stream << " * options.";
378 stream << "\n";
379 stream << indent_str;
380 stream << " */";
381 stream << "\n";
382 stream << indent_str;
383 stream << "static int custom_opterr = 1;";
384 stream << "\n";
385 stream << indent_str;
386 stream << "\n";
387 stream << indent_str;
388 stream << "/*";
389 stream << "\n";
390 stream << indent_str;
391 stream << " * Set to an option character which was unrecognized. This must be initialized";
392 stream << "\n";
393 stream << indent_str;
394 stream << " * on some systems to avoid linking in the system's own getopt implementation.";
395 stream << "\n";
396 stream << indent_str;
397 stream << " */";
398 stream << "\n";
399 stream << indent_str;
400 stream << "static int custom_optopt = '?';";
401 stream << "\n";
402 stream << indent_str;
403 stream << "\n";
404 stream << indent_str;
405 stream << "/*";
406 stream << "\n";
407 stream << indent_str;
408 stream << " * Exchange two adjacent subsequences of ARGV. One subsequence is elements";
409 stream << "\n";
410 stream << indent_str;
411 stream << " * [first_nonopt,last_nonopt) which contains all the non-options that have been";
412 stream << "\n";
413 stream << indent_str;
414 stream << " * skipped so far. The other is elements [last_nonopt,custom_optind), which contains";
415 stream << "\n";
416 stream << indent_str;
417 stream << " * all the options processed since those non-options were skipped.";
418 stream << "\n";
419 stream << indent_str;
420 stream << " * `first_nonopt' and `last_nonopt' are relocated so that they describe the new";
421 stream << "\n";
422 stream << indent_str;
423 stream << " * indices of the non-options in ARGV after they are moved.";
424 stream << "\n";
425 stream << indent_str;
426 stream << " */";
427 stream << "\n";
428 stream << indent_str;
429 stream << "static void exchange(char **argv, struct custom_getopt_data *d)";
430 stream << "\n";
431 stream << indent_str;
432 stream << "{";
433 stream << "\n";
434 stream << indent_str;
435 stream << " int bottom = d->first_nonopt;";
436 stream << "\n";
437 stream << indent_str;
438 stream << " int middle = d->last_nonopt;";
439 stream << "\n";
440 stream << indent_str;
441 stream << " int top = d->custom_optind;";
442 stream << "\n";
443 stream << indent_str;
444 stream << " char *tem;";
445 stream << "\n";
446 stream << indent_str;
447 stream << "\n";
448 stream << indent_str;
449 stream << " /*";
450 stream << "\n";
451 stream << indent_str;
452 stream << " * Exchange the shorter segment with the far end of the longer segment.";
453 stream << "\n";
454 stream << indent_str;
455 stream << " * That puts the shorter segment into the right place. It leaves the";
456 stream << "\n";
457 stream << indent_str;
458 stream << " * longer segment in the right place overall, but it consists of two";
459 stream << "\n";
460 stream << indent_str;
461 stream << " * parts that need to be swapped next.";
462 stream << "\n";
463 stream << indent_str;
464 stream << " */";
465 stream << "\n";
466 stream << indent_str;
467 stream << " while (top > middle && middle > bottom) {";
468 stream << "\n";
469 stream << indent_str;
470 stream << " if (top - middle > middle - bottom) {";
471 stream << "\n";
472 stream << indent_str;
473 stream << " /* Bottom segment is the short one. */";
474 stream << "\n";
475 stream << indent_str;
476 stream << " int len = middle - bottom;";
477 stream << "\n";
478 stream << indent_str;
479 stream << " int i;";
480 stream << "\n";
481 stream << indent_str;
482 stream << "\n";
483 stream << indent_str;
484 stream << " /* Swap it with the top part of the top segment. */";
485 stream << "\n";
486 stream << indent_str;
487 stream << " for (i = 0; i < len; i++) {";
488 stream << "\n";
489 stream << indent_str;
490 stream << " tem = argv[bottom + i];";
491 stream << "\n";
492 stream << indent_str;
493 stream << " argv[bottom + i] =";
494 stream << "\n";
495 stream << indent_str;
496 stream << " argv[top - (middle - bottom) + i];";
497 stream << "\n";
498 stream << indent_str;
499 stream << " argv[top - (middle - bottom) + i] = tem;";
500 stream << "\n";
501 stream << indent_str;
502 stream << " }";
503 stream << "\n";
504 stream << indent_str;
505 stream << " /* Exclude the moved bottom segment from further swapping. */";
506 stream << "\n";
507 stream << indent_str;
508 stream << " top -= len;";
509 stream << "\n";
510 stream << indent_str;
511 stream << " } else {";
512 stream << "\n";
513 stream << indent_str;
514 stream << " /* Top segment is the short one. */";
515 stream << "\n";
516 stream << indent_str;
517 stream << " int len = top - middle;";
518 stream << "\n";
519 stream << indent_str;
520 stream << " int i;";
521 stream << "\n";
522 stream << indent_str;
523 stream << "\n";
524 stream << indent_str;
525 stream << " /* Swap it with the bottom part of the bottom segment. */";
526 stream << "\n";
527 stream << indent_str;
528 stream << " for (i = 0; i < len; i++) {";
529 stream << "\n";
530 stream << indent_str;
531 stream << " tem = argv[bottom + i];";
532 stream << "\n";
533 stream << indent_str;
534 stream << " argv[bottom + i] = argv[middle + i];";
535 stream << "\n";
536 stream << indent_str;
537 stream << " argv[middle + i] = tem;";
538 stream << "\n";
539 stream << indent_str;
540 stream << " }";
541 stream << "\n";
542 stream << indent_str;
543 stream << " /* Exclude the moved top segment from further swapping. */";
544 stream << "\n";
545 stream << indent_str;
546 stream << " bottom += len;";
547 stream << "\n";
548 stream << indent_str;
549 stream << " }";
550 stream << "\n";
551 stream << indent_str;
552 stream << " }";
553 stream << "\n";
554 stream << indent_str;
555 stream << " /* Update records for the slots the non-options now occupy. */";
556 stream << "\n";
557 stream << indent_str;
558 stream << " d->first_nonopt += (d->custom_optind - d->last_nonopt);";
559 stream << "\n";
560 stream << indent_str;
561 stream << " d->last_nonopt = d->custom_optind;";
562 stream << "\n";
563 stream << indent_str;
564 stream << "}";
565 stream << "\n";
566 stream << indent_str;
567 stream << "\n";
568 stream << indent_str;
569 stream << "/* Initialize the internal data when the first call is made. */";
570 stream << "\n";
571 stream << indent_str;
572 stream << "static void custom_getopt_initialize(struct custom_getopt_data *d)";
573 stream << "\n";
574 stream << indent_str;
575 stream << "{";
576 stream << "\n";
577 stream << indent_str;
578 stream << " /*";
579 stream << "\n";
580 stream << indent_str;
581 stream << " * Start processing options with ARGV-element 1 (since ARGV-element 0";
582 stream << "\n";
583 stream << indent_str;
584 stream << " * is the program name); the sequence of previously skipped non-option";
585 stream << "\n";
586 stream << indent_str;
587 stream << " * ARGV-elements is empty.";
588 stream << "\n";
589 stream << indent_str;
590 stream << " */";
591 stream << "\n";
592 stream << indent_str;
593 stream << " d->first_nonopt = d->last_nonopt = d->custom_optind;";
594 stream << "\n";
595 stream << indent_str;
596 stream << " d->nextchar = NULL;";
597 stream << "\n";
598 stream << indent_str;
599 stream << " d->initialized = 1;";
600 stream << "\n";
601 stream << indent_str;
602 stream << "}";
603 stream << "\n";
604 stream << indent_str;
605 stream << "\n";
606 stream << indent_str;
607 stream << "#define NONOPTION_P (argv[d->custom_optind][0] != '-' || argv[d->custom_optind][1] == '\\0')";
608 stream << "\n";
609 stream << indent_str;
610 stream << "\n";
611 stream << indent_str;
612 stream << "/* return: zero: continue, nonzero: return given value to user */";
613 stream << "\n";
614 stream << indent_str;
615 stream << "static int shuffle_argv(int argc, char *const *argv,const struct option *longopts,";
616 stream << "\n";
617 stream << indent_str;
618 stream << " struct custom_getopt_data *d)";
619 stream << "\n";
620 stream << indent_str;
621 stream << "{";
622 stream << "\n";
623 stream << indent_str;
624 stream << " /*";
625 stream << "\n";
626 stream << indent_str;
627 stream << " * Give FIRST_NONOPT & LAST_NONOPT rational values if CUSTOM_OPTIND has been";
628 stream << "\n";
629 stream << indent_str;
630 stream << " * moved back by the user (who may also have changed the arguments).";
631 stream << "\n";
632 stream << indent_str;
633 stream << " */";
634 stream << "\n";
635 stream << indent_str;
636 stream << " if (d->last_nonopt > d->custom_optind)";
637 stream << "\n";
638 stream << indent_str;
639 stream << " d->last_nonopt = d->custom_optind;";
640 stream << "\n";
641 stream << indent_str;
642 stream << " if (d->first_nonopt > d->custom_optind)";
643 stream << "\n";
644 stream << indent_str;
645 stream << " d->first_nonopt = d->custom_optind;";
646 stream << "\n";
647 stream << indent_str;
648 stream << " /*";
649 stream << "\n";
650 stream << indent_str;
651 stream << " * If we have just processed some options following some";
652 stream << "\n";
653 stream << indent_str;
654 stream << " * non-options, exchange them so that the options come first.";
655 stream << "\n";
656 stream << indent_str;
657 stream << " */";
658 stream << "\n";
659 stream << indent_str;
660 stream << " if (d->first_nonopt != d->last_nonopt &&";
661 stream << "\n";
662 stream << indent_str;
663 stream << " d->last_nonopt != d->custom_optind)";
664 stream << "\n";
665 stream << indent_str;
666 stream << " exchange((char **) argv, d);";
667 stream << "\n";
668 stream << indent_str;
669 stream << " else if (d->last_nonopt != d->custom_optind)";
670 stream << "\n";
671 stream << indent_str;
672 stream << " d->first_nonopt = d->custom_optind;";
673 stream << "\n";
674 stream << indent_str;
675 stream << " /*";
676 stream << "\n";
677 stream << indent_str;
678 stream << " * Skip any additional non-options and extend the range of";
679 stream << "\n";
680 stream << indent_str;
681 stream << " * non-options previously skipped.";
682 stream << "\n";
683 stream << indent_str;
684 stream << " */";
685 stream << "\n";
686 stream << indent_str;
687 stream << " while (d->custom_optind < argc && NONOPTION_P)";
688 stream << "\n";
689 stream << indent_str;
690 stream << " d->custom_optind++;";
691 stream << "\n";
692 stream << indent_str;
693 stream << " d->last_nonopt = d->custom_optind;";
694 stream << "\n";
695 stream << indent_str;
696 stream << " /*";
697 stream << "\n";
698 stream << indent_str;
699 stream << " * The special ARGV-element `--' means premature end of options. Skip";
700 stream << "\n";
701 stream << indent_str;
702 stream << " * it like a null option, then exchange with previous non-options as if";
703 stream << "\n";
704 stream << indent_str;
705 stream << " * it were an option, then skip everything else like a non-option.";
706 stream << "\n";
707 stream << indent_str;
708 stream << " */";
709 stream << "\n";
710 stream << indent_str;
711 stream << " if (d->custom_optind != argc && !strcmp(argv[d->custom_optind], \"--\")) {";
712 stream << "\n";
713 stream << indent_str;
714 stream << " d->custom_optind++;";
715 stream << "\n";
716 stream << indent_str;
717 stream << " if (d->first_nonopt != d->last_nonopt";
718 stream << "\n";
719 stream << indent_str;
720 stream << " && d->last_nonopt != d->custom_optind)";
721 stream << "\n";
722 stream << indent_str;
723 stream << " exchange((char **) argv, d);";
724 stream << "\n";
725 stream << indent_str;
726 stream << " else if (d->first_nonopt == d->last_nonopt)";
727 stream << "\n";
728 stream << indent_str;
729 stream << " d->first_nonopt = d->custom_optind;";
730 stream << "\n";
731 stream << indent_str;
732 stream << " d->last_nonopt = argc;";
733 stream << "\n";
734 stream << indent_str;
735 stream << " d->custom_optind = argc;";
736 stream << "\n";
737 stream << indent_str;
738 stream << " }";
739 stream << "\n";
740 stream << indent_str;
741 stream << " /*";
742 stream << "\n";
743 stream << indent_str;
744 stream << " * If we have done all the ARGV-elements, stop the scan and back over";
745 stream << "\n";
746 stream << indent_str;
747 stream << " * any non-options that we skipped and permuted.";
748 stream << "\n";
749 stream << indent_str;
750 stream << " */";
751 stream << "\n";
752 stream << indent_str;
753 stream << " if (d->custom_optind == argc) {";
754 stream << "\n";
755 stream << indent_str;
756 stream << " /*";
757 stream << "\n";
758 stream << indent_str;
759 stream << " * Set the next-arg-index to point at the non-options that we";
760 stream << "\n";
761 stream << indent_str;
762 stream << " * previously skipped, so the caller will digest them.";
763 stream << "\n";
764 stream << indent_str;
765 stream << " */";
766 stream << "\n";
767 stream << indent_str;
768 stream << " if (d->first_nonopt != d->last_nonopt)";
769 stream << "\n";
770 stream << indent_str;
771 stream << " d->custom_optind = d->first_nonopt;";
772 stream << "\n";
773 stream << indent_str;
774 stream << " return -1;";
775 stream << "\n";
776 stream << indent_str;
777 stream << " }";
778 stream << "\n";
779 stream << indent_str;
780 stream << " /*";
781 stream << "\n";
782 stream << indent_str;
783 stream << " * If we have come to a non-option and did not permute it, either stop";
784 stream << "\n";
785 stream << indent_str;
786 stream << " * the scan or describe it to the caller and pass it by.";
787 stream << "\n";
788 stream << indent_str;
789 stream << " */";
790 stream << "\n";
791 stream << indent_str;
792 stream << " if (NONOPTION_P) {";
793 stream << "\n";
794 stream << indent_str;
795 stream << " d->custom_optarg = argv[d->custom_optind++];";
796 stream << "\n";
797 stream << indent_str;
798 stream << " return 1;";
799 stream << "\n";
800 stream << indent_str;
801 stream << " }";
802 stream << "\n";
803 stream << indent_str;
804 stream << " /*";
805 stream << "\n";
806 stream << indent_str;
807 stream << " * We have found another option-ARGV-element. Skip the initial";
808 stream << "\n";
809 stream << indent_str;
810 stream << " * punctuation.";
811 stream << "\n";
812 stream << indent_str;
813 stream << " */";
814 stream << "\n";
815 stream << indent_str;
816 stream << " d->nextchar = (argv[d->custom_optind] + 1 + (longopts != NULL && argv[d->custom_optind][1] == '-'));";
817 stream << "\n";
818 stream << indent_str;
819 stream << " return 0;";
820 stream << "\n";
821 stream << indent_str;
822 stream << "}";
823 stream << "\n";
824 stream << indent_str;
825 stream << "\n";
826 stream << indent_str;
827 stream << "/*";
828 stream << "\n";
829 stream << indent_str;
830 stream << " * Check whether the ARGV-element is a long option.";
831 stream << "\n";
832 stream << indent_str;
833 stream << " *";
834 stream << "\n";
835 stream << indent_str;
836 stream << " * If there's a long option \"fubar\" and the ARGV-element is \"-fu\", consider";
837 stream << "\n";
838 stream << indent_str;
839 stream << " * that an abbreviation of the long option, just like \"--fu\", and not \"-f\" with";
840 stream << "\n";
841 stream << indent_str;
842 stream << " * arg \"u\".";
843 stream << "\n";
844 stream << indent_str;
845 stream << " *";
846 stream << "\n";
847 stream << indent_str;
848 stream << " * This distinction seems to be the most useful approach.";
849 stream << "\n";
850 stream << indent_str;
851 stream << " *";
852 stream << "\n";
853 stream << indent_str;
854 stream << " */";
855 stream << "\n";
856 stream << indent_str;
857 stream << "static int check_long_opt(int argc, char *const *argv, const char *optstring,";
858 stream << "\n";
859 stream << indent_str;
860 stream << " const struct option *longopts, int *longind,";
861 stream << "\n";
862 stream << indent_str;
863 stream << " int print_errors, struct custom_getopt_data *d)";
864 stream << "\n";
865 stream << indent_str;
866 stream << "{";
867 stream << "\n";
868 stream << indent_str;
869 stream << " char *nameend;";
870 stream << "\n";
871 stream << indent_str;
872 stream << " const struct option *p;";
873 stream << "\n";
874 stream << indent_str;
875 stream << " const struct option *pfound = NULL;";
876 stream << "\n";
877 stream << indent_str;
878 stream << " int exact = 0;";
879 stream << "\n";
880 stream << indent_str;
881 stream << " int ambig = 0;";
882 stream << "\n";
883 stream << indent_str;
884 stream << " int indfound = -1;";
885 stream << "\n";
886 stream << indent_str;
887 stream << " int option_index;";
888 stream << "\n";
889 stream << indent_str;
890 stream << "\n";
891 stream << indent_str;
892 stream << " for (nameend = d->nextchar; *nameend && *nameend != '='; nameend++)";
893 stream << "\n";
894 stream << indent_str;
895 stream << " /* Do nothing. */ ;";
896 stream << "\n";
897 stream << indent_str;
898 stream << "\n";
899 stream << indent_str;
900 stream << " /* Test all long options for either exact match or abbreviated matches */";
901 stream << "\n";
902 stream << indent_str;
903 stream << " for (p = longopts, option_index = 0; p->name; p++, option_index++)";
904 stream << "\n";
905 stream << indent_str;
906 stream << " if (!strncmp(p->name, d->nextchar, nameend - d->nextchar)) {";
907 stream << "\n";
908 stream << indent_str;
909 stream << " if ((unsigned int) (nameend - d->nextchar)";
910 stream << "\n";
911 stream << indent_str;
912 stream << " == (unsigned int) strlen(p->name)) {";
913 stream << "\n";
914 stream << indent_str;
915 stream << " /* Exact match found. */";
916 stream << "\n";
917 stream << indent_str;
918 stream << " pfound = p;";
919 stream << "\n";
920 stream << indent_str;
921 stream << " indfound = option_index;";
922 stream << "\n";
923 stream << indent_str;
924 stream << " exact = 1;";
925 stream << "\n";
926 stream << indent_str;
927 stream << " break;";
928 stream << "\n";
929 stream << indent_str;
930 stream << " } else if (pfound == NULL) {";
931 stream << "\n";
932 stream << indent_str;
933 stream << " /* First nonexact match found. */";
934 stream << "\n";
935 stream << indent_str;
936 stream << " pfound = p;";
937 stream << "\n";
938 stream << indent_str;
939 stream << " indfound = option_index;";
940 stream << "\n";
941 stream << indent_str;
942 stream << " } else if (pfound->has_arg != p->has_arg";
943 stream << "\n";
944 stream << indent_str;
945 stream << " || pfound->flag != p->flag";
946 stream << "\n";
947 stream << indent_str;
948 stream << " || pfound->val != p->val)";
949 stream << "\n";
950 stream << indent_str;
951 stream << " /* Second or later nonexact match found. */";
952 stream << "\n";
953 stream << indent_str;
954 stream << " ambig = 1;";
955 stream << "\n";
956 stream << indent_str;
957 stream << " }";
958 stream << "\n";
959 stream << indent_str;
960 stream << " if (ambig && !exact) {";
961 stream << "\n";
962 stream << indent_str;
963 stream << " if (print_errors) {";
964 stream << "\n";
965 stream << indent_str;
966 stream << " fprintf(stderr,";
967 stream << "\n";
968 stream << indent_str;
969 stream << " \"%s: option `%s' is ambiguous\\n\",";
970 stream << "\n";
971 stream << indent_str;
972 stream << " argv[0], argv[d->custom_optind]);";
973 stream << "\n";
974 stream << indent_str;
975 stream << " }";
976 stream << "\n";
977 stream << indent_str;
978 stream << " d->nextchar += strlen(d->nextchar);";
979 stream << "\n";
980 stream << indent_str;
981 stream << " d->custom_optind++;";
982 stream << "\n";
983 stream << indent_str;
984 stream << " d->custom_optopt = 0;";
985 stream << "\n";
986 stream << indent_str;
987 stream << " return '?';";
988 stream << "\n";
989 stream << indent_str;
990 stream << " }";
991 stream << "\n";
992 stream << indent_str;
993 stream << " if (pfound) {";
994 stream << "\n";
995 stream << indent_str;
996 stream << " option_index = indfound;";
997 stream << "\n";
998 stream << indent_str;
999 stream << " d->custom_optind++;";
1000 stream << "\n";
1001 stream << indent_str;
1002 stream << " if (*nameend) {";
1003 stream << "\n";
1004 stream << indent_str;
1005 stream << " if (pfound->has_arg != no_argument)";
1006 stream << "\n";
1007 stream << indent_str;
1008 stream << " d->custom_optarg = nameend + 1;";
1009 stream << "\n";
1010 stream << indent_str;
1011 stream << " else {";
1012 stream << "\n";
1013 stream << indent_str;
1014 stream << " if (print_errors) {";
1015 stream << "\n";
1016 stream << indent_str;
1017 stream << " if (argv[d->custom_optind - 1][1] == '-') {";
1018 stream << "\n";
1019 stream << indent_str;
1020 stream << " /* --option */";
1021 stream << "\n";
1022 stream << indent_str;
1023 stream << " fprintf(stderr, \"%s: option `--%s' doesn't allow an argument\\n\",";
1024 stream << "\n";
1025 stream << indent_str;
1026 stream << " argv[0], pfound->name);";
1027 stream << "\n";
1028 stream << indent_str;
1029 stream << " } else {";
1030 stream << "\n";
1031 stream << indent_str;
1032 stream << " /* +option or -option */";
1033 stream << "\n";
1034 stream << indent_str;
1035 stream << " fprintf(stderr, \"%s: option `%c%s' doesn't allow an argument\\n\",";
1036 stream << "\n";
1037 stream << indent_str;
1038 stream << " argv[0], argv[d->custom_optind - 1][0], pfound->name);";
1039 stream << "\n";
1040 stream << indent_str;
1041 stream << " }";
1042 stream << "\n";
1043 stream << indent_str;
1044 stream << "\n";
1045 stream << indent_str;
1046 stream << " }";
1047 stream << "\n";
1048 stream << indent_str;
1049 stream << " d->nextchar += strlen(d->nextchar);";
1050 stream << "\n";
1051 stream << indent_str;
1052 stream << " d->custom_optopt = pfound->val;";
1053 stream << "\n";
1054 stream << indent_str;
1055 stream << " return '?';";
1056 stream << "\n";
1057 stream << indent_str;
1058 stream << " }";
1059 stream << "\n";
1060 stream << indent_str;
1061 stream << " } else if (pfound->has_arg == required_argument) {";
1062 stream << "\n";
1063 stream << indent_str;
1064 stream << " if (d->custom_optind < argc)";
1065 stream << "\n";
1066 stream << indent_str;
1067 stream << " d->custom_optarg = argv[d->custom_optind++];";
1068 stream << "\n";
1069 stream << indent_str;
1070 stream << " else {";
1071 stream << "\n";
1072 stream << indent_str;
1073 stream << " if (print_errors) {";
1074 stream << "\n";
1075 stream << indent_str;
1076 stream << " fprintf(stderr,";
1077 stream << "\n";
1078 stream << indent_str;
1079 stream << " \"%s: option `%s' requires an argument\\n\",";
1080 stream << "\n";
1081 stream << indent_str;
1082 stream << " argv[0],";
1083 stream << "\n";
1084 stream << indent_str;
1085 stream << " argv[d->custom_optind - 1]);";
1086 stream << "\n";
1087 stream << indent_str;
1088 stream << " }";
1089 stream << "\n";
1090 stream << indent_str;
1091 stream << " d->nextchar += strlen(d->nextchar);";
1092 stream << "\n";
1093 stream << indent_str;
1094 stream << " d->custom_optopt = pfound->val;";
1095 stream << "\n";
1096 stream << indent_str;
1097 stream << " return optstring[0] == ':' ? ':' : '?';";
1098 stream << "\n";
1099 stream << indent_str;
1100 stream << " }";
1101 stream << "\n";
1102 stream << indent_str;
1103 stream << " }";
1104 stream << "\n";
1105 stream << indent_str;
1106 stream << " d->nextchar += strlen(d->nextchar);";
1107 stream << "\n";
1108 stream << indent_str;
1109 stream << " if (longind != NULL)";
1110 stream << "\n";
1111 stream << indent_str;
1112 stream << " *longind = option_index;";
1113 stream << "\n";
1114 stream << indent_str;
1115 stream << " if (pfound->flag) {";
1116 stream << "\n";
1117 stream << indent_str;
1118 stream << " *(pfound->flag) = pfound->val;";
1119 stream << "\n";
1120 stream << indent_str;
1121 stream << " return 0;";
1122 stream << "\n";
1123 stream << indent_str;
1124 stream << " }";
1125 stream << "\n";
1126 stream << indent_str;
1127 stream << " return pfound->val;";
1128 stream << "\n";
1129 stream << indent_str;
1130 stream << " }";
1131 stream << "\n";
1132 stream << indent_str;
1133 stream << " /*";
1134 stream << "\n";
1135 stream << indent_str;
1136 stream << " * Can't find it as a long option. If this is not getopt_long_only, or";
1137 stream << "\n";
1138 stream << indent_str;
1139 stream << " * the option starts with '--' or is not a valid short option, then";
1140 stream << "\n";
1141 stream << indent_str;
1142 stream << " * it's an error. Otherwise interpret it as a short option.";
1143 stream << "\n";
1144 stream << indent_str;
1145 stream << " */";
1146 stream << "\n";
1147 stream << indent_str;
1148 stream << " if (print_errors) {";
1149 stream << "\n";
1150 stream << indent_str;
1151 stream << " if (argv[d->custom_optind][1] == '-') {";
1152 stream << "\n";
1153 stream << indent_str;
1154 stream << " /* --option */";
1155 stream << "\n";
1156 stream << indent_str;
1157 stream << " fprintf(stderr,";
1158 stream << "\n";
1159 stream << indent_str;
1160 stream << " \"%s: unrecognized option `--%s'\\n\",";
1161 stream << "\n";
1162 stream << indent_str;
1163 stream << " argv[0], d->nextchar);";
1164 stream << "\n";
1165 stream << indent_str;
1166 stream << " } else {";
1167 stream << "\n";
1168 stream << indent_str;
1169 stream << " /* +option or -option */";
1170 stream << "\n";
1171 stream << indent_str;
1172 stream << " fprintf(stderr,";
1173 stream << "\n";
1174 stream << indent_str;
1175 stream << " \"%s: unrecognized option `%c%s'\\n\",";
1176 stream << "\n";
1177 stream << indent_str;
1178 stream << " argv[0], argv[d->custom_optind][0],";
1179 stream << "\n";
1180 stream << indent_str;
1181 stream << " d->nextchar);";
1182 stream << "\n";
1183 stream << indent_str;
1184 stream << " }";
1185 stream << "\n";
1186 stream << indent_str;
1187 stream << " }";
1188 stream << "\n";
1189 stream << indent_str;
1190 stream << " d->nextchar = (char *) \"\";";
1191 stream << "\n";
1192 stream << indent_str;
1193 stream << " d->custom_optind++;";
1194 stream << "\n";
1195 stream << indent_str;
1196 stream << " d->custom_optopt = 0;";
1197 stream << "\n";
1198 stream << indent_str;
1199 stream << " return '?';";
1200 stream << "\n";
1201 stream << indent_str;
1202 stream << "}";
1203 stream << "\n";
1204 stream << indent_str;
1205 stream << "\n";
1206 stream << indent_str;
1207 stream << "static int check_short_opt(int argc, char *const *argv, const char *optstring,";
1208 stream << "\n";
1209 stream << indent_str;
1210 stream << " int print_errors, struct custom_getopt_data *d)";
1211 stream << "\n";
1212 stream << indent_str;
1213 stream << "{";
1214 stream << "\n";
1215 stream << indent_str;
1216 stream << " char c = *d->nextchar++;";
1217 stream << "\n";
1218 stream << indent_str;
1219 stream << " const char *temp = strchr(optstring, c);";
1220 stream << "\n";
1221 stream << indent_str;
1222 stream << "\n";
1223 stream << indent_str;
1224 stream << " /* Increment `custom_optind' when we start to process its last character. */";
1225 stream << "\n";
1226 stream << indent_str;
1227 stream << " if (*d->nextchar == '\\0')";
1228 stream << "\n";
1229 stream << indent_str;
1230 stream << " ++d->custom_optind;";
1231 stream << "\n";
1232 stream << indent_str;
1233 stream << " if (!temp || c == ':') {";
1234 stream << "\n";
1235 stream << indent_str;
1236 stream << " if (print_errors)";
1237 stream << "\n";
1238 stream << indent_str;
1239 stream << " fprintf(stderr, \"%s: invalid option -- %c\\n\", argv[0], c);";
1240 stream << "\n";
1241 stream << indent_str;
1242 stream << "\n";
1243 stream << indent_str;
1244 stream << " d->custom_optopt = c;";
1245 stream << "\n";
1246 stream << indent_str;
1247 stream << " return '?';";
1248 stream << "\n";
1249 stream << indent_str;
1250 stream << " }";
1251 stream << "\n";
1252 stream << indent_str;
1253 stream << " if (temp[1] == ':') {";
1254 stream << "\n";
1255 stream << indent_str;
1256 stream << " if (temp[2] == ':') {";
1257 stream << "\n";
1258 stream << indent_str;
1259 stream << " /* This is an option that accepts an argument optionally. */";
1260 stream << "\n";
1261 stream << indent_str;
1262 stream << " if (*d->nextchar != '\\0') {";
1263 stream << "\n";
1264 stream << indent_str;
1265 stream << " d->custom_optarg = d->nextchar;";
1266 stream << "\n";
1267 stream << indent_str;
1268 stream << " d->custom_optind++;";
1269 stream << "\n";
1270 stream << indent_str;
1271 stream << " } else";
1272 stream << "\n";
1273 stream << indent_str;
1274 stream << " d->custom_optarg = NULL;";
1275 stream << "\n";
1276 stream << indent_str;
1277 stream << " d->nextchar = NULL;";
1278 stream << "\n";
1279 stream << indent_str;
1280 stream << " } else {";
1281 stream << "\n";
1282 stream << indent_str;
1283 stream << " /* This is an option that requires an argument. */";
1284 stream << "\n";
1285 stream << indent_str;
1286 stream << " if (*d->nextchar != '\\0') {";
1287 stream << "\n";
1288 stream << indent_str;
1289 stream << " d->custom_optarg = d->nextchar;";
1290 stream << "\n";
1291 stream << indent_str;
1292 stream << " /*";
1293 stream << "\n";
1294 stream << indent_str;
1295 stream << " * If we end this ARGV-element by taking the";
1296 stream << "\n";
1297 stream << indent_str;
1298 stream << " * rest as an arg, we must advance to the next";
1299 stream << "\n";
1300 stream << indent_str;
1301 stream << " * element now.";
1302 stream << "\n";
1303 stream << indent_str;
1304 stream << " */";
1305 stream << "\n";
1306 stream << indent_str;
1307 stream << " d->custom_optind++;";
1308 stream << "\n";
1309 stream << indent_str;
1310 stream << " } else if (d->custom_optind == argc) {";
1311 stream << "\n";
1312 stream << indent_str;
1313 stream << " if (print_errors) {";
1314 stream << "\n";
1315 stream << indent_str;
1316 stream << " fprintf(stderr,";
1317 stream << "\n";
1318 stream << indent_str;
1319 stream << " \"%s: option requires an argument -- %c\\n\",";
1320 stream << "\n";
1321 stream << indent_str;
1322 stream << " argv[0], c);";
1323 stream << "\n";
1324 stream << indent_str;
1325 stream << " }";
1326 stream << "\n";
1327 stream << indent_str;
1328 stream << " d->custom_optopt = c;";
1329 stream << "\n";
1330 stream << indent_str;
1331 stream << " if (optstring[0] == ':')";
1332 stream << "\n";
1333 stream << indent_str;
1334 stream << " c = ':';";
1335 stream << "\n";
1336 stream << indent_str;
1337 stream << " else";
1338 stream << "\n";
1339 stream << indent_str;
1340 stream << " c = '?';";
1341 stream << "\n";
1342 stream << indent_str;
1343 stream << " } else";
1344 stream << "\n";
1345 stream << indent_str;
1346 stream << " /*";
1347 stream << "\n";
1348 stream << indent_str;
1349 stream << " * We already incremented `custom_optind' once;";
1350 stream << "\n";
1351 stream << indent_str;
1352 stream << " * increment it again when taking next ARGV-elt";
1353 stream << "\n";
1354 stream << indent_str;
1355 stream << " * as argument.";
1356 stream << "\n";
1357 stream << indent_str;
1358 stream << " */";
1359 stream << "\n";
1360 stream << indent_str;
1361 stream << " d->custom_optarg = argv[d->custom_optind++];";
1362 stream << "\n";
1363 stream << indent_str;
1364 stream << " d->nextchar = NULL;";
1365 stream << "\n";
1366 stream << indent_str;
1367 stream << " }";
1368 stream << "\n";
1369 stream << indent_str;
1370 stream << " }";
1371 stream << "\n";
1372 stream << indent_str;
1373 stream << " return c;";
1374 stream << "\n";
1375 stream << indent_str;
1376 stream << "}";
1377 stream << "\n";
1378 stream << indent_str;
1379 stream << "\n";
1380 stream << indent_str;
1381 stream << "/*";
1382 stream << "\n";
1383 stream << indent_str;
1384 stream << " * Scan elements of ARGV for option characters given in OPTSTRING.";
1385 stream << "\n";
1386 stream << indent_str;
1387 stream << " *";
1388 stream << "\n";
1389 stream << indent_str;
1390 stream << " * If an element of ARGV starts with '-', and is not exactly \"-\" or \"--\",";
1391 stream << "\n";
1392 stream << indent_str;
1393 stream << " * then it is an option element. The characters of this element";
1394 stream << "\n";
1395 stream << indent_str;
1396 stream << " * (aside from the initial '-') are option characters. If `getopt'";
1397 stream << "\n";
1398 stream << indent_str;
1399 stream << " * is called repeatedly, it returns successively each of the option characters";
1400 stream << "\n";
1401 stream << indent_str;
1402 stream << " * from each of the option elements.";
1403 stream << "\n";
1404 stream << indent_str;
1405 stream << " *";
1406 stream << "\n";
1407 stream << indent_str;
1408 stream << " * If `getopt' finds another option character, it returns that character,";
1409 stream << "\n";
1410 stream << indent_str;
1411 stream << " * updating `custom_optind' and `nextchar' so that the next call to `getopt' can";
1412 stream << "\n";
1413 stream << indent_str;
1414 stream << " * resume the scan with the following option character or ARGV-element.";
1415 stream << "\n";
1416 stream << indent_str;
1417 stream << " *";
1418 stream << "\n";
1419 stream << indent_str;
1420 stream << " * If there are no more option characters, `getopt' returns -1.";
1421 stream << "\n";
1422 stream << indent_str;
1423 stream << " * Then `custom_optind' is the index in ARGV of the first ARGV-element";
1424 stream << "\n";
1425 stream << indent_str;
1426 stream << " * that is not an option. (The ARGV-elements have been permuted";
1427 stream << "\n";
1428 stream << indent_str;
1429 stream << " * so that those that are not options now come last.)";
1430 stream << "\n";
1431 stream << indent_str;
1432 stream << " *";
1433 stream << "\n";
1434 stream << indent_str;
1435 stream << " * OPTSTRING is a string containing the legitimate option characters.";
1436 stream << "\n";
1437 stream << indent_str;
1438 stream << " * If an option character is seen that is not listed in OPTSTRING,";
1439 stream << "\n";
1440 stream << indent_str;
1441 stream << " * return '?' after printing an error message. If you set `custom_opterr' to";
1442 stream << "\n";
1443 stream << indent_str;
1444 stream << " * zero, the error message is suppressed but we still return '?'.";
1445 stream << "\n";
1446 stream << indent_str;
1447 stream << " *";
1448 stream << "\n";
1449 stream << indent_str;
1450 stream << " * If a char in OPTSTRING is followed by a colon, that means it wants an arg,";
1451 stream << "\n";
1452 stream << indent_str;
1453 stream << " * so the following text in the same ARGV-element, or the text of the following";
1454 stream << "\n";
1455 stream << indent_str;
1456 stream << " * ARGV-element, is returned in `custom_optarg'. Two colons mean an option that";
1457 stream << "\n";
1458 stream << indent_str;
1459 stream << " * wants an optional arg; if there is text in the current ARGV-element,";
1460 stream << "\n";
1461 stream << indent_str;
1462 stream << " * it is returned in `custom_optarg', otherwise `custom_optarg' is set to zero.";
1463 stream << "\n";
1464 stream << indent_str;
1465 stream << " *";
1466 stream << "\n";
1467 stream << indent_str;
1468 stream << " * If OPTSTRING starts with `-' or `+', it requests different methods of";
1469 stream << "\n";
1470 stream << indent_str;
1471 stream << " * handling the non-option ARGV-elements.";
1472 stream << "\n";
1473 stream << indent_str;
1474 stream << " * See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.";
1475 stream << "\n";
1476 stream << indent_str;
1477 stream << " *";
1478 stream << "\n";
1479 stream << indent_str;
1480 stream << " * Long-named options begin with `--' instead of `-'.";
1481 stream << "\n";
1482 stream << indent_str;
1483 stream << " * Their names may be abbreviated as long as the abbreviation is unique";
1484 stream << "\n";
1485 stream << indent_str;
1486 stream << " * or is an exact match for some defined option. If they have an";
1487 stream << "\n";
1488 stream << indent_str;
1489 stream << " * argument, it follows the option name in the same ARGV-element, separated";
1490 stream << "\n";
1491 stream << indent_str;
1492 stream << " * from the option name by a `=', or else the in next ARGV-element.";
1493 stream << "\n";
1494 stream << indent_str;
1495 stream << " * When `getopt' finds a long-named option, it returns 0 if that option's";
1496 stream << "\n";
1497 stream << indent_str;
1498 stream << " * `flag' field is nonzero, the value of the option's `val' field";
1499 stream << "\n";
1500 stream << indent_str;
1501 stream << " * if the `flag' field is zero.";
1502 stream << "\n";
1503 stream << indent_str;
1504 stream << " *";
1505 stream << "\n";
1506 stream << indent_str;
1507 stream << " * The elements of ARGV aren't really const, because we permute them.";
1508 stream << "\n";
1509 stream << indent_str;
1510 stream << " * But we pretend they're const in the prototype to be compatible";
1511 stream << "\n";
1512 stream << indent_str;
1513 stream << " * with other systems.";
1514 stream << "\n";
1515 stream << indent_str;
1516 stream << " *";
1517 stream << "\n";
1518 stream << indent_str;
1519 stream << " * LONGOPTS is a vector of `struct option' terminated by an";
1520 stream << "\n";
1521 stream << indent_str;
1522 stream << " * element containing a name which is zero.";
1523 stream << "\n";
1524 stream << indent_str;
1525 stream << " *";
1526 stream << "\n";
1527 stream << indent_str;
1528 stream << " * LONGIND returns the index in LONGOPT of the long-named option found.";
1529 stream << "\n";
1530 stream << indent_str;
1531 stream << " * It is only valid when a long-named option has been found by the most";
1532 stream << "\n";
1533 stream << indent_str;
1534 stream << " * recent call.";
1535 stream << "\n";
1536 stream << indent_str;
1537 stream << " *";
1538 stream << "\n";
1539 stream << indent_str;
1540 stream << " * Return the option character from OPTS just read. Return -1 when there are";
1541 stream << "\n";
1542 stream << indent_str;
1543 stream << " * no more options. For unrecognized options, or options missing arguments,";
1544 stream << "\n";
1545 stream << indent_str;
1546 stream << " * `custom_optopt' is set to the option letter, and '?' is returned.";
1547 stream << "\n";
1548 stream << indent_str;
1549 stream << " *";
1550 stream << "\n";
1551 stream << indent_str;
1552 stream << " * The OPTS string is a list of characters which are recognized option letters,";
1553 stream << "\n";
1554 stream << indent_str;
1555 stream << " * optionally followed by colons, specifying that that letter takes an";
1556 stream << "\n";
1557 stream << indent_str;
1558 stream << " * argument, to be placed in `custom_optarg'.";
1559 stream << "\n";
1560 stream << indent_str;
1561 stream << " *";
1562 stream << "\n";
1563 stream << indent_str;
1564 stream << " * If a letter in OPTS is followed by two colons, its argument is optional.";
1565 stream << "\n";
1566 stream << indent_str;
1567 stream << " * This behavior is specific to the GNU `getopt'.";
1568 stream << "\n";
1569 stream << indent_str;
1570 stream << " *";
1571 stream << "\n";
1572 stream << indent_str;
1573 stream << " * The argument `--' causes premature termination of argument scanning,";
1574 stream << "\n";
1575 stream << indent_str;
1576 stream << " * explicitly telling `getopt' that there are no more options. If OPTS begins";
1577 stream << "\n";
1578 stream << indent_str;
1579 stream << " * with `--', then non-option arguments are treated as arguments to the option";
1580 stream << "\n";
1581 stream << indent_str;
1582 stream << " * '\\0'. This behavior is specific to the GNU `getopt'.";
1583 stream << "\n";
1584 stream << indent_str;
1585 stream << " */";
1586 stream << "\n";
1587 stream << indent_str;
1588 stream << "\n";
1589 stream << indent_str;
1590 stream << "static int getopt_internal_r(int argc, char *const *argv, const char *optstring,";
1591 stream << "\n";
1592 stream << indent_str;
1593 stream << " const struct option *longopts, int *longind,";
1594 stream << "\n";
1595 stream << indent_str;
1596 stream << " struct custom_getopt_data *d)";
1597 stream << "\n";
1598 stream << indent_str;
1599 stream << "{";
1600 stream << "\n";
1601 stream << indent_str;
1602 stream << " int ret, print_errors = d->custom_opterr;";
1603 stream << "\n";
1604 stream << indent_str;
1605 stream << "\n";
1606 stream << indent_str;
1607 stream << " if (optstring[0] == ':')";
1608 stream << "\n";
1609 stream << indent_str;
1610 stream << " print_errors = 0;";
1611 stream << "\n";
1612 stream << indent_str;
1613 stream << " if (argc < 1)";
1614 stream << "\n";
1615 stream << indent_str;
1616 stream << " return -1;";
1617 stream << "\n";
1618 stream << indent_str;
1619 stream << " d->custom_optarg = NULL;";
1620 stream << "\n";
1621 stream << indent_str;
1622 stream << "\n";
1623 stream << indent_str;
1624 stream << " /* ";
1625 stream << "\n";
1626 stream << indent_str;
1627 stream << " * This is a big difference with GNU getopt, since optind == 0";
1628 stream << "\n";
1629 stream << indent_str;
1630 stream << " * means initialization while here 1 means first call.";
1631 stream << "\n";
1632 stream << indent_str;
1633 stream << " */";
1634 stream << "\n";
1635 stream << indent_str;
1636 stream << " if (d->custom_optind == 0 || !d->initialized) {";
1637 stream << "\n";
1638 stream << indent_str;
1639 stream << " if (d->custom_optind == 0)";
1640 stream << "\n";
1641 stream << indent_str;
1642 stream << " d->custom_optind = 1; /* Don't scan ARGV[0], the program name. */";
1643 stream << "\n";
1644 stream << indent_str;
1645 stream << " custom_getopt_initialize(d);";
1646 stream << "\n";
1647 stream << indent_str;
1648 stream << " }";
1649 stream << "\n";
1650 stream << indent_str;
1651 stream << " if (d->nextchar == NULL || *d->nextchar == '\\0') {";
1652 stream << "\n";
1653 stream << indent_str;
1654 stream << " ret = shuffle_argv(argc, argv, longopts, d);";
1655 stream << "\n";
1656 stream << indent_str;
1657 stream << " if (ret)";
1658 stream << "\n";
1659 stream << indent_str;
1660 stream << " return ret;";
1661 stream << "\n";
1662 stream << indent_str;
1663 stream << " }";
1664 stream << "\n";
1665 stream << indent_str;
1666 stream << " if (longopts && (argv[d->custom_optind][1] == '-' ))";
1667 stream << "\n";
1668 stream << indent_str;
1669 stream << " return check_long_opt(argc, argv, optstring, longopts,";
1670 stream << "\n";
1671 stream << indent_str;
1672 stream << " longind, print_errors, d);";
1673 stream << "\n";
1674 stream << indent_str;
1675 stream << " return check_short_opt(argc, argv, optstring, print_errors, d);";
1676 stream << "\n";
1677 stream << indent_str;
1678 stream << "}";
1679 stream << "\n";
1680 stream << indent_str;
1681 stream << "\n";
1682 stream << indent_str;
1683 stream << "static int custom_getopt_internal(int argc, char *const *argv, const char *optstring,";
1684 stream << "\n";
1685 stream << indent_str;
1686 stream << " const struct option *longopts, int *longind)";
1687 stream << "\n";
1688 stream << indent_str;
1689 stream << "{";
1690 stream << "\n";
1691 stream << indent_str;
1692 stream << " int result;";
1693 stream << "\n";
1694 stream << indent_str;
1695 stream << " /* Keep a global copy of all internal members of d */";
1696 stream << "\n";
1697 stream << indent_str;
1698 stream << " static struct custom_getopt_data d;";
1699 stream << "\n";
1700 stream << indent_str;
1701 stream << "\n";
1702 stream << indent_str;
1703 stream << " d.custom_optind = custom_optind;";
1704 stream << "\n";
1705 stream << indent_str;
1706 stream << " d.custom_opterr = custom_opterr;";
1707 stream << "\n";
1708 stream << indent_str;
1709 stream << " result = getopt_internal_r(argc, argv, optstring, longopts,";
1710 stream << "\n";
1711 stream << indent_str;
1712 stream << " longind, &d);";
1713 stream << "\n";
1714 stream << indent_str;
1715 stream << " custom_optind = d.custom_optind;";
1716 stream << "\n";
1717 stream << indent_str;
1718 stream << " custom_optarg = d.custom_optarg;";
1719 stream << "\n";
1720 stream << indent_str;
1721 stream << " custom_optopt = d.custom_optopt;";
1722 stream << "\n";
1723 stream << indent_str;
1724 stream << " return result;";
1725 stream << "\n";
1726 stream << indent_str;
1727 stream << "}";
1728 stream << "\n";
1729 stream << indent_str;
1730 stream << "\n";
1731 stream << indent_str;
1732 stream << "static int custom_getopt_long (int argc, char *const *argv, const char *options,";
1733 stream << "\n";
1734 stream << indent_str;
1735 stream << " const struct option *long_options, int *opt_index)";
1736 stream << "\n";
1737 stream << indent_str;
1738 stream << "{";
1739 stream << "\n";
1740 stream << indent_str;
1741 stream << " return custom_getopt_internal(argc, argv, options, long_options,";
1742 stream << "\n";
1743 stream << indent_str;
1744 stream << " opt_index);";
1745 stream << "\n";
1746 stream << indent_str;
1747 stream << "}";
1748 stream << "\n";
1749 stream << indent_str;
1750 }
1751