]> Creatis software - clitk.git/blob - cmake/gengetopt/skels/c_source.cc
Added FindGengetopt.cmake which compiles gengetopt if not installed.
[clitk.git] / cmake / gengetopt / skels / c_source.cc
1 /*
2  * File automatically generated by
3  * gengen 1.4.1 by Lorenzo Bettini 
4  * http://www.gnu.org/software/gengen
5  */
6
7 #include "c_source.h"
8
9 void
10 c_source_gen_class::generate_c_source(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 << "  File autogenerated by gengetopt ";
19   generate_string (generator_version, stream, indent + indent_str.length ());
20   stream << "\n";
21   stream << indent_str;
22   stream << "  generated with the following command:";
23   stream << "\n";
24   stream << indent_str;
25   indent = 2;
26   stream << "  ";
27   generate_string (command_line, stream, indent + indent_str.length ());
28   indent = 0;
29   stream << "\n";
30   stream << indent_str;
31   stream << "\n";
32   stream << indent_str;
33   stream << "  The developers of gengetopt consider the fixed text that goes in all";
34   stream << "\n";
35   stream << indent_str;
36   stream << "  gengetopt output files to be in the public domain:";
37   stream << "\n";
38   stream << indent_str;
39   stream << "  we make no copyright claims on it.";
40   stream << "\n";
41   stream << indent_str;
42   stream << "*/";
43   stream << "\n";
44   stream << indent_str;
45   stream << "\n";
46   stream << indent_str;
47   stream << "/* If we use autoconf.  */";
48   stream << "\n";
49   stream << indent_str;
50   stream << "#ifdef HAVE_CONFIG_H";
51   stream << "\n";
52   stream << indent_str;
53   stream << "#include \"config.h\"";
54   stream << "\n";
55   stream << indent_str;
56   stream << "#endif";
57   stream << "\n";
58   stream << indent_str;
59   stream << "\n";
60   stream << indent_str;
61   stream << "#include <stdio.h>";
62   stream << "\n";
63   stream << indent_str;
64   stream << "#include <stdlib.h>";
65   stream << "\n";
66   stream << indent_str;
67   stream << "#include <string.h>";
68   stream << "\n";
69   stream << indent_str;
70   stream << "\n";
71   stream << indent_str;
72   stream << "#ifndef FIX_UNUSED";
73   stream << "\n";
74   stream << indent_str;
75   stream << "#define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */";
76   stream << "\n";
77   stream << indent_str;
78   stream << "#endif";
79   stream << "\n";
80   stream << indent_str;
81   stream << "\n";
82   stream << indent_str;
83   if (( ! include_getopt ))
84     {
85       stream << "#include <getopt.h>";
86       stream << "\n";
87       stream << indent_str;
88     }
89   stream << "\n";
90   stream << indent_str;
91   stream << "#include \"";
92   generate_string (source_name, stream, indent + indent_str.length ());
93   stream << ".";
94   generate_string (header_file_ext, stream, indent + indent_str.length ());
95   stream << "\"";
96   stream << "\n";
97   stream << indent_str;
98   stream << "\n";
99   stream << indent_str;
100   stream << "const char *";
101   generate_string (args_info, stream, indent + indent_str.length ());
102   stream << "_purpose = \"";
103   generate_string (purpose, stream, indent + indent_str.length ());
104   stream << "\";";
105   stream << "\n";
106   stream << indent_str;
107   stream << "\n";
108   stream << indent_str;
109   stream << "const char *";
110   generate_string (args_info, stream, indent + indent_str.length ());
111   stream << "_usage = \"Usage: ";
112   if (no_package)
113     {
114       stream << "\" ";
115       generate_string (package_var_name, stream, indent + indent_str.length ());
116       stream << " \"";
117     }
118   generate_string (usage_string, stream, indent + indent_str.length ());
119   stream << "\";";
120   stream << "\n";
121   stream << indent_str;
122   stream << "\n";
123   stream << indent_str;
124   stream << "const char *";
125   generate_string (args_info, stream, indent + indent_str.length ());
126   stream << "_description = \"";
127   generate_string (description, stream, indent + indent_str.length ());
128   stream << "\";";
129   stream << "\n";
130   stream << indent_str;
131   stream << "\n";
132   stream << indent_str;
133   if (( has_hidden || has_details ))
134     {
135       if (has_details)
136         {
137           stream << "const char *";
138           generate_string (args_info, stream, indent + indent_str.length ());
139           stream << "_detailed_help[] = {";
140           stream << "\n";
141           stream << indent_str;
142           indent = 2;
143           stream << "  ";
144           if (detailed_help_option_print.size () > 0)
145             generate_string (detailed_help_option_print, stream, indent + indent_str.length ());
146           else
147             generate_detailed_help_option_print (stream, indent + indent_str.length ());
148           stream << "  0";
149           indent = 0;
150           stream << "\n";
151           stream << indent_str;
152           stream << "};";
153           stream << "\n";
154           stream << indent_str;
155           if (has_hidden)
156             {
157               stream << "static void";
158               stream << "\n";
159               stream << indent_str;
160               stream << "init_full_help_array(void)";
161               stream << "\n";
162               stream << indent_str;
163               stream << "{";
164               stream << "\n";
165               stream << indent_str;
166               indent = 2;
167               stream << "  ";
168               if (full_help_option_print.size () > 0)
169                 generate_string (full_help_option_print, stream, indent + indent_str.length ());
170               else
171                 generate_full_help_option_print (stream, indent + indent_str.length ());
172               indent = 0;
173               stream << "\n";
174               stream << indent_str;
175               stream << "}";
176               stream << "\n";
177               stream << indent_str;
178               stream << "\n";
179               stream << indent_str;
180               stream << "const char *";
181               generate_string (args_info, stream, indent + indent_str.length ());
182               stream << "_full_help[";
183               generate_string (help_string_num, stream, indent + indent_str.length ());
184               stream << "];";
185               stream << "\n";
186               stream << indent_str;
187             }
188         }
189       else
190         {
191           if (has_hidden)
192             {
193               stream << "const char *";
194               generate_string (args_info, stream, indent + indent_str.length ());
195               stream << "_full_help[] = {";
196               stream << "\n";
197               stream << indent_str;
198               indent = 2;
199               stream << "  ";
200               if (full_help_option_print.size () > 0)
201                 generate_string (full_help_option_print, stream, indent + indent_str.length ());
202               else
203                 generate_full_help_option_print (stream, indent + indent_str.length ());
204               stream << "  0";
205               indent = 0;
206               stream << "\n";
207               stream << indent_str;
208               stream << "};";
209               stream << "\n";
210               stream << indent_str;
211             }
212         }
213       stream << "\n";
214       stream << indent_str;
215       stream << "static void";
216       stream << "\n";
217       stream << indent_str;
218       stream << "init_help_array(void)";
219       stream << "\n";
220       stream << indent_str;
221       stream << "{";
222       stream << "\n";
223       stream << indent_str;
224       indent = 2;
225       stream << "  ";
226       if (help_option_print.size () > 0)
227         generate_string (help_option_print, stream, indent + indent_str.length ());
228       else
229         generate_help_option_print (stream, indent + indent_str.length ());
230       indent = 0;
231       stream << "\n";
232       stream << indent_str;
233       stream << "}";
234       stream << "\n";
235       stream << indent_str;
236       stream << "\n";
237       stream << indent_str;
238       stream << "const char *";
239       generate_string (args_info, stream, indent + indent_str.length ());
240       stream << "_help[";
241       generate_string (help_string_num, stream, indent + indent_str.length ());
242       stream << "];";
243       stream << "\n";
244       stream << indent_str;
245     }
246   else
247     {
248       stream << "const char *";
249       generate_string (args_info, stream, indent + indent_str.length ());
250       stream << "_help[] = {";
251       stream << "\n";
252       stream << indent_str;
253       indent = 2;
254       stream << "  ";
255       if (help_option_print.size () > 0)
256         generate_string (help_option_print, stream, indent + indent_str.length ());
257       else
258         generate_help_option_print (stream, indent + indent_str.length ());
259       stream << "  0";
260       indent = 0;
261       stream << "\n";
262       stream << indent_str;
263       stream << "};";
264       stream << "\n";
265       stream << indent_str;
266     }
267   stream << "\n";
268   stream << indent_str;
269   stream << "typedef enum {ARG_NO";
270   stream << "\n";
271   stream << indent_str;
272   if (has_arg_flag)
273     {
274       stream << "  , ARG_FLAG";
275       stream << "\n";
276       stream << indent_str;
277     }
278   if (has_arg_string)
279     {
280       stream << "  , ARG_STRING";
281       stream << "\n";
282       stream << indent_str;
283     }
284   if (has_arg_int)
285     {
286       stream << "  , ARG_INT";
287       stream << "\n";
288       stream << indent_str;
289     }
290   if (has_arg_short)
291     {
292       stream << "  , ARG_SHORT";
293       stream << "\n";
294       stream << indent_str;
295     }
296   if (has_arg_long)
297     {
298       stream << "  , ARG_LONG";
299       stream << "\n";
300       stream << indent_str;
301     }
302   if (has_arg_float)
303     {
304       stream << "  , ARG_FLOAT";
305       stream << "\n";
306       stream << indent_str;
307     }
308   if (has_arg_double)
309     {
310       stream << "  , ARG_DOUBLE";
311       stream << "\n";
312       stream << indent_str;
313     }
314   if (has_arg_longdouble)
315     {
316       stream << "  , ARG_LONGDOUBLE";
317       stream << "\n";
318       stream << indent_str;
319     }
320   if (has_arg_longlong)
321     {
322       stream << "  , ARG_LONGLONG";
323       stream << "\n";
324       stream << indent_str;
325     }
326   if (has_arg_enum)
327     {
328       stream << "  , ARG_ENUM";
329       stream << "\n";
330       stream << indent_str;
331     }
332   stream << "} ";
333   generate_string (parser_name, stream, indent + indent_str.length ());
334   stream << "_arg_type;";
335   stream << "\n";
336   stream << indent_str;
337   stream << "\n";
338   stream << indent_str;
339   stream << "static";
340   stream << "\n";
341   stream << indent_str;
342   stream << "void clear_given (struct ";
343   generate_string (args_info, stream, indent + indent_str.length ());
344   stream << " *args_info);";
345   stream << "\n";
346   stream << indent_str;
347   stream << "static";
348   stream << "\n";
349   stream << indent_str;
350   stream << "void clear_args (struct ";
351   generate_string (args_info, stream, indent + indent_str.length ());
352   stream << " *args_info);";
353   stream << "\n";
354   stream << indent_str;
355   stream << "\n";
356   stream << indent_str;
357   stream << "static int";
358   stream << "\n";
359   stream << indent_str;
360   generate_string (parser_name, stream, indent + indent_str.length ());
361   stream << "_internal (int argc, char **argv, struct ";
362   generate_string (args_info, stream, indent + indent_str.length ());
363   stream << " *args_info,";
364   stream << "\n";
365   stream << indent_str;
366   stream << "                        struct ";
367   generate_string (parser_name, stream, indent + indent_str.length ());
368   stream << "_params *params, const char *additional_error);";
369   stream << "\n";
370   stream << indent_str;
371   stream << "\n";
372   stream << indent_str;
373   if (check_required_options)
374     {
375       stream << "static int";
376       stream << "\n";
377       stream << indent_str;
378       generate_string (parser_name, stream, indent + indent_str.length ());
379       stream << "_required2 (struct ";
380       generate_string (args_info, stream, indent + indent_str.length ());
381       stream << " *args_info, const char *prog_name, const char *additional_error);";
382       stream << "\n";
383       stream << indent_str;
384     }
385   if (cmd_list)
386     {
387       stream << "struct line_list";
388       stream << "\n";
389       stream << indent_str;
390       stream << "{";
391       stream << "\n";
392       stream << indent_str;
393       stream << "  char * string_arg;";
394       stream << "\n";
395       stream << indent_str;
396       stream << "  struct line_list * next;";
397       stream << "\n";
398       stream << indent_str;
399       stream << "};";
400       stream << "\n";
401       stream << indent_str;
402       stream << "\n";
403       stream << indent_str;
404       stream << "static struct line_list *cmd_line_list = 0;";
405       stream << "\n";
406       stream << indent_str;
407       stream << "static struct line_list *cmd_line_list_tmp = 0;";
408       stream << "\n";
409       stream << indent_str;
410       stream << "\n";
411       stream << indent_str;
412       stream << "static void";
413       stream << "\n";
414       stream << indent_str;
415       stream << "free_cmd_list(void)";
416       stream << "\n";
417       stream << indent_str;
418       stream << "{";
419       stream << "\n";
420       stream << indent_str;
421       stream << "  /* free the list of a previous call */";
422       stream << "\n";
423       stream << indent_str;
424       stream << "  if (cmd_line_list)";
425       stream << "\n";
426       stream << indent_str;
427       stream << "    {";
428       stream << "\n";
429       stream << indent_str;
430       stream << "      while (cmd_line_list) {";
431       stream << "\n";
432       stream << indent_str;
433       stream << "        cmd_line_list_tmp = cmd_line_list;";
434       stream << "\n";
435       stream << indent_str;
436       stream << "        cmd_line_list = cmd_line_list->next;";
437       stream << "\n";
438       stream << indent_str;
439       stream << "        free (cmd_line_list_tmp->string_arg);";
440       stream << "\n";
441       stream << indent_str;
442       stream << "        free (cmd_line_list_tmp);";
443       stream << "\n";
444       stream << indent_str;
445       stream << "      }";
446       stream << "\n";
447       stream << indent_str;
448       stream << "    }";
449       stream << "\n";
450       stream << indent_str;
451       stream << "}";
452       stream << "\n";
453       stream << indent_str;
454       stream << "\n";
455       stream << indent_str;
456     }
457   stream << "\n";
458   stream << indent_str;
459   if (option_values.size () > 0)
460     generate_string (option_values, stream, indent + indent_str.length ());
461   else
462     generate_option_values (stream, indent + indent_str.length ());
463   stream << indent_str;
464   if (do_generate_strdup)
465     {
466       stream << "static char *";
467       stream << "\n";
468       stream << indent_str;
469       stream << "gengetopt_strdup (const char *s);";
470       stream << "\n";
471       stream << indent_str;
472       stream << "\n";
473       stream << indent_str;
474     }
475   stream << "static";
476   stream << "\n";
477   stream << indent_str;
478   stream << "void clear_given (struct ";
479   generate_string (args_info, stream, indent + indent_str.length ());
480   stream << " *args_info)";
481   stream << "\n";
482   stream << indent_str;
483   stream << "{";
484   stream << "\n";
485   stream << indent_str;
486   indent = 2;
487   if (given_init.size () > 0)
488     generate_string (given_init, stream, indent + indent_str.length ());
489   else
490     generate_given_init (stream, indent + indent_str.length ());
491   indent = 0;
492   stream << indent_str;
493   stream << "}";
494   stream << "\n";
495   stream << indent_str;
496   stream << "\n";
497   stream << indent_str;
498   stream << "static";
499   stream << "\n";
500   stream << indent_str;
501   stream << "void clear_args (struct ";
502   generate_string (args_info, stream, indent + indent_str.length ());
503   stream << " *args_info)";
504   stream << "\n";
505   stream << indent_str;
506   stream << "{";
507   stream << "\n";
508   stream << indent_str;
509   stream << "  FIX_UNUSED (args_info);";
510   stream << "\n";
511   stream << indent_str;
512   indent = 2;
513   stream << "  ";
514   if (clear_arg.size () > 0)
515     generate_string (clear_arg, stream, indent + indent_str.length ());
516   else
517     generate_clear_arg (stream, indent + indent_str.length ());
518   indent = 0;
519   stream << "\n";
520   stream << indent_str;
521   stream << "}";
522   stream << "\n";
523   stream << indent_str;
524   stream << "\n";
525   stream << indent_str;
526   stream << "static";
527   stream << "\n";
528   stream << indent_str;
529   stream << "void init_args_info(struct ";
530   generate_string (args_info, stream, indent + indent_str.length ());
531   stream << " *args_info)";
532   stream << "\n";
533   stream << indent_str;
534   stream << "{";
535   stream << "\n";
536   stream << indent_str;
537   if (( has_hidden && has_details ))
538     {
539       stream << "  init_full_help_array(); ";
540     }
541   stream << "\n";
542   stream << indent_str;
543   if (( has_hidden || has_details ))
544     {
545       stream << "  init_help_array(); ";
546     }
547   stream << "\n";
548   stream << indent_str;
549   indent = 2;
550   stream << "  ";
551   if (init_args_info.size () > 0)
552     generate_string (init_args_info, stream, indent + indent_str.length ());
553   else
554     generate_init_args_info (stream, indent + indent_str.length ());
555   indent = 0;
556   stream << "\n";
557   stream << indent_str;
558   stream << "}";
559   stream << "\n";
560   stream << indent_str;
561   stream << "\n";
562   stream << indent_str;
563   stream << "void";
564   stream << "\n";
565   stream << indent_str;
566   generate_string (parser_name, stream, indent + indent_str.length ());
567   stream << "_print_version (void)";
568   stream << "\n";
569   stream << indent_str;
570   stream << "{";
571   stream << "\n";
572   stream << indent_str;
573   stream << "  printf (\"%s %s\\n\",";
574   stream << "\n";
575   stream << indent_str;
576   stream << "     (strlen(";
577   generate_string (package_var_name, stream, indent + indent_str.length ());
578   stream << "_NAME) ? ";
579   generate_string (package_var_name, stream, indent + indent_str.length ());
580   stream << "_NAME : ";
581   generate_string (package_var_name, stream, indent + indent_str.length ());
582   stream << "),";
583   stream << "\n";
584   stream << indent_str;
585   indent = 5;
586   stream << "     ";
587   generate_string (version_var_name, stream, indent + indent_str.length ());
588   stream << ");";
589   indent = 0;
590   stream << "\n";
591   stream << indent_str;
592   stream << "}";
593   stream << "\n";
594   stream << indent_str;
595   stream << "\n";
596   stream << indent_str;
597   stream << "static void print_help_common(void) {";
598   stream << "\n";
599   stream << indent_str;
600   indent = 2;
601   stream << "  ";
602   generate_string (parser_name, stream, indent + indent_str.length ());
603   stream << "_print_version ();";
604   indent = 0;
605   stream << "\n";
606   stream << indent_str;
607   stream << "\n";
608   stream << indent_str;
609   stream << "  if (strlen(";
610   generate_string (args_info, stream, indent + indent_str.length ());
611   stream << "_purpose) > 0)";
612   stream << "\n";
613   stream << indent_str;
614   stream << "    printf(\"\\n%s\\n\", ";
615   generate_string (args_info, stream, indent + indent_str.length ());
616   stream << "_purpose);";
617   stream << "\n";
618   stream << indent_str;
619   stream << "\n";
620   stream << indent_str;
621   stream << "  if (strlen(";
622   generate_string (args_info, stream, indent + indent_str.length ());
623   stream << "_usage) > 0)";
624   stream << "\n";
625   stream << indent_str;
626   stream << "    printf(\"\\n%s\\n\", ";
627   generate_string (args_info, stream, indent + indent_str.length ());
628   stream << "_usage);";
629   stream << "\n";
630   stream << indent_str;
631   stream << "\n";
632   stream << indent_str;
633   stream << "  printf(\"\\n\");";
634   stream << "\n";
635   stream << indent_str;
636   stream << "\n";
637   stream << indent_str;
638   stream << "  if (strlen(";
639   generate_string (args_info, stream, indent + indent_str.length ());
640   stream << "_description) > 0)";
641   stream << "\n";
642   stream << indent_str;
643   stream << "    printf(\"%s\\n\\n\", ";
644   generate_string (args_info, stream, indent + indent_str.length ());
645   stream << "_description);";
646   stream << "\n";
647   stream << indent_str;
648   stream << "}";
649   stream << "\n";
650   stream << indent_str;
651   stream << "\n";
652   stream << indent_str;
653   stream << "void";
654   stream << "\n";
655   stream << indent_str;
656   generate_string (parser_name, stream, indent + indent_str.length ());
657   stream << "_print_help (void)";
658   stream << "\n";
659   stream << indent_str;
660   stream << "{";
661   stream << "\n";
662   stream << indent_str;
663   stream << "  int i = 0;";
664   stream << "\n";
665   stream << indent_str;
666   stream << "  print_help_common();";
667   stream << "\n";
668   stream << indent_str;
669   stream << "  while (";
670   generate_string (args_info, stream, indent + indent_str.length ());
671   stream << "_help[i])";
672   stream << "\n";
673   stream << indent_str;
674   stream << "    printf(\"%s\\n\", ";
675   generate_string (args_info, stream, indent + indent_str.length ());
676   stream << "_help[i++]);";
677   stream << "\n";
678   stream << indent_str;
679   stream << "}";
680   stream << "\n";
681   stream << indent_str;
682   stream << "\n";
683   stream << indent_str;
684   if (has_hidden)
685     {
686       stream << "void";
687       stream << "\n";
688       stream << indent_str;
689       generate_string (parser_name, stream, indent + indent_str.length ());
690       stream << "_print_full_help (void)";
691       stream << "\n";
692       stream << indent_str;
693       stream << "{";
694       stream << "\n";
695       stream << indent_str;
696       stream << "  int i = 0;";
697       stream << "\n";
698       stream << indent_str;
699       stream << "  print_help_common();";
700       stream << "\n";
701       stream << indent_str;
702       stream << "  while (";
703       generate_string (args_info, stream, indent + indent_str.length ());
704       stream << "_full_help[i])";
705       stream << "\n";
706       stream << indent_str;
707       stream << "    printf(\"%s\\n\", ";
708       generate_string (args_info, stream, indent + indent_str.length ());
709       stream << "_full_help[i++]);";
710       stream << "\n";
711       stream << indent_str;
712       stream << "}";
713       stream << "\n";
714       stream << indent_str;
715       stream << "\n";
716       stream << indent_str;
717     }
718   if (has_details)
719     {
720       stream << "void";
721       stream << "\n";
722       stream << indent_str;
723       generate_string (parser_name, stream, indent + indent_str.length ());
724       stream << "_print_detailed_help (void)";
725       stream << "\n";
726       stream << indent_str;
727       stream << "{";
728       stream << "\n";
729       stream << indent_str;
730       stream << "  int i = 0;";
731       stream << "\n";
732       stream << indent_str;
733       stream << "  print_help_common();";
734       stream << "\n";
735       stream << indent_str;
736       stream << "  while (";
737       generate_string (args_info, stream, indent + indent_str.length ());
738       stream << "_detailed_help[i])";
739       stream << "\n";
740       stream << indent_str;
741       stream << "    printf(\"%s\\n\", ";
742       generate_string (args_info, stream, indent + indent_str.length ());
743       stream << "_detailed_help[i++]);";
744       stream << "\n";
745       stream << indent_str;
746       stream << "}";
747       stream << "\n";
748       stream << indent_str;
749       stream << "\n";
750       stream << indent_str;
751     }
752   stream << "void";
753   stream << "\n";
754   stream << indent_str;
755   generate_string (parser_name, stream, indent + indent_str.length ());
756   stream << "_init (struct ";
757   generate_string (args_info, stream, indent + indent_str.length ());
758   stream << " *args_info)";
759   stream << "\n";
760   stream << indent_str;
761   stream << "{";
762   stream << "\n";
763   stream << indent_str;
764   stream << "  clear_given (args_info);";
765   stream << "\n";
766   stream << indent_str;
767   stream << "  clear_args (args_info);";
768   stream << "\n";
769   stream << indent_str;
770   stream << "  init_args_info (args_info);";
771   stream << "\n";
772   stream << indent_str;
773   if (handle_unamed)
774     {
775       stream << "\n";
776       stream << indent_str;
777       stream << "  args_info->inputs = 0;";
778       stream << "\n";
779       stream << indent_str;
780       stream << "  args_info->inputs_num = 0;";
781       stream << "\n";
782       stream << indent_str;
783     }
784   stream << "}";
785   stream << "\n";
786   stream << indent_str;
787   stream << "\n";
788   stream << indent_str;
789   stream << "void";
790   stream << "\n";
791   stream << indent_str;
792   generate_string (parser_name, stream, indent + indent_str.length ());
793   stream << "_params_init(struct ";
794   generate_string (parser_name, stream, indent + indent_str.length ());
795   stream << "_params *params)";
796   stream << "\n";
797   stream << indent_str;
798   stream << "{";
799   stream << "\n";
800   stream << indent_str;
801   stream << "  if (params)";
802   stream << "\n";
803   stream << indent_str;
804   stream << "    { ";
805   stream << "\n";
806   stream << indent_str;
807   stream << "      params->override = 0;";
808   stream << "\n";
809   stream << indent_str;
810   stream << "      params->initialize = 1;";
811   stream << "\n";
812   stream << indent_str;
813   stream << "      params->check_required = 1;";
814   stream << "\n";
815   stream << indent_str;
816   stream << "      params->check_ambiguity = 0;";
817   stream << "\n";
818   stream << indent_str;
819   stream << "      params->print_errors = 1;";
820   stream << "\n";
821   stream << indent_str;
822   stream << "    }";
823   stream << "\n";
824   stream << indent_str;
825   stream << "}";
826   stream << "\n";
827   stream << indent_str;
828   stream << "\n";
829   stream << indent_str;
830   stream << "struct ";
831   generate_string (parser_name, stream, indent + indent_str.length ());
832   stream << "_params *";
833   stream << "\n";
834   stream << indent_str;
835   generate_string (parser_name, stream, indent + indent_str.length ());
836   stream << "_params_create(void)";
837   stream << "\n";
838   stream << indent_str;
839   stream << "{";
840   stream << "\n";
841   stream << indent_str;
842   stream << "  struct ";
843   generate_string (parser_name, stream, indent + indent_str.length ());
844   stream << "_params *params = ";
845   stream << "\n";
846   stream << indent_str;
847   stream << "    (struct ";
848   generate_string (parser_name, stream, indent + indent_str.length ());
849   stream << "_params *)malloc(sizeof(struct ";
850   generate_string (parser_name, stream, indent + indent_str.length ());
851   stream << "_params));";
852   stream << "\n";
853   stream << indent_str;
854   indent = 2;
855   stream << "  ";
856   generate_string (parser_name, stream, indent + indent_str.length ());
857   stream << "_params_init(params);  ";
858   indent = 0;
859   stream << "\n";
860   stream << indent_str;
861   stream << "  return params;";
862   stream << "\n";
863   stream << indent_str;
864   stream << "}";
865   stream << "\n";
866   stream << indent_str;
867   stream << "\n";
868   stream << indent_str;
869   if (has_typed_options)
870     {
871       stream << "static void";
872       stream << "\n";
873       stream << indent_str;
874       stream << "free_string_field (char **s)";
875       stream << "\n";
876       stream << indent_str;
877       stream << "{";
878       stream << "\n";
879       stream << indent_str;
880       stream << "  if (*s)";
881       stream << "\n";
882       stream << indent_str;
883       stream << "    {";
884       stream << "\n";
885       stream << indent_str;
886       stream << "      free (*s);";
887       stream << "\n";
888       stream << indent_str;
889       stream << "      *s = 0;";
890       stream << "\n";
891       stream << indent_str;
892       stream << "    }";
893       stream << "\n";
894       stream << indent_str;
895       stream << "}";
896       stream << "\n";
897       stream << indent_str;
898     }
899   stream << "\n";
900   stream << indent_str;
901   if (multiple_token_functions)
902     {
903       stream << "/** ";
904       stream << "@";
905       stream << "brief generic value variable */";
906       stream << "\n";
907       stream << indent_str;
908       stream << "union generic_value {";
909       stream << "\n";
910       stream << indent_str;
911       if (( has_arg_int || has_arg_enum ))
912         {
913           stream << "    int int_arg;";
914           stream << "\n";
915           stream << indent_str;
916         }
917       if (has_arg_short)
918         {
919           stream << "    short short_arg;";
920           stream << "\n";
921           stream << indent_str;
922         }
923       if (has_arg_long)
924         {
925           stream << "    long long_arg;";
926           stream << "\n";
927           stream << indent_str;
928         }
929       if (has_arg_float)
930         {
931           stream << "    float float_arg;";
932           stream << "\n";
933           stream << indent_str;
934         }
935       if (has_arg_double)
936         {
937           stream << "    double double_arg;";
938           stream << "\n";
939           stream << indent_str;
940         }
941       if (has_arg_longdouble)
942         {
943           stream << "    long double longdouble_arg;";
944           stream << "\n";
945           stream << indent_str;
946         }
947       if (has_arg_longlong)
948         {
949           stream << "#ifdef HAVE_LONG_LONG";
950           stream << "\n";
951           stream << indent_str;
952           stream << "    long long int longlong_arg;";
953           stream << "\n";
954           stream << indent_str;
955           stream << "#else";
956           stream << "\n";
957           stream << indent_str;
958           stream << "    long longlong_arg;";
959           stream << "\n";
960           stream << indent_str;
961           stream << "#endif";
962           stream << "\n";
963           stream << indent_str;
964         }
965       stream << "    char *string_arg;";
966       stream << "\n";
967       stream << indent_str;
968       stream << "    const char *default_string_arg;";
969       stream << "\n";
970       stream << indent_str;
971       stream << "};";
972       stream << "\n";
973       stream << indent_str;
974       stream << "\n";
975       stream << indent_str;
976       stream << "/** ";
977       stream << "@";
978       stream << "brief holds temporary values for multiple options */";
979       stream << "\n";
980       stream << indent_str;
981       stream << "struct generic_list";
982       stream << "\n";
983       stream << indent_str;
984       stream << "{";
985       stream << "\n";
986       stream << indent_str;
987       stream << "  union generic_value arg;";
988       stream << "\n";
989       stream << indent_str;
990       stream << "  char *orig;";
991       stream << "\n";
992       stream << indent_str;
993       stream << "  struct generic_list *next;";
994       stream << "\n";
995       stream << indent_str;
996       stream << "};";
997       stream << "\n";
998       stream << indent_str;
999       stream << "\n";
1000       stream << indent_str;
1001       stream << "/**";
1002       stream << "\n";
1003       stream << indent_str;
1004       stream << " * ";
1005       stream << "@";
1006       stream << "brief add a node at the head of the list ";
1007       stream << "\n";
1008       stream << indent_str;
1009       stream << " */";
1010       stream << "\n";
1011       stream << indent_str;
1012       stream << "static void add_node(struct generic_list **list) {";
1013       stream << "\n";
1014       stream << indent_str;
1015       stream << "  struct generic_list *new_node = (struct generic_list *) malloc (sizeof (struct generic_list));";
1016       stream << "\n";
1017       stream << indent_str;
1018       stream << "  new_node->next = *list;";
1019       stream << "\n";
1020       stream << indent_str;
1021       stream << "  *list = new_node;";
1022       stream << "\n";
1023       stream << indent_str;
1024       stream << "  new_node->arg.string_arg = 0;";
1025       stream << "\n";
1026       stream << indent_str;
1027       stream << "  new_node->orig = 0;";
1028       stream << "\n";
1029       stream << indent_str;
1030       stream << "}";
1031       stream << "\n";
1032       stream << indent_str;
1033       stream << "\n";
1034       stream << indent_str;
1035       if (( ( ! multiple_options_all_string ) && multiple_token_functions ))
1036         {
1037           stream << "/**";
1038           stream << "\n";
1039           stream << indent_str;
1040           stream << " * The passed arg parameter is NOT set to 0 from this function";
1041           stream << "\n";
1042           stream << indent_str;
1043           stream << " */";
1044           stream << "\n";
1045           stream << indent_str;
1046           stream << "static void";
1047           stream << "\n";
1048           stream << indent_str;
1049           stream << "free_multiple_field(unsigned int len, void *arg, char ***orig)";
1050           stream << "\n";
1051           stream << indent_str;
1052           stream << "{";
1053           stream << "\n";
1054           stream << indent_str;
1055           stream << "  unsigned int i;";
1056           stream << "\n";
1057           stream << indent_str;
1058           stream << "  if (arg) {";
1059           stream << "\n";
1060           stream << indent_str;
1061           stream << "    for (i = 0; i < len; ++i)";
1062           stream << "\n";
1063           stream << indent_str;
1064           stream << "      {";
1065           stream << "\n";
1066           stream << indent_str;
1067           stream << "        free_string_field(&((*orig)[i]));";
1068           stream << "\n";
1069           stream << indent_str;
1070           stream << "      }";
1071           stream << "\n";
1072           stream << indent_str;
1073           stream << "\n";
1074           stream << indent_str;
1075           stream << "    free (arg);";
1076           stream << "\n";
1077           stream << indent_str;
1078           stream << "    free (*orig);";
1079           stream << "\n";
1080           stream << indent_str;
1081           stream << "    *orig = 0;";
1082           stream << "\n";
1083           stream << indent_str;
1084           stream << "  }";
1085           stream << "\n";
1086           stream << indent_str;
1087           stream << "}";
1088           stream << "\n";
1089           stream << indent_str;
1090         }
1091       stream << "\n";
1092       stream << indent_str;
1093       if (multiple_options_string)
1094         {
1095           stream << "static void";
1096           stream << "\n";
1097           stream << indent_str;
1098           stream << "free_multiple_string_field(unsigned int len, char ***arg, char ***orig)";
1099           stream << "\n";
1100           stream << indent_str;
1101           stream << "{";
1102           stream << "\n";
1103           stream << indent_str;
1104           stream << "  unsigned int i;";
1105           stream << "\n";
1106           stream << indent_str;
1107           stream << "  if (*arg) {";
1108           stream << "\n";
1109           stream << indent_str;
1110           stream << "    for (i = 0; i < len; ++i)";
1111           stream << "\n";
1112           stream << indent_str;
1113           stream << "      {";
1114           stream << "\n";
1115           stream << indent_str;
1116           stream << "        free_string_field(&((*arg)[i]));";
1117           stream << "\n";
1118           stream << indent_str;
1119           stream << "        free_string_field(&((*orig)[i]));";
1120           stream << "\n";
1121           stream << indent_str;
1122           stream << "      }";
1123           stream << "\n";
1124           stream << indent_str;
1125           stream << "    free_string_field(&((*arg)[0])); /* free default string */";
1126           stream << "\n";
1127           stream << indent_str;
1128           stream << "\n";
1129           stream << indent_str;
1130           stream << "    free (*arg);";
1131           stream << "\n";
1132           stream << indent_str;
1133           stream << "    *arg = 0;";
1134           stream << "\n";
1135           stream << indent_str;
1136           stream << "    free (*orig);";
1137           stream << "\n";
1138           stream << indent_str;
1139           stream << "    *orig = 0;";
1140           stream << "\n";
1141           stream << indent_str;
1142           stream << "  }";
1143           stream << "\n";
1144           stream << indent_str;
1145           stream << "}";
1146           stream << "\n";
1147           stream << indent_str;
1148         }
1149     }
1150   stream << "\n";
1151   stream << indent_str;
1152   stream << "static void";
1153   stream << "\n";
1154   stream << indent_str;
1155   generate_string (parser_name, stream, indent + indent_str.length ());
1156   stream << "_release (struct ";
1157   generate_string (args_info, stream, indent + indent_str.length ());
1158   stream << " *args_info)";
1159   stream << "\n";
1160   stream << indent_str;
1161   stream << "{";
1162   stream << "\n";
1163   stream << indent_str;
1164   if (handle_unamed)
1165     {
1166       stream << "  unsigned int i;";
1167     }
1168   stream << "\n";
1169   stream << indent_str;
1170   indent = 2;
1171   stream << "  ";
1172   if (free.size () > 0)
1173     generate_string (free, stream, indent + indent_str.length ());
1174   else
1175     generate_free (stream, indent + indent_str.length ());
1176   indent = 0;
1177   stream << "\n";
1178   stream << indent_str;
1179   indent = 2;
1180   stream << "  ";
1181   indent = 0;
1182   stream << "\n";
1183   stream << indent_str;
1184   if (handle_unamed)
1185     {
1186       stream << "  for (i = 0; i < args_info->inputs_num; ++i)";
1187       stream << "\n";
1188       stream << indent_str;
1189       stream << "    free (args_info->inputs [i]);";
1190       stream << "\n";
1191       stream << indent_str;
1192       stream << "\n";
1193       stream << indent_str;
1194       stream << "  if (args_info->inputs_num)";
1195       stream << "\n";
1196       stream << indent_str;
1197       stream << "    free (args_info->inputs);";
1198       stream << "\n";
1199       stream << indent_str;
1200     }
1201   stream << "\n";
1202   stream << indent_str;
1203   stream << "  clear_given (args_info);";
1204   stream << "\n";
1205   stream << indent_str;
1206   stream << "}";
1207   stream << "\n";
1208   stream << indent_str;
1209   stream << "\n";
1210   stream << indent_str;
1211   if (check_possible_values)
1212     {
1213       stream << "/**";
1214       stream << "\n";
1215       stream << indent_str;
1216       stream << " * ";
1217       stream << "@";
1218       stream << "param val the value to check";
1219       stream << "\n";
1220       stream << indent_str;
1221       stream << " * ";
1222       stream << "@";
1223       stream << "param values the possible values";
1224       stream << "\n";
1225       stream << indent_str;
1226       stream << " * ";
1227       stream << "@";
1228       stream << "return the index of the matched value:";
1229       stream << "\n";
1230       stream << indent_str;
1231       stream << " * -1 if no value matched,";
1232       stream << "\n";
1233       stream << indent_str;
1234       stream << " * -2 if more than one value has matched";
1235       stream << "\n";
1236       stream << indent_str;
1237       stream << " */";
1238       stream << "\n";
1239       stream << indent_str;
1240       stream << "static int";
1241       stream << "\n";
1242       stream << indent_str;
1243       stream << "check_possible_values(const char *val, const char *values[])";
1244       stream << "\n";
1245       stream << indent_str;
1246       stream << "{";
1247       stream << "\n";
1248       stream << indent_str;
1249       stream << "  int i, found, last;";
1250       stream << "\n";
1251       stream << indent_str;
1252       stream << "  size_t len;";
1253       stream << "\n";
1254       stream << indent_str;
1255       stream << "\n";
1256       stream << indent_str;
1257       stream << "  if (!val)   /* otherwise strlen() crashes below */";
1258       stream << "\n";
1259       stream << indent_str;
1260       stream << "    return -1; /* -1 means no argument for the option */";
1261       stream << "\n";
1262       stream << indent_str;
1263       stream << "\n";
1264       stream << indent_str;
1265       stream << "  found = last = 0;";
1266       stream << "\n";
1267       stream << indent_str;
1268       stream << "\n";
1269       stream << indent_str;
1270       stream << "  for (i = 0, len = strlen(val); values[i]; ++i)";
1271       stream << "\n";
1272       stream << indent_str;
1273       stream << "    {";
1274       stream << "\n";
1275       stream << indent_str;
1276       stream << "      if (strncmp(val, values[i], len) == 0)";
1277       stream << "\n";
1278       stream << indent_str;
1279       stream << "        {";
1280       stream << "\n";
1281       stream << indent_str;
1282       stream << "          ++found;";
1283       stream << "\n";
1284       stream << indent_str;
1285       stream << "          last = i;";
1286       stream << "\n";
1287       stream << indent_str;
1288       stream << "          if (strlen(values[i]) == len)";
1289       stream << "\n";
1290       stream << indent_str;
1291       stream << "            return i; /* exact macth no need to check more */";
1292       stream << "\n";
1293       stream << indent_str;
1294       stream << "        }";
1295       stream << "\n";
1296       stream << indent_str;
1297       stream << "    }";
1298       stream << "\n";
1299       stream << indent_str;
1300       stream << "\n";
1301       stream << indent_str;
1302       stream << "  if (found == 1) /* one match: OK */";
1303       stream << "\n";
1304       stream << indent_str;
1305       stream << "    return last;";
1306       stream << "\n";
1307       stream << indent_str;
1308       stream << "\n";
1309       stream << indent_str;
1310       stream << "  return (found ? -2 : -1); /* return many values or none matched */";
1311       stream << "\n";
1312       stream << indent_str;
1313       stream << "}";
1314       stream << "\n";
1315       stream << indent_str;
1316       stream << "\n";
1317       stream << indent_str;
1318     }
1319   stream << "\n";
1320   stream << indent_str;
1321   stream << "static void";
1322   stream << "\n";
1323   stream << indent_str;
1324   stream << "write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[])";
1325   stream << "\n";
1326   stream << indent_str;
1327   stream << "{";
1328   stream << "\n";
1329   stream << indent_str;
1330   if (check_possible_values)
1331     {
1332       stream << "  int found = -1;";
1333       stream << "\n";
1334       stream << indent_str;
1335     }
1336   else
1337     {
1338       stream << "  FIX_UNUSED (values);";
1339       stream << "\n";
1340       stream << indent_str;
1341     }
1342   stream << "  if (arg) {";
1343   stream << "\n";
1344   stream << indent_str;
1345   if (check_possible_values)
1346     {
1347       stream << "    if (values) {";
1348       stream << "\n";
1349       stream << indent_str;
1350       stream << "      found = check_possible_values(arg, values);      ";
1351       stream << "\n";
1352       stream << indent_str;
1353       stream << "    }";
1354       stream << "\n";
1355       stream << indent_str;
1356       stream << "    if (found >= 0)";
1357       stream << "\n";
1358       stream << indent_str;
1359       stream << "      fprintf(outfile, \"%s=\\\"%s\\\" # %s\\n\", opt, arg, values[found]);";
1360       stream << "\n";
1361       stream << indent_str;
1362       stream << "    else";
1363       stream << "\n";
1364       stream << indent_str;
1365       stream << "      fprintf(outfile, \"%s=\\\"%s\\\"\\n\", opt, arg);";
1366       stream << "\n";
1367       stream << indent_str;
1368     }
1369   else
1370     {
1371       stream << "    fprintf(outfile, \"%s=\\\"%s\\\"\\n\", opt, arg);";
1372       stream << "\n";
1373       stream << indent_str;
1374     }
1375   stream << "  } else {";
1376   stream << "\n";
1377   stream << indent_str;
1378   stream << "    fprintf(outfile, \"%s\\n\", opt);";
1379   stream << "\n";
1380   stream << indent_str;
1381   stream << "  }";
1382   stream << "\n";
1383   stream << indent_str;
1384   stream << "}";
1385   stream << "\n";
1386   stream << indent_str;
1387   stream << "\n";
1388   stream << indent_str;
1389   if (multiple_options)
1390     {
1391       stream << "static void";
1392       stream << "\n";
1393       stream << indent_str;
1394       stream << "write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, const char *values[])";
1395       stream << "\n";
1396       stream << indent_str;
1397       stream << "{";
1398       stream << "\n";
1399       stream << indent_str;
1400       stream << "  int i;";
1401       stream << "\n";
1402       stream << indent_str;
1403       indent = 2;
1404       stream << "  ";
1405       indent = 0;
1406       stream << "\n";
1407       stream << indent_str;
1408       stream << "  for (i = 0; i < len; ++i)";
1409       stream << "\n";
1410       stream << indent_str;
1411       stream << "    write_into_file(outfile, opt, (arg ? arg[i] : 0), values);";
1412       stream << "\n";
1413       stream << indent_str;
1414       stream << "}";
1415       stream << "\n";
1416       stream << indent_str;
1417     }
1418   stream << "\n";
1419   stream << indent_str;
1420   stream << "int";
1421   stream << "\n";
1422   stream << indent_str;
1423   generate_string (parser_name, stream, indent + indent_str.length ());
1424   stream << "_dump(FILE *outfile, struct ";
1425   generate_string (args_info, stream, indent + indent_str.length ());
1426   stream << " *args_info)";
1427   stream << "\n";
1428   stream << indent_str;
1429   stream << "{";
1430   stream << "\n";
1431   stream << indent_str;
1432   stream << "  int i = 0;";
1433   stream << "\n";
1434   stream << indent_str;
1435   stream << "\n";
1436   stream << indent_str;
1437   stream << "  if (!outfile)";
1438   stream << "\n";
1439   stream << indent_str;
1440   stream << "    {";
1441   stream << "\n";
1442   stream << indent_str;
1443   stream << "      fprintf (stderr, \"%s: cannot dump options to stream\\n\", ";
1444   generate_string (package_var_name, stream, indent + indent_str.length ());
1445   stream << ");";
1446   stream << "\n";
1447   stream << indent_str;
1448   stream << "      return EXIT_FAILURE;";
1449   stream << "\n";
1450   stream << indent_str;
1451   stream << "    }";
1452   stream << "\n";
1453   stream << indent_str;
1454   stream << "\n";
1455   stream << indent_str;
1456   indent = 2;
1457   stream << "  ";
1458   if (file_save_loop.size () > 0)
1459     generate_string (file_save_loop, stream, indent + indent_str.length ());
1460   else
1461     generate_file_save_loop (stream, indent + indent_str.length ());
1462   indent = 0;
1463   stream << "\n";
1464   stream << indent_str;
1465   stream << "\n";
1466   stream << indent_str;
1467   stream << "  i = EXIT_SUCCESS;";
1468   stream << "\n";
1469   stream << indent_str;
1470   stream << "  return i;";
1471   stream << "\n";
1472   stream << indent_str;
1473   stream << "}";
1474   stream << "\n";
1475   stream << indent_str;
1476   stream << "\n";
1477   stream << indent_str;
1478   stream << "int";
1479   stream << "\n";
1480   stream << indent_str;
1481   generate_string (parser_name, stream, indent + indent_str.length ());
1482   stream << "_file_save(const char *filename, struct ";
1483   generate_string (args_info, stream, indent + indent_str.length ());
1484   stream << " *args_info)";
1485   stream << "\n";
1486   stream << indent_str;
1487   stream << "{";
1488   stream << "\n";
1489   stream << indent_str;
1490   stream << "  FILE *outfile;";
1491   stream << "\n";
1492   stream << indent_str;
1493   stream << "  int i = 0;";
1494   stream << "\n";
1495   stream << indent_str;
1496   stream << "\n";
1497   stream << indent_str;
1498   stream << "  outfile = fopen(filename, \"w\");";
1499   stream << "\n";
1500   stream << indent_str;
1501   stream << "\n";
1502   stream << indent_str;
1503   stream << "  if (!outfile)";
1504   stream << "\n";
1505   stream << indent_str;
1506   stream << "    {";
1507   stream << "\n";
1508   stream << indent_str;
1509   stream << "      fprintf (stderr, \"%s: cannot open file for writing: %s\\n\", ";
1510   generate_string (package_var_name, stream, indent + indent_str.length ());
1511   stream << ", filename);";
1512   stream << "\n";
1513   stream << indent_str;
1514   stream << "      return EXIT_FAILURE;";
1515   stream << "\n";
1516   stream << indent_str;
1517   stream << "    }";
1518   stream << "\n";
1519   stream << indent_str;
1520   stream << "\n";
1521   stream << indent_str;
1522   stream << "  i = ";
1523   generate_string (parser_name, stream, indent + indent_str.length ());
1524   stream << "_dump(outfile, args_info);";
1525   stream << "\n";
1526   stream << indent_str;
1527   stream << "  fclose (outfile);";
1528   stream << "\n";
1529   stream << indent_str;
1530   stream << "\n";
1531   stream << indent_str;
1532   stream << "  return i;";
1533   stream << "\n";
1534   stream << indent_str;
1535   stream << "}";
1536   stream << "\n";
1537   stream << indent_str;
1538   stream << "\n";
1539   stream << indent_str;
1540   stream << "void";
1541   stream << "\n";
1542   stream << indent_str;
1543   generate_string (parser_name, stream, indent + indent_str.length ());
1544   stream << "_free (struct ";
1545   generate_string (args_info, stream, indent + indent_str.length ());
1546   stream << " *args_info)";
1547   stream << "\n";
1548   stream << indent_str;
1549   stream << "{";
1550   stream << "\n";
1551   stream << indent_str;
1552   indent = 2;
1553   stream << "  ";
1554   generate_string (parser_name, stream, indent + indent_str.length ());
1555   stream << "_release (args_info);";
1556   indent = 0;
1557   stream << "\n";
1558   stream << indent_str;
1559   stream << "}";
1560   stream << "\n";
1561   stream << indent_str;
1562   stream << "\n";
1563   stream << indent_str;
1564   if (do_generate_strdup)
1565     {
1566       stream << "/** ";
1567       stream << "@";
1568       stream << "brief replacement of strdup, which is not standard */";
1569       stream << "\n";
1570       stream << indent_str;
1571       stream << "char *";
1572       stream << "\n";
1573       stream << indent_str;
1574       stream << "gengetopt_strdup (const char *s)";
1575       stream << "\n";
1576       stream << indent_str;
1577       stream << "{";
1578       stream << "\n";
1579       stream << indent_str;
1580       stream << "  char *result = 0;";
1581       stream << "\n";
1582       stream << indent_str;
1583       stream << "  if (!s)";
1584       stream << "\n";
1585       stream << indent_str;
1586       stream << "    return result;";
1587       stream << "\n";
1588       stream << indent_str;
1589       stream << "\n";
1590       stream << indent_str;
1591       stream << "  result = (char*)malloc(strlen(s) + 1);";
1592       stream << "\n";
1593       stream << indent_str;
1594       stream << "  if (result == (char*)0)";
1595       stream << "\n";
1596       stream << indent_str;
1597       stream << "    return (char*)0;";
1598       stream << "\n";
1599       stream << indent_str;
1600       stream << "  strcpy(result, s);";
1601       stream << "\n";
1602       stream << indent_str;
1603       stream << "  return result;";
1604       stream << "\n";
1605       stream << indent_str;
1606       stream << "}";
1607       stream << "\n";
1608       stream << indent_str;
1609       stream << "\n";
1610       stream << indent_str;
1611     }
1612   if (multiple_token_functions)
1613     {
1614       stream << "static char *";
1615       stream << "\n";
1616       stream << indent_str;
1617       stream << "get_multiple_arg_token(const char *arg)";
1618       stream << "\n";
1619       stream << indent_str;
1620       stream << "{";
1621       stream << "\n";
1622       stream << indent_str;
1623       stream << "  const char *tok;";
1624       stream << "\n";
1625       stream << indent_str;
1626       stream << "  char *ret;";
1627       stream << "\n";
1628       stream << indent_str;
1629       stream << "  size_t len, num_of_escape, i, j;";
1630       stream << "\n";
1631       stream << indent_str;
1632       stream << "\n";
1633       stream << indent_str;
1634       stream << "  if (!arg)";
1635       stream << "\n";
1636       stream << indent_str;
1637       stream << "    return 0;";
1638       stream << "\n";
1639       stream << indent_str;
1640       stream << "\n";
1641       stream << indent_str;
1642       stream << "  tok = strchr (arg, ',');";
1643       stream << "\n";
1644       stream << indent_str;
1645       stream << "  num_of_escape = 0;";
1646       stream << "\n";
1647       stream << indent_str;
1648       stream << "\n";
1649       stream << indent_str;
1650       stream << "  /* make sure it is not escaped */";
1651       stream << "\n";
1652       stream << indent_str;
1653       stream << "  while (tok)";
1654       stream << "\n";
1655       stream << indent_str;
1656       stream << "    {";
1657       stream << "\n";
1658       stream << indent_str;
1659       stream << "      if (*(tok-1) == '\\\\')";
1660       stream << "\n";
1661       stream << indent_str;
1662       stream << "        {";
1663       stream << "\n";
1664       stream << indent_str;
1665       stream << "          /* find the next one */";
1666       stream << "\n";
1667       stream << indent_str;
1668       stream << "          tok = strchr (tok+1, ',');";
1669       stream << "\n";
1670       stream << indent_str;
1671       stream << "          ++num_of_escape;";
1672       stream << "\n";
1673       stream << indent_str;
1674       stream << "        }";
1675       stream << "\n";
1676       stream << indent_str;
1677       stream << "      else";
1678       stream << "\n";
1679       stream << indent_str;
1680       stream << "        break;";
1681       stream << "\n";
1682       stream << indent_str;
1683       stream << "    }";
1684       stream << "\n";
1685       stream << indent_str;
1686       stream << "\n";
1687       stream << indent_str;
1688       stream << "  if (tok)";
1689       stream << "\n";
1690       stream << indent_str;
1691       stream << "    len = (size_t)(tok - arg + 1);";
1692       stream << "\n";
1693       stream << indent_str;
1694       stream << "  else";
1695       stream << "\n";
1696       stream << indent_str;
1697       stream << "    len = strlen (arg) + 1;";
1698       stream << "\n";
1699       stream << indent_str;
1700       stream << "\n";
1701       stream << indent_str;
1702       stream << "  len -= num_of_escape;";
1703       stream << "\n";
1704       stream << indent_str;
1705       stream << "\n";
1706       stream << indent_str;
1707       stream << "  ret = (char *) malloc (len);";
1708       stream << "\n";
1709       stream << indent_str;
1710       stream << "\n";
1711       stream << indent_str;
1712       stream << "  i = 0;";
1713       stream << "\n";
1714       stream << indent_str;
1715       stream << "  j = 0;";
1716       stream << "\n";
1717       stream << indent_str;
1718       stream << "  while (arg[i] && (j < len-1))";
1719       stream << "\n";
1720       stream << indent_str;
1721       stream << "    {";
1722       stream << "\n";
1723       stream << indent_str;
1724       stream << "      if (arg[i] == '\\\\' && ";
1725       stream << "\n";
1726       stream << indent_str;
1727       stream << "         arg[ i + 1 ] && ";
1728       stream << "\n";
1729       stream << indent_str;
1730       stream << "         arg[ i + 1 ] == ',')";
1731       stream << "\n";
1732       stream << indent_str;
1733       stream << "        ++i;";
1734       stream << "\n";
1735       stream << indent_str;
1736       stream << "\n";
1737       stream << indent_str;
1738       stream << "      ret[j++] = arg[i++];";
1739       stream << "\n";
1740       stream << indent_str;
1741       stream << "    }";
1742       stream << "\n";
1743       stream << indent_str;
1744       stream << "\n";
1745       stream << indent_str;
1746       stream << "  ret[len-1] = '\\0';";
1747       stream << "\n";
1748       stream << indent_str;
1749       stream << "\n";
1750       stream << indent_str;
1751       stream << "  return ret;";
1752       stream << "\n";
1753       stream << indent_str;
1754       stream << "}";
1755       stream << "\n";
1756       stream << indent_str;
1757       stream << "\n";
1758       stream << indent_str;
1759       stream << "static const char *";
1760       stream << "\n";
1761       stream << indent_str;
1762       stream << "get_multiple_arg_token_next(const char *arg)";
1763       stream << "\n";
1764       stream << indent_str;
1765       stream << "{";
1766       stream << "\n";
1767       stream << indent_str;
1768       stream << "  const char *tok;";
1769       stream << "\n";
1770       stream << indent_str;
1771       stream << "\n";
1772       stream << indent_str;
1773       stream << "  if (!arg)";
1774       stream << "\n";
1775       stream << indent_str;
1776       stream << "    return 0;";
1777       stream << "\n";
1778       stream << indent_str;
1779       stream << "\n";
1780       stream << indent_str;
1781       stream << "  tok = strchr (arg, ',');";
1782       stream << "\n";
1783       stream << indent_str;
1784       stream << "\n";
1785       stream << indent_str;
1786       stream << "  /* make sure it is not escaped */";
1787       stream << "\n";
1788       stream << indent_str;
1789       stream << "  while (tok)";
1790       stream << "\n";
1791       stream << indent_str;
1792       stream << "    {";
1793       stream << "\n";
1794       stream << indent_str;
1795       stream << "      if (*(tok-1) == '\\\\')";
1796       stream << "\n";
1797       stream << indent_str;
1798       stream << "        {";
1799       stream << "\n";
1800       stream << indent_str;
1801       stream << "          /* find the next one */";
1802       stream << "\n";
1803       stream << indent_str;
1804       stream << "          tok = strchr (tok+1, ',');";
1805       stream << "\n";
1806       stream << indent_str;
1807       stream << "        }";
1808       stream << "\n";
1809       stream << indent_str;
1810       stream << "      else";
1811       stream << "\n";
1812       stream << indent_str;
1813       stream << "        break;";
1814       stream << "\n";
1815       stream << indent_str;
1816       stream << "    }";
1817       stream << "\n";
1818       stream << indent_str;
1819       stream << "\n";
1820       stream << indent_str;
1821       stream << "  if (! tok || strlen(tok) == 1)";
1822       stream << "\n";
1823       stream << indent_str;
1824       stream << "    return 0;";
1825       stream << "\n";
1826       stream << indent_str;
1827       stream << "\n";
1828       stream << indent_str;
1829       stream << "  return tok+1;";
1830       stream << "\n";
1831       stream << indent_str;
1832       stream << "}";
1833       stream << "\n";
1834       stream << indent_str;
1835       stream << "\n";
1836       stream << indent_str;
1837     }
1838   if (multiple_options)
1839     {
1840       stream << "static int";
1841       stream << "\n";
1842       stream << indent_str;
1843       stream << "check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc);";
1844       stream << "\n";
1845       stream << indent_str;
1846       stream << "\n";
1847       stream << indent_str;
1848       stream << "int";
1849       stream << "\n";
1850       stream << indent_str;
1851       stream << "check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc)";
1852       stream << "\n";
1853       stream << indent_str;
1854       stream << "{";
1855       stream << "\n";
1856       stream << indent_str;
1857       stream << "  int error = 0;";
1858       stream << "\n";
1859       stream << indent_str;
1860       stream << "\n";
1861       stream << indent_str;
1862       stream << "  if (option_given && (min > 0 || max > 0))";
1863       stream << "\n";
1864       stream << indent_str;
1865       stream << "    {";
1866       stream << "\n";
1867       stream << indent_str;
1868       stream << "      if (min > 0 && max > 0)";
1869       stream << "\n";
1870       stream << indent_str;
1871       stream << "        {";
1872       stream << "\n";
1873       stream << indent_str;
1874       stream << "          if (min == max)";
1875       stream << "\n";
1876       stream << indent_str;
1877       stream << "            {";
1878       stream << "\n";
1879       stream << indent_str;
1880       stream << "              /* specific occurrences */";
1881       stream << "\n";
1882       stream << indent_str;
1883       stream << "              if (option_given != (unsigned int) min)";
1884       stream << "\n";
1885       stream << indent_str;
1886       stream << "                {";
1887       stream << "\n";
1888       stream << indent_str;
1889       stream << "                  fprintf (stderr, \"%s: %s option occurrences must be %d\\n\",";
1890       stream << "\n";
1891       stream << indent_str;
1892       stream << "                    prog_name, option_desc, min);";
1893       stream << "\n";
1894       stream << indent_str;
1895       stream << "                  error = 1;";
1896       stream << "\n";
1897       stream << indent_str;
1898       stream << "                }";
1899       stream << "\n";
1900       stream << indent_str;
1901       stream << "            }";
1902       stream << "\n";
1903       stream << indent_str;
1904       stream << "          else if (option_given < (unsigned int) min";
1905       stream << "\n";
1906       stream << indent_str;
1907       stream << "                || option_given > (unsigned int) max)";
1908       stream << "\n";
1909       stream << indent_str;
1910       stream << "            {";
1911       stream << "\n";
1912       stream << indent_str;
1913       stream << "              /* range occurrences */";
1914       stream << "\n";
1915       stream << indent_str;
1916       stream << "              fprintf (stderr, \"%s: %s option occurrences must be between %d and %d\\n\",";
1917       stream << "\n";
1918       stream << indent_str;
1919       stream << "                prog_name, option_desc, min, max);";
1920       stream << "\n";
1921       stream << indent_str;
1922       stream << "              error = 1;";
1923       stream << "\n";
1924       stream << indent_str;
1925       stream << "            }";
1926       stream << "\n";
1927       stream << indent_str;
1928       stream << "        }";
1929       stream << "\n";
1930       stream << indent_str;
1931       stream << "      else if (min > 0)";
1932       stream << "\n";
1933       stream << indent_str;
1934       stream << "        {";
1935       stream << "\n";
1936       stream << indent_str;
1937       stream << "          /* at least check */";
1938       stream << "\n";
1939       stream << indent_str;
1940       stream << "          if (option_given < min)";
1941       stream << "\n";
1942       stream << indent_str;
1943       stream << "            {";
1944       stream << "\n";
1945       stream << indent_str;
1946       stream << "              fprintf (stderr, \"%s: %s option occurrences must be at least %d\\n\",";
1947       stream << "\n";
1948       stream << indent_str;
1949       stream << "                prog_name, option_desc, min);";
1950       stream << "\n";
1951       stream << indent_str;
1952       stream << "              error = 1;";
1953       stream << "\n";
1954       stream << indent_str;
1955       stream << "            }";
1956       stream << "\n";
1957       stream << indent_str;
1958       stream << "        }";
1959       stream << "\n";
1960       stream << indent_str;
1961       stream << "      else if (max > 0)";
1962       stream << "\n";
1963       stream << indent_str;
1964       stream << "        {";
1965       stream << "\n";
1966       stream << indent_str;
1967       stream << "          /* at most check */";
1968       stream << "\n";
1969       stream << indent_str;
1970       stream << "          if (option_given > max)";
1971       stream << "\n";
1972       stream << indent_str;
1973       stream << "            {";
1974       stream << "\n";
1975       stream << indent_str;
1976       stream << "              fprintf (stderr, \"%s: %s option occurrences must be at most %d\\n\",";
1977       stream << "\n";
1978       stream << indent_str;
1979       stream << "                prog_name, option_desc, max);";
1980       stream << "\n";
1981       stream << indent_str;
1982       stream << "              error = 1;";
1983       stream << "\n";
1984       stream << indent_str;
1985       stream << "            }";
1986       stream << "\n";
1987       stream << indent_str;
1988       stream << "        }";
1989       stream << "\n";
1990       stream << indent_str;
1991       stream << "    }";
1992       stream << "\n";
1993       stream << indent_str;
1994       indent = 4;
1995       stream << "    ";
1996       indent = 0;
1997       stream << "\n";
1998       stream << indent_str;
1999       stream << "  return error;";
2000       stream << "\n";
2001       stream << indent_str;
2002       stream << "}";
2003       stream << "\n";
2004       stream << indent_str;
2005     }
2006   if (reset_groups.size () > 0)
2007     generate_string (reset_groups, stream, indent + indent_str.length ());
2008   else
2009     generate_reset_groups (stream, indent + indent_str.length ());
2010   stream << indent_str;
2011   stream << "int";
2012   stream << "\n";
2013   stream << indent_str;
2014   generate_string (parser_name, stream, indent + indent_str.length ());
2015   stream << " (int argc, char **argv, struct ";
2016   generate_string (args_info, stream, indent + indent_str.length ());
2017   stream << " *args_info)";
2018   stream << "\n";
2019   stream << indent_str;
2020   stream << "{";
2021   stream << "\n";
2022   stream << indent_str;
2023   stream << "  return ";
2024   generate_string (parser_name, stream, indent + indent_str.length ());
2025   stream << "2 (argc, argv, args_info, 0, 1, 1);";
2026   stream << "\n";
2027   stream << indent_str;
2028   stream << "}";
2029   stream << "\n";
2030   stream << indent_str;
2031   stream << "\n";
2032   stream << indent_str;
2033   stream << "int";
2034   stream << "\n";
2035   stream << indent_str;
2036   generate_string (parser_name, stream, indent + indent_str.length ());
2037   stream << "_ext (int argc, char **argv, struct ";
2038   generate_string (args_info, stream, indent + indent_str.length ());
2039   stream << " *args_info,";
2040   stream << "\n";
2041   stream << indent_str;
2042   stream << "                   struct ";
2043   generate_string (parser_name, stream, indent + indent_str.length ());
2044   stream << "_params *params)";
2045   stream << "\n";
2046   stream << indent_str;
2047   stream << "{";
2048   stream << "\n";
2049   stream << indent_str;
2050   stream << "  int result;";
2051   stream << "\n";
2052   stream << indent_str;
2053   stream << "  result = ";
2054   generate_string (parser_name, stream, indent + indent_str.length ());
2055   stream << "_internal (argc, argv, args_info, params, 0);";
2056   stream << "\n";
2057   stream << indent_str;
2058   stream << "\n";
2059   stream << indent_str;
2060   indent = 2;
2061   stream << "  ";
2062   generate_string (final_exit, stream, indent + indent_str.length ());
2063   indent = 0;
2064   stream << "\n";
2065   stream << indent_str;
2066   stream << "}";
2067   stream << "\n";
2068   stream << indent_str;
2069   stream << "\n";
2070   stream << indent_str;
2071   stream << "int";
2072   stream << "\n";
2073   stream << indent_str;
2074   generate_string (parser_name, stream, indent + indent_str.length ());
2075   stream << "2 (int argc, char **argv, struct ";
2076   generate_string (args_info, stream, indent + indent_str.length ());
2077   stream << " *args_info, int override, int initialize, int check_required)";
2078   stream << "\n";
2079   stream << indent_str;
2080   stream << "{";
2081   stream << "\n";
2082   stream << indent_str;
2083   stream << "  int result;";
2084   stream << "\n";
2085   stream << indent_str;
2086   stream << "  struct ";
2087   generate_string (parser_name, stream, indent + indent_str.length ());
2088   stream << "_params params;";
2089   stream << "\n";
2090   stream << indent_str;
2091   indent = 2;
2092   stream << "  ";
2093   indent = 0;
2094   stream << "\n";
2095   stream << indent_str;
2096   stream << "  params.override = override;";
2097   stream << "\n";
2098   stream << indent_str;
2099   stream << "  params.initialize = initialize;";
2100   stream << "\n";
2101   stream << indent_str;
2102   stream << "  params.check_required = check_required;";
2103   stream << "\n";
2104   stream << indent_str;
2105   stream << "  params.check_ambiguity = 0;";
2106   stream << "\n";
2107   stream << indent_str;
2108   stream << "  params.print_errors = 1;";
2109   stream << "\n";
2110   stream << indent_str;
2111   stream << "\n";
2112   stream << indent_str;
2113   stream << "  result = ";
2114   generate_string (parser_name, stream, indent + indent_str.length ());
2115   stream << "_internal (argc, argv, args_info, &params, 0);";
2116   stream << "\n";
2117   stream << indent_str;
2118   stream << "\n";
2119   stream << indent_str;
2120   indent = 2;
2121   stream << "  ";
2122   generate_string (final_exit, stream, indent + indent_str.length ());
2123   indent = 0;
2124   stream << "\n";
2125   stream << indent_str;
2126   stream << "}";
2127   stream << "\n";
2128   stream << indent_str;
2129   stream << "\n";
2130   stream << indent_str;
2131   stream << "int";
2132   stream << "\n";
2133   stream << indent_str;
2134   generate_string (parser_name, stream, indent + indent_str.length ());
2135   stream << "_required (struct ";
2136   generate_string (args_info, stream, indent + indent_str.length ());
2137   stream << " *args_info, const char *prog_name)";
2138   stream << "\n";
2139   stream << indent_str;
2140   stream << "{";
2141   stream << "\n";
2142   stream << indent_str;
2143   if (check_required_options)
2144     {
2145       stream << "  int result = EXIT_SUCCESS;";
2146       stream << "\n";
2147       stream << indent_str;
2148       stream << "\n";
2149       stream << indent_str;
2150       stream << "  if (";
2151       generate_string (parser_name, stream, indent + indent_str.length ());
2152       stream << "_required2(args_info, prog_name, 0) > 0)";
2153       stream << "\n";
2154       stream << indent_str;
2155       stream << "    result = EXIT_FAILURE;";
2156       stream << "\n";
2157       stream << indent_str;
2158       stream << "\n";
2159       stream << indent_str;
2160       indent = 2;
2161       stream << "  ";
2162       generate_string (final_exit, stream, indent + indent_str.length ());
2163       indent = 0;
2164       stream << "\n";
2165       stream << indent_str;
2166     }
2167   else
2168     {
2169       stream << "  FIX_UNUSED (args_info);";
2170       stream << "\n";
2171       stream << indent_str;
2172       stream << "  FIX_UNUSED (prog_name);";
2173       stream << "\n";
2174       stream << indent_str;
2175       stream << "  return EXIT_SUCCESS;";
2176       stream << "\n";
2177       stream << indent_str;
2178     }
2179   stream << "}";
2180   stream << "\n";
2181   stream << indent_str;
2182   stream << "\n";
2183   stream << indent_str;
2184   if (check_required_options)
2185     {
2186       stream << "int";
2187       stream << "\n";
2188       stream << indent_str;
2189       generate_string (parser_name, stream, indent + indent_str.length ());
2190       stream << "_required2 (struct ";
2191       generate_string (args_info, stream, indent + indent_str.length ());
2192       stream << " *args_info, const char *prog_name, const char *additional_error)";
2193       stream << "\n";
2194       stream << indent_str;
2195       stream << "{";
2196       stream << "\n";
2197       stream << indent_str;
2198       stream << "  int error = 0;";
2199       stream << "\n";
2200       stream << indent_str;
2201       stream << "  FIX_UNUSED (additional_error);";
2202       stream << "\n";
2203       stream << indent_str;
2204       stream << "\n";
2205       stream << indent_str;
2206       stream << "  /* checks for required options */";
2207       stream << "\n";
2208       stream << indent_str;
2209       indent = 2;
2210       stream << "  ";
2211       if (handle_required.size () > 0)
2212         generate_string (handle_required, stream, indent + indent_str.length ());
2213       else
2214         generate_handle_required (stream, indent + indent_str.length ());
2215       indent = 0;
2216       stream << "\n";
2217       stream << indent_str;
2218       stream << "  /* checks for dependences among options */";
2219       stream << "\n";
2220       stream << indent_str;
2221       indent = 2;
2222       if (handle_dependencies.size () > 0)
2223         generate_string (handle_dependencies, stream, indent + indent_str.length ());
2224       else
2225         generate_handle_dependencies (stream, indent + indent_str.length ());
2226       indent = 0;
2227       stream << indent_str;
2228       stream << "\n";
2229       stream << indent_str;
2230       stream << "  return error;";
2231       stream << "\n";
2232       stream << indent_str;
2233       stream << "}";
2234       stream << "\n";
2235       stream << indent_str;
2236       stream << "\n";
2237       stream << indent_str;
2238     }
2239   if (include_getopt)
2240     {
2241       if (custom_getopt.size () > 0)
2242         generate_string (custom_getopt, stream, indent + indent_str.length ());
2243       else
2244         generate_custom_getopt (stream, indent + indent_str.length ());
2245       stream << "\n";
2246       stream << indent_str;
2247     }
2248   stream << "\n";
2249   stream << indent_str;
2250   stream << "static char *package_name = 0;";
2251   stream << "\n";
2252   stream << indent_str;
2253   stream << "\n";
2254   stream << indent_str;
2255   if (( ! no_options ))
2256     {
2257       stream << "/**";
2258       stream << "\n";
2259       stream << indent_str;
2260       stream << " * ";
2261       stream << "@";
2262       stream << "brief updates an option";
2263       stream << "\n";
2264       stream << indent_str;
2265       stream << " * ";
2266       stream << "@";
2267       stream << "param field the generic pointer to the field to update";
2268       stream << "\n";
2269       stream << indent_str;
2270       stream << " * ";
2271       stream << "@";
2272       stream << "param orig_field the pointer to the orig field";
2273       stream << "\n";
2274       stream << indent_str;
2275       stream << " * ";
2276       stream << "@";
2277       stream << "param field_given the pointer to the number of occurrence of this option";
2278       stream << "\n";
2279       stream << indent_str;
2280       stream << " * ";
2281       stream << "@";
2282       stream << "param prev_given the pointer to the number of occurrence already seen";
2283       stream << "\n";
2284       stream << indent_str;
2285       stream << " * ";
2286       stream << "@";
2287       stream << "param value the argument for this option (if null no arg was specified)";
2288       stream << "\n";
2289       stream << indent_str;
2290       stream << " * ";
2291       stream << "@";
2292       stream << "param possible_values the possible values for this option (if specified)";
2293       stream << "\n";
2294       stream << indent_str;
2295       stream << " * ";
2296       stream << "@";
2297       stream << "param default_value the default value (in case the option only accepts fixed values)";
2298       stream << "\n";
2299       stream << indent_str;
2300       stream << " * ";
2301       stream << "@";
2302       stream << "param arg_type the type of this option";
2303       stream << "\n";
2304       stream << indent_str;
2305       stream << " * ";
2306       stream << "@";
2307       stream << "param check_ambiguity ";
2308       stream << "@";
2309       stream << "see ";
2310       generate_string (parser_name, stream, indent + indent_str.length ());
2311       stream << "_params.check_ambiguity";
2312       stream << "\n";
2313       stream << indent_str;
2314       stream << " * ";
2315       stream << "@";
2316       stream << "param override ";
2317       stream << "@";
2318       stream << "see ";
2319       generate_string (parser_name, stream, indent + indent_str.length ());
2320       stream << "_params.override";
2321       stream << "\n";
2322       stream << indent_str;
2323       stream << " * ";
2324       stream << "@";
2325       stream << "param no_free whether to free a possible previous value";
2326       stream << "\n";
2327       stream << indent_str;
2328       stream << " * ";
2329       stream << "@";
2330       stream << "param multiple_option whether this is a multiple option";
2331       stream << "\n";
2332       stream << indent_str;
2333       stream << " * ";
2334       stream << "@";
2335       stream << "param long_opt the corresponding long option";
2336       stream << "\n";
2337       stream << indent_str;
2338       stream << " * ";
2339       stream << "@";
2340       stream << "param short_opt the corresponding short option (or '-' if none)";
2341       stream << "\n";
2342       stream << indent_str;
2343       stream << " * ";
2344       stream << "@";
2345       stream << "param additional_error possible further error specification";
2346       stream << "\n";
2347       stream << indent_str;
2348       stream << " */";
2349       stream << "\n";
2350       stream << indent_str;
2351       stream << "static";
2352       stream << "\n";
2353       stream << indent_str;
2354       stream << "int update_arg(void *field, char **orig_field,";
2355       stream << "\n";
2356       stream << indent_str;
2357       stream << "               unsigned int *field_given, unsigned int *prev_given, ";
2358       stream << "\n";
2359       stream << indent_str;
2360       stream << "               char *value, const char *possible_values[],";
2361       stream << "\n";
2362       stream << indent_str;
2363       stream << "               const char *default_value,";
2364       stream << "\n";
2365       stream << indent_str;
2366       indent = 15;
2367       stream << "               ";
2368       generate_string (parser_name, stream, indent + indent_str.length ());
2369       stream << "_arg_type arg_type,";
2370       indent = 0;
2371       stream << "\n";
2372       stream << indent_str;
2373       stream << "               int check_ambiguity, int override,";
2374       stream << "\n";
2375       stream << indent_str;
2376       stream << "               int no_free, int multiple_option,";
2377       stream << "\n";
2378       stream << indent_str;
2379       stream << "               const char *long_opt, char short_opt,";
2380       stream << "\n";
2381       stream << indent_str;
2382       stream << "               const char *additional_error)";
2383       stream << "\n";
2384       stream << indent_str;
2385       stream << "{";
2386       stream << "\n";
2387       stream << indent_str;
2388       stream << "  char *stop_char = 0;";
2389       stream << "\n";
2390       stream << indent_str;
2391       stream << "  const char *val = value;";
2392       stream << "\n";
2393       stream << indent_str;
2394       stream << "  int found;";
2395       stream << "\n";
2396       stream << indent_str;
2397       if (has_arg_string)
2398         {
2399           stream << "  char **string_field;";
2400           stream << "\n";
2401           stream << indent_str;
2402         }
2403       stream << "  FIX_UNUSED (field);";
2404       stream << "\n";
2405       stream << indent_str;
2406       stream << "\n";
2407       stream << indent_str;
2408       stream << "  stop_char = 0;";
2409       stream << "\n";
2410       stream << indent_str;
2411       stream << "  found = 0;";
2412       stream << "\n";
2413       stream << indent_str;
2414       stream << "\n";
2415       stream << indent_str;
2416       stream << "  if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given)))";
2417       stream << "\n";
2418       stream << indent_str;
2419       stream << "    {";
2420       stream << "\n";
2421       stream << indent_str;
2422       stream << "      if (short_opt != '-')";
2423       stream << "\n";
2424       stream << indent_str;
2425       stream << "        fprintf (stderr, \"%s: `--%s' (`-%c') option given more than once%s\\n\", ";
2426       stream << "\n";
2427       stream << indent_str;
2428       stream << "               package_name, long_opt, short_opt,";
2429       stream << "\n";
2430       stream << indent_str;
2431       stream << "               (additional_error ? additional_error : \"\"));";
2432       stream << "\n";
2433       stream << indent_str;
2434       stream << "      else";
2435       stream << "\n";
2436       stream << indent_str;
2437       stream << "        fprintf (stderr, \"%s: `--%s' option given more than once%s\\n\", ";
2438       stream << "\n";
2439       stream << indent_str;
2440       stream << "               package_name, long_opt,";
2441       stream << "\n";
2442       stream << indent_str;
2443       stream << "               (additional_error ? additional_error : \"\"));";
2444       stream << "\n";
2445       stream << indent_str;
2446       stream << "      return 1; /* failure */";
2447       stream << "\n";
2448       stream << indent_str;
2449       stream << "    }";
2450       stream << "\n";
2451       stream << indent_str;
2452       stream << "\n";
2453       stream << indent_str;
2454       if (check_possible_values)
2455         {
2456           stream << "  if (possible_values && (found = check_possible_values((value ? value : default_value), possible_values)) < 0)";
2457           stream << "\n";
2458           stream << indent_str;
2459           stream << "    {";
2460           stream << "\n";
2461           stream << indent_str;
2462           stream << "      if (short_opt != '-')";
2463           stream << "\n";
2464           stream << indent_str;
2465           stream << "        fprintf (stderr, \"%s: %s argument, \\\"%s\\\", for option `--%s' (`-%c')%s\\n\", ";
2466           stream << "\n";
2467           stream << indent_str;
2468           stream << "          package_name, (found == -2) ? \"ambiguous\" : \"invalid\", value, long_opt, short_opt,";
2469           stream << "\n";
2470           stream << indent_str;
2471           stream << "          (additional_error ? additional_error : \"\"));";
2472           stream << "\n";
2473           stream << indent_str;
2474           stream << "      else";
2475           stream << "\n";
2476           stream << indent_str;
2477           stream << "        fprintf (stderr, \"%s: %s argument, \\\"%s\\\", for option `--%s'%s\\n\", ";
2478           stream << "\n";
2479           stream << indent_str;
2480           stream << "          package_name, (found == -2) ? \"ambiguous\" : \"invalid\", value, long_opt,";
2481           stream << "\n";
2482           stream << indent_str;
2483           stream << "          (additional_error ? additional_error : \"\"));";
2484           stream << "\n";
2485           stream << indent_str;
2486           stream << "      return 1; /* failure */";
2487           stream << "\n";
2488           stream << indent_str;
2489           stream << "    }";
2490           stream << "\n";
2491           stream << indent_str;
2492         }
2493       else
2494         {
2495           stream << "  FIX_UNUSED (default_value);";
2496           stream << "\n";
2497           stream << indent_str;
2498         }
2499       stream << "    ";
2500       stream << "\n";
2501       stream << indent_str;
2502       stream << "  if (field_given && *field_given && ! override)";
2503       stream << "\n";
2504       stream << indent_str;
2505       stream << "    return 0;";
2506       stream << "\n";
2507       stream << indent_str;
2508       stream << "  if (prev_given)";
2509       stream << "\n";
2510       stream << indent_str;
2511       stream << "    (*prev_given)++;";
2512       stream << "\n";
2513       stream << indent_str;
2514       stream << "  if (field_given)";
2515       stream << "\n";
2516       stream << indent_str;
2517       stream << "    (*field_given)++;";
2518       stream << "\n";
2519       stream << indent_str;
2520       stream << "  if (possible_values)";
2521       stream << "\n";
2522       stream << indent_str;
2523       stream << "    val = possible_values[found];";
2524       stream << "\n";
2525       stream << indent_str;
2526       stream << "\n";
2527       stream << indent_str;
2528       stream << "  switch(arg_type) {";
2529       stream << "\n";
2530       stream << indent_str;
2531       if (has_arg_flag)
2532         {
2533           stream << "  case ARG_FLAG:";
2534           stream << "\n";
2535           stream << indent_str;
2536           stream << "    *((int *)field) = !*((int *)field);";
2537           stream << "\n";
2538           stream << indent_str;
2539           stream << "    break;";
2540           stream << "\n";
2541           stream << indent_str;
2542         }
2543       if (has_arg_int)
2544         {
2545           stream << "  case ARG_INT:";
2546           stream << "\n";
2547           stream << indent_str;
2548           stream << "    if (val) *((int *)field) = strtol (val, &stop_char, 0);";
2549           stream << "\n";
2550           stream << indent_str;
2551           stream << "    break;";
2552           stream << "\n";
2553           stream << indent_str;
2554         }
2555       if (has_arg_short)
2556         {
2557           stream << "  case ARG_SHORT:";
2558           stream << "\n";
2559           stream << indent_str;
2560           stream << "    if (val) *((short *)field) = (short)strtol (val, &stop_char, 0);";
2561           stream << "\n";
2562           stream << indent_str;
2563           stream << "    break;";
2564           stream << "\n";
2565           stream << indent_str;
2566         }
2567       if (has_arg_long)
2568         {
2569           stream << "  case ARG_LONG:";
2570           stream << "\n";
2571           stream << indent_str;
2572           stream << "    if (val) *((long *)field) = (long)strtol (val, &stop_char, 0);";
2573           stream << "\n";
2574           stream << indent_str;
2575           stream << "    break;";
2576           stream << "\n";
2577           stream << indent_str;
2578         }
2579       if (has_arg_float)
2580         {
2581           stream << "  case ARG_FLOAT:";
2582           stream << "\n";
2583           stream << indent_str;
2584           stream << "    if (val) *((float *)field) = (float)strtod (val, &stop_char);";
2585           stream << "\n";
2586           stream << indent_str;
2587           stream << "    break;";
2588           stream << "\n";
2589           stream << indent_str;
2590         }
2591       if (has_arg_double)
2592         {
2593           stream << "  case ARG_DOUBLE:";
2594           stream << "\n";
2595           stream << indent_str;
2596           stream << "    if (val) *((double *)field) = strtod (val, &stop_char);";
2597           stream << "\n";
2598           stream << indent_str;
2599           stream << "    break;";
2600           stream << "\n";
2601           stream << indent_str;
2602         }
2603       if (has_arg_longdouble)
2604         {
2605           stream << "  case ARG_LONGDOUBLE:";
2606           stream << "\n";
2607           stream << indent_str;
2608           stream << "    if (val) *((long double *)field) = (long double)strtod (val, &stop_char);";
2609           stream << "\n";
2610           stream << indent_str;
2611           stream << "    break;";
2612           stream << "\n";
2613           stream << indent_str;
2614         }
2615       if (has_arg_longlong)
2616         {
2617           stream << "  case ARG_LONGLONG:";
2618           stream << "\n";
2619           stream << indent_str;
2620           stream << "#ifdef HAVE_LONG_LONG";
2621           stream << "\n";
2622           stream << indent_str;
2623           stream << "    if (val) *((long long int*)field) = (long long int) strtol (val, &stop_char, 0);";
2624           stream << "\n";
2625           stream << indent_str;
2626           stream << "#else";
2627           stream << "\n";
2628           stream << indent_str;
2629           stream << "    if (val) *((long *)field) = (long)strtol (val, &stop_char, 0);";
2630           stream << "\n";
2631           stream << indent_str;
2632           stream << "#endif";
2633           stream << "\n";
2634           stream << indent_str;
2635           stream << "    break;";
2636           stream << "\n";
2637           stream << indent_str;
2638         }
2639       if (has_arg_enum)
2640         {
2641           stream << "  case ARG_ENUM:";
2642           stream << "\n";
2643           stream << indent_str;
2644           stream << "    if (val) *((int *)field) = found;";
2645           stream << "\n";
2646           stream << indent_str;
2647           stream << "    break;";
2648           stream << "\n";
2649           stream << indent_str;
2650         }
2651       if (has_arg_string)
2652         {
2653           stream << "  case ARG_STRING:";
2654           stream << "\n";
2655           stream << indent_str;
2656           stream << "    if (val) {";
2657           stream << "\n";
2658           stream << indent_str;
2659           stream << "      string_field = (char **)field;";
2660           stream << "\n";
2661           stream << indent_str;
2662           stream << "      if (!no_free && *string_field)";
2663           stream << "\n";
2664           stream << indent_str;
2665           stream << "        free (*string_field); /* free previous string */";
2666           stream << "\n";
2667           stream << indent_str;
2668           stream << "      *string_field = gengetopt_strdup (val);";
2669           stream << "\n";
2670           stream << indent_str;
2671           stream << "    }";
2672           stream << "\n";
2673           stream << indent_str;
2674           stream << "    break;";
2675           stream << "\n";
2676           stream << indent_str;
2677         }
2678       stream << "  default:";
2679       stream << "\n";
2680       stream << indent_str;
2681       stream << "    break;";
2682       stream << "\n";
2683       stream << indent_str;
2684       stream << "  };";
2685       stream << "\n";
2686       stream << indent_str;
2687       stream << "\n";
2688       stream << indent_str;
2689       if (( ( ( ( ( ( has_arg_int || has_arg_short ) || has_arg_long ) || has_arg_float ) || has_arg_double ) || has_arg_longdouble ) || has_arg_longlong ))
2690         {
2691           stream << "  /* check numeric conversion */";
2692           stream << "\n";
2693           stream << indent_str;
2694           stream << "  switch(arg_type) {";
2695           stream << "\n";
2696           stream << indent_str;
2697           if (has_arg_int)
2698             {
2699               stream << "  case ARG_INT:";
2700               stream << "\n";
2701               stream << indent_str;
2702             }
2703           if (has_arg_short)
2704             {
2705               stream << "  case ARG_SHORT:";
2706               stream << "\n";
2707               stream << indent_str;
2708             }
2709           if (has_arg_long)
2710             {
2711               stream << "  case ARG_LONG:";
2712               stream << "\n";
2713               stream << indent_str;
2714             }
2715           if (has_arg_float)
2716             {
2717               stream << "  case ARG_FLOAT:";
2718               stream << "\n";
2719               stream << indent_str;
2720             }
2721           if (has_arg_double)
2722             {
2723               stream << "  case ARG_DOUBLE:";
2724               stream << "\n";
2725               stream << indent_str;
2726             }
2727           if (has_arg_longdouble)
2728             {
2729               stream << "  case ARG_LONGDOUBLE:";
2730               stream << "\n";
2731               stream << indent_str;
2732             }
2733           if (has_arg_longlong)
2734             {
2735               stream << "  case ARG_LONGLONG:";
2736               stream << "\n";
2737               stream << indent_str;
2738             }
2739           stream << "    if (val && !(stop_char && *stop_char == '\\0')) {";
2740           stream << "\n";
2741           stream << indent_str;
2742           stream << "      fprintf(stderr, \"%s: invalid numeric value: %s\\n\", package_name, val);";
2743           stream << "\n";
2744           stream << indent_str;
2745           stream << "      return 1; /* failure */";
2746           stream << "\n";
2747           stream << indent_str;
2748           stream << "    }";
2749           stream << "\n";
2750           stream << indent_str;
2751           stream << "    break;";
2752           stream << "\n";
2753           stream << indent_str;
2754           stream << "  default:";
2755           stream << "\n";
2756           stream << indent_str;
2757           stream << "    ;";
2758           stream << "\n";
2759           stream << indent_str;
2760           stream << "  };";
2761           stream << "\n";
2762           stream << indent_str;
2763         }
2764       stream << "\n";
2765       stream << indent_str;
2766       stream << "  /* store the original value */";
2767       stream << "\n";
2768       stream << indent_str;
2769       stream << "  switch(arg_type) {";
2770       stream << "\n";
2771       stream << indent_str;
2772       stream << "  case ARG_NO:";
2773       stream << "\n";
2774       stream << indent_str;
2775       if (has_arg_flag)
2776         {
2777           stream << "  case ARG_FLAG:";
2778           stream << "\n";
2779           stream << indent_str;
2780         }
2781       stream << "    break;";
2782       stream << "\n";
2783       stream << indent_str;
2784       stream << "  default:";
2785       stream << "\n";
2786       stream << indent_str;
2787       stream << "    if (value && orig_field) {";
2788       stream << "\n";
2789       stream << indent_str;
2790       stream << "      if (no_free) {";
2791       stream << "\n";
2792       stream << indent_str;
2793       stream << "        *orig_field = value;";
2794       stream << "\n";
2795       stream << indent_str;
2796       stream << "      } else {";
2797       stream << "\n";
2798       stream << indent_str;
2799       stream << "        if (*orig_field)";
2800       stream << "\n";
2801       stream << indent_str;
2802       stream << "          free (*orig_field); /* free previous string */";
2803       stream << "\n";
2804       stream << indent_str;
2805       stream << "        *orig_field = gengetopt_strdup (value);";
2806       stream << "\n";
2807       stream << indent_str;
2808       stream << "      }";
2809       stream << "\n";
2810       stream << indent_str;
2811       stream << "    }";
2812       stream << "\n";
2813       stream << indent_str;
2814       stream << "  };";
2815       stream << "\n";
2816       stream << indent_str;
2817       stream << "\n";
2818       stream << indent_str;
2819       stream << "  return 0; /* OK */";
2820       stream << "\n";
2821       stream << indent_str;
2822       stream << "}";
2823       stream << "\n";
2824       stream << indent_str;
2825     }
2826   stream << "\n";
2827   stream << indent_str;
2828   if (multiple_token_functions)
2829     {
2830       stream << "/**";
2831       stream << "\n";
2832       stream << indent_str;
2833       stream << " * ";
2834       stream << "@";
2835       stream << "brief store information about a multiple option in a temporary list";
2836       stream << "\n";
2837       stream << indent_str;
2838       stream << " * ";
2839       stream << "@";
2840       stream << "param list where to (temporarily) store multiple options";
2841       stream << "\n";
2842       stream << indent_str;
2843       stream << " */";
2844       stream << "\n";
2845       stream << indent_str;
2846       stream << "static";
2847       stream << "\n";
2848       stream << indent_str;
2849       stream << "int update_multiple_arg_temp(struct generic_list **list,";
2850       stream << "\n";
2851       stream << indent_str;
2852       stream << "               unsigned int *prev_given, const char *val,";
2853       stream << "\n";
2854       stream << indent_str;
2855       stream << "               const char *possible_values[], const char *default_value,";
2856       stream << "\n";
2857       stream << indent_str;
2858       indent = 15;
2859       stream << "               ";
2860       generate_string (parser_name, stream, indent + indent_str.length ());
2861       stream << "_arg_type arg_type,";
2862       indent = 0;
2863       stream << "\n";
2864       stream << indent_str;
2865       stream << "               const char *long_opt, char short_opt,";
2866       stream << "\n";
2867       stream << indent_str;
2868       stream << "               const char *additional_error)";
2869       stream << "\n";
2870       stream << indent_str;
2871       stream << "{";
2872       stream << "\n";
2873       stream << indent_str;
2874       stream << "  /* store single arguments */";
2875       stream << "\n";
2876       stream << indent_str;
2877       stream << "  char *multi_token;";
2878       stream << "\n";
2879       stream << indent_str;
2880       stream << "  const char *multi_next;";
2881       stream << "\n";
2882       stream << indent_str;
2883       stream << "\n";
2884       stream << indent_str;
2885       stream << "  if (arg_type == ARG_NO) {";
2886       stream << "\n";
2887       stream << indent_str;
2888       stream << "    (*prev_given)++;";
2889       stream << "\n";
2890       stream << indent_str;
2891       stream << "    return 0; /* OK */";
2892       stream << "\n";
2893       stream << indent_str;
2894       stream << "  }";
2895       stream << "\n";
2896       stream << indent_str;
2897       stream << "\n";
2898       stream << indent_str;
2899       stream << "  multi_token = get_multiple_arg_token(val);";
2900       stream << "\n";
2901       stream << indent_str;
2902       stream << "  multi_next = get_multiple_arg_token_next (val);";
2903       stream << "\n";
2904       stream << indent_str;
2905       stream << "\n";
2906       stream << indent_str;
2907       stream << "  while (1)";
2908       stream << "\n";
2909       stream << indent_str;
2910       stream << "    {";
2911       stream << "\n";
2912       stream << indent_str;
2913       stream << "      add_node (list);";
2914       stream << "\n";
2915       stream << indent_str;
2916       stream << "      if (update_arg((void *)&((*list)->arg), &((*list)->orig), 0,";
2917       stream << "\n";
2918       stream << indent_str;
2919       stream << "          prev_given, multi_token, possible_values, default_value, ";
2920       stream << "\n";
2921       stream << indent_str;
2922       stream << "          arg_type, 0, 1, 1, 1, long_opt, short_opt, additional_error)) {";
2923       stream << "\n";
2924       stream << indent_str;
2925       stream << "        if (multi_token) free(multi_token);";
2926       stream << "\n";
2927       stream << indent_str;
2928       stream << "        return 1; /* failure */";
2929       stream << "\n";
2930       stream << indent_str;
2931       stream << "      }";
2932       stream << "\n";
2933       stream << indent_str;
2934       stream << "\n";
2935       stream << indent_str;
2936       stream << "      if (multi_next)";
2937       stream << "\n";
2938       stream << indent_str;
2939       stream << "        {";
2940       stream << "\n";
2941       stream << indent_str;
2942       stream << "          multi_token = get_multiple_arg_token(multi_next);";
2943       stream << "\n";
2944       stream << indent_str;
2945       stream << "          multi_next = get_multiple_arg_token_next (multi_next);";
2946       stream << "\n";
2947       stream << indent_str;
2948       stream << "        }";
2949       stream << "\n";
2950       stream << indent_str;
2951       stream << "      else";
2952       stream << "\n";
2953       stream << indent_str;
2954       stream << "        break;";
2955       stream << "\n";
2956       stream << indent_str;
2957       stream << "    }";
2958       stream << "\n";
2959       stream << indent_str;
2960       stream << "\n";
2961       stream << indent_str;
2962       stream << "  return 0; /* OK */";
2963       stream << "\n";
2964       stream << indent_str;
2965       stream << "}";
2966       stream << "\n";
2967       stream << indent_str;
2968       stream << "\n";
2969       stream << indent_str;
2970       stream << "/**";
2971       stream << "\n";
2972       stream << indent_str;
2973       stream << " * ";
2974       stream << "@";
2975       stream << "brief free the passed list (including possible string argument)";
2976       stream << "\n";
2977       stream << indent_str;
2978       stream << " */";
2979       stream << "\n";
2980       stream << indent_str;
2981       stream << "static";
2982       stream << "\n";
2983       stream << indent_str;
2984       stream << "void free_list(struct generic_list *list, short string_arg)";
2985       stream << "\n";
2986       stream << indent_str;
2987       stream << "{";
2988       stream << "\n";
2989       stream << indent_str;
2990       stream << "  if (list) {";
2991       stream << "\n";
2992       stream << indent_str;
2993       stream << "    struct generic_list *tmp;";
2994       stream << "\n";
2995       stream << indent_str;
2996       stream << "    while (list)";
2997       stream << "\n";
2998       stream << indent_str;
2999       stream << "      {";
3000       stream << "\n";
3001       stream << indent_str;
3002       stream << "        tmp = list;";
3003       stream << "\n";
3004       stream << indent_str;
3005       stream << "        if (string_arg && list->arg.string_arg)";
3006       stream << "\n";
3007       stream << indent_str;
3008       stream << "          free (list->arg.string_arg);";
3009       stream << "\n";
3010       stream << indent_str;
3011       stream << "        if (list->orig)";
3012       stream << "\n";
3013       stream << indent_str;
3014       stream << "          free (list->orig);";
3015       stream << "\n";
3016       stream << indent_str;
3017       stream << "        list = list->next;";
3018       stream << "\n";
3019       stream << indent_str;
3020       stream << "        free (tmp);";
3021       stream << "\n";
3022       stream << indent_str;
3023       stream << "      }";
3024       stream << "\n";
3025       stream << indent_str;
3026       stream << "  }";
3027       stream << "\n";
3028       stream << indent_str;
3029       stream << "}";
3030       stream << "\n";
3031       stream << indent_str;
3032       stream << "\n";
3033       stream << indent_str;
3034       stream << "/**";
3035       stream << "\n";
3036       stream << indent_str;
3037       stream << " * ";
3038       stream << "@";
3039       stream << "brief updates a multiple option starting from the passed list";
3040       stream << "\n";
3041       stream << indent_str;
3042       stream << " */";
3043       stream << "\n";
3044       stream << indent_str;
3045       stream << "static";
3046       stream << "\n";
3047       stream << indent_str;
3048       stream << "void update_multiple_arg(void *field, char ***orig_field,";
3049       stream << "\n";
3050       stream << indent_str;
3051       stream << "               unsigned int field_given, unsigned int prev_given, union generic_value *default_value,";
3052       stream << "\n";
3053       stream << indent_str;
3054       indent = 15;
3055       stream << "               ";
3056       generate_string (parser_name, stream, indent + indent_str.length ());
3057       stream << "_arg_type arg_type,";
3058       indent = 0;
3059       stream << "\n";
3060       stream << indent_str;
3061       stream << "               struct generic_list *list)";
3062       stream << "\n";
3063       stream << indent_str;
3064       stream << "{";
3065       stream << "\n";
3066       stream << indent_str;
3067       stream << "  int i;";
3068       stream << "\n";
3069       stream << indent_str;
3070       stream << "  struct generic_list *tmp;";
3071       stream << "\n";
3072       stream << indent_str;
3073       stream << "\n";
3074       stream << indent_str;
3075       stream << "  if (prev_given && list) {";
3076       stream << "\n";
3077       stream << indent_str;
3078       stream << "    *orig_field = (char **) realloc (*orig_field, (field_given + prev_given) * sizeof (char *));";
3079       stream << "\n";
3080       stream << indent_str;
3081       stream << "\n";
3082       stream << indent_str;
3083       stream << "    switch(arg_type) {";
3084       stream << "\n";
3085       stream << indent_str;
3086       if (( has_arg_int || has_arg_enum ))
3087         {
3088           if (has_arg_int)
3089             {
3090               stream << "    case ARG_INT:";
3091               stream << "\n";
3092               stream << indent_str;
3093             }
3094           if (has_arg_enum)
3095             {
3096               stream << "    case ARG_ENUM:";
3097               stream << "\n";
3098               stream << indent_str;
3099             }
3100           stream << "      *((int **)field) = (int *)realloc (*((int **)field), (field_given + prev_given) * sizeof (int)); break;";
3101           stream << "\n";
3102           stream << indent_str;
3103         }
3104       if (has_arg_short)
3105         {
3106           stream << "    case ARG_SHORT:";
3107           stream << "\n";
3108           stream << indent_str;
3109           stream << "      *((short **)field) = (short *)realloc (*((short **)field), (field_given + prev_given) * sizeof (short)); break;";
3110           stream << "\n";
3111           stream << indent_str;
3112         }
3113       if (has_arg_long)
3114         {
3115           stream << "    case ARG_LONG:";
3116           stream << "\n";
3117           stream << indent_str;
3118           stream << "      *((long **)field) = (long *)realloc (*((long **)field), (field_given + prev_given) * sizeof (long)); break;";
3119           stream << "\n";
3120           stream << indent_str;
3121         }
3122       if (has_arg_float)
3123         {
3124           stream << "    case ARG_FLOAT:";
3125           stream << "\n";
3126           stream << indent_str;
3127           stream << "      *((float **)field) = (float *)realloc (*((float **)field), (field_given + prev_given) * sizeof (float)); break;";
3128           stream << "\n";
3129           stream << indent_str;
3130         }
3131       if (has_arg_double)
3132         {
3133           stream << "    case ARG_DOUBLE:";
3134           stream << "\n";
3135           stream << indent_str;
3136           stream << "      *((double **)field) = (double *)realloc (*((double **)field), (field_given + prev_given) * sizeof (double)); break;";
3137           stream << "\n";
3138           stream << indent_str;
3139         }
3140       if (has_arg_longdouble)
3141         {
3142           stream << "    case ARG_LONGDOUBLE:";
3143           stream << "\n";
3144           stream << indent_str;
3145           stream << "      *((long double **)field) = (long double *)realloc (*((long double **)field), (field_given + prev_given) * sizeof (long double)); break;";
3146           stream << "\n";
3147           stream << indent_str;
3148         }
3149       if (has_arg_longlong)
3150         {
3151           stream << "    case ARG_LONGLONG:";
3152           stream << "\n";
3153           stream << indent_str;
3154           stream << "#ifdef HAVE_LONG_LONG";
3155           stream << "\n";
3156           stream << indent_str;
3157           stream << "      *((long long int **)field) = (long long int *)realloc (*((long long int **)field), (field_given + prev_given) * sizeof (long long int)); break;";
3158           stream << "\n";
3159           stream << indent_str;
3160           stream << "#else";
3161           stream << "\n";
3162           stream << indent_str;
3163           stream << "      *((long **)field) = (long *)realloc (*((long **)field), (field_given + prev_given) * sizeof (long)); break;";
3164           stream << "\n";
3165           stream << indent_str;
3166           stream << "#endif";
3167           stream << "\n";
3168           stream << indent_str;
3169         }
3170       if (has_arg_string)
3171         {
3172           stream << "    case ARG_STRING:";
3173           stream << "\n";
3174           stream << indent_str;
3175           stream << "      *((char ***)field) = (char **)realloc (*((char ***)field), (field_given + prev_given) * sizeof (char *)); break;";
3176           stream << "\n";
3177           stream << indent_str;
3178         }
3179       stream << "    default:";
3180       stream << "\n";
3181       stream << indent_str;
3182       stream << "      break;";
3183       stream << "\n";
3184       stream << indent_str;
3185       stream << "    };";
3186       stream << "\n";
3187       stream << indent_str;
3188       indent = 4;
3189       stream << "    ";
3190       indent = 0;
3191       stream << "\n";
3192       stream << indent_str;
3193       stream << "    for (i = (prev_given - 1); i >= 0; --i)";
3194       stream << "\n";
3195       stream << indent_str;
3196       stream << "      {";
3197       stream << "\n";
3198       stream << indent_str;
3199       stream << "        tmp = list;";
3200       stream << "\n";
3201       stream << indent_str;
3202       indent = 8;
3203       stream << "        ";
3204       indent = 0;
3205       stream << "\n";
3206       stream << indent_str;
3207       stream << "        switch(arg_type) {";
3208       stream << "\n";
3209       stream << indent_str;
3210       if (has_arg_int)
3211         {
3212           stream << "        case ARG_INT:";
3213           stream << "\n";
3214           stream << indent_str;
3215           stream << "          (*((int **)field))[i + field_given] = tmp->arg.int_arg; break;";
3216           stream << "\n";
3217           stream << indent_str;
3218         }
3219       if (has_arg_short)
3220         {
3221           stream << "        case ARG_SHORT:";
3222           stream << "\n";
3223           stream << indent_str;
3224           stream << "          (*((short **)field))[i + field_given] = tmp->arg.short_arg; break;";
3225           stream << "\n";
3226           stream << indent_str;
3227         }
3228       if (has_arg_long)
3229         {
3230           stream << "        case ARG_LONG:";
3231           stream << "\n";
3232           stream << indent_str;
3233           stream << "          (*((long **)field))[i + field_given] = tmp->arg.long_arg; break;";
3234           stream << "\n";
3235           stream << indent_str;
3236         }
3237       if (has_arg_float)
3238         {
3239           stream << "        case ARG_FLOAT:";
3240           stream << "\n";
3241           stream << indent_str;
3242           stream << "          (*((float **)field))[i + field_given] = tmp->arg.float_arg; break;";
3243           stream << "\n";
3244           stream << indent_str;
3245         }
3246       if (has_arg_double)
3247         {
3248           stream << "        case ARG_DOUBLE:";
3249           stream << "\n";
3250           stream << indent_str;
3251           stream << "          (*((double **)field))[i + field_given] = tmp->arg.double_arg; break;";
3252           stream << "\n";
3253           stream << indent_str;
3254         }
3255       if (has_arg_longdouble)
3256         {
3257           stream << "        case ARG_LONGDOUBLE:";
3258           stream << "\n";
3259           stream << indent_str;
3260           stream << "          (*((long double **)field))[i + field_given] = tmp->arg.longdouble_arg; break;";
3261           stream << "\n";
3262           stream << indent_str;
3263         }
3264       if (has_arg_longlong)
3265         {
3266           stream << "        case ARG_LONGLONG:";
3267           stream << "\n";
3268           stream << indent_str;
3269           stream << "#ifdef HAVE_LONG_LONG";
3270           stream << "\n";
3271           stream << indent_str;
3272           stream << "          (*((long long int **)field))[i + field_given] = tmp->arg.longlong_arg; break;";
3273           stream << "\n";
3274           stream << indent_str;
3275           stream << "#else";
3276           stream << "\n";
3277           stream << indent_str;
3278           stream << "          (*((long **)field))[i + field_given] = tmp->arg.longlong_arg; break;";
3279           stream << "\n";
3280           stream << indent_str;
3281           stream << "#endif";
3282           stream << "\n";
3283           stream << indent_str;
3284         }
3285       if (has_arg_enum)
3286         {
3287           stream << "        case ARG_ENUM:";
3288           stream << "\n";
3289           stream << indent_str;
3290           stream << "          (*((int **)field))[i + field_given] = tmp->arg.int_arg; break;";
3291           stream << "\n";
3292           stream << indent_str;
3293         }
3294       if (has_arg_string)
3295         {
3296           stream << "        case ARG_STRING:";
3297           stream << "\n";
3298           stream << indent_str;
3299           stream << "          (*((char ***)field))[i + field_given] = tmp->arg.string_arg; break;";
3300           stream << "\n";
3301           stream << indent_str;
3302         }
3303       stream << "        default:";
3304       stream << "\n";
3305       stream << indent_str;
3306       stream << "          break;";
3307       stream << "\n";
3308       stream << indent_str;
3309       stream << "        }        ";
3310       stream << "\n";
3311       stream << indent_str;
3312       stream << "        (*orig_field) [i + field_given] = list->orig;";
3313       stream << "\n";
3314       stream << indent_str;
3315       stream << "        list = list->next;";
3316       stream << "\n";
3317       stream << indent_str;
3318       stream << "        free (tmp);";
3319       stream << "\n";
3320       stream << indent_str;
3321       stream << "      }";
3322       stream << "\n";
3323       stream << indent_str;
3324       stream << "  } else { /* set the default value */";
3325       stream << "\n";
3326       stream << indent_str;
3327       stream << "    if (default_value && ! field_given) {";
3328       stream << "\n";
3329       stream << indent_str;
3330       stream << "      switch(arg_type) {";
3331       stream << "\n";
3332       stream << indent_str;
3333       if (( has_arg_int || has_arg_enum ))
3334         {
3335           if (has_arg_int)
3336             {
3337               stream << "      case ARG_INT:";
3338               stream << "\n";
3339               stream << indent_str;
3340             }
3341           if (has_arg_enum)
3342             {
3343               stream << "      case ARG_ENUM:";
3344               stream << "\n";
3345               stream << indent_str;
3346             }
3347           stream << "        if (! *((int **)field)) {";
3348           stream << "\n";
3349           stream << indent_str;
3350           stream << "          *((int **)field) = (int *)malloc (sizeof (int));";
3351           stream << "\n";
3352           stream << indent_str;
3353           stream << "          (*((int **)field))[0] = default_value->int_arg; ";
3354           stream << "\n";
3355           stream << indent_str;
3356           stream << "        }";
3357           stream << "\n";
3358           stream << indent_str;
3359           stream << "        break;";
3360           stream << "\n";
3361           stream << indent_str;
3362         }
3363       if (has_arg_short)
3364         {
3365           stream << "      case ARG_SHORT:";
3366           stream << "\n";
3367           stream << indent_str;
3368           stream << "        if (! *((short **)field)) {";
3369           stream << "\n";
3370           stream << indent_str;
3371           stream << "          *((short **)field) = (short *)malloc (sizeof (short));";
3372           stream << "\n";
3373           stream << indent_str;
3374           stream << "          (*((short **)field))[0] = default_value->short_arg;";
3375           stream << "\n";
3376           stream << indent_str;
3377           stream << "        }";
3378           stream << "\n";
3379           stream << indent_str;
3380           stream << "        break;";
3381           stream << "\n";
3382           stream << indent_str;
3383         }
3384       if (has_arg_long)
3385         {
3386           stream << "      case ARG_LONG:";
3387           stream << "\n";
3388           stream << indent_str;
3389           stream << "        if (! *((long **)field)) {";
3390           stream << "\n";
3391           stream << indent_str;
3392           stream << "          *((long **)field) = (long *)malloc (sizeof (long));";
3393           stream << "\n";
3394           stream << indent_str;
3395           stream << "          (*((long **)field))[0] = default_value->long_arg;";
3396           stream << "\n";
3397           stream << indent_str;
3398           stream << "        }";
3399           stream << "\n";
3400           stream << indent_str;
3401           stream << "        break;";
3402           stream << "\n";
3403           stream << indent_str;
3404         }
3405       if (has_arg_float)
3406         {
3407           stream << "      case ARG_FLOAT:";
3408           stream << "\n";
3409           stream << indent_str;
3410           stream << "        if (! *((float **)field)) {";
3411           stream << "\n";
3412           stream << indent_str;
3413           stream << "          *((float **)field) = (float *)malloc (sizeof (float));";
3414           stream << "\n";
3415           stream << indent_str;
3416           stream << "          (*((float **)field))[0] = default_value->float_arg;";
3417           stream << "\n";
3418           stream << indent_str;
3419           stream << "        }";
3420           stream << "\n";
3421           stream << indent_str;
3422           stream << "        break;";
3423           stream << "\n";
3424           stream << indent_str;
3425         }
3426       if (has_arg_double)
3427         {
3428           stream << "      case ARG_DOUBLE:";
3429           stream << "\n";
3430           stream << indent_str;
3431           stream << "        if (! *((double **)field)) {";
3432           stream << "\n";
3433           stream << indent_str;
3434           stream << "          *((double **)field) = (double *)malloc (sizeof (double));";
3435           stream << "\n";
3436           stream << indent_str;
3437           stream << "          (*((double **)field))[0] = default_value->double_arg;";
3438           stream << "\n";
3439           stream << indent_str;
3440           stream << "        }";
3441           stream << "\n";
3442           stream << indent_str;
3443           stream << "        break;";
3444           stream << "\n";
3445           stream << indent_str;
3446         }
3447       if (has_arg_longdouble)
3448         {
3449           stream << "      case ARG_LONGDOUBLE:";
3450           stream << "\n";
3451           stream << indent_str;
3452           stream << "        if (! *((long double **)field)) {";
3453           stream << "\n";
3454           stream << indent_str;
3455           stream << "          *((long double **)field) = (long double *)malloc (sizeof (long double));";
3456           stream << "\n";
3457           stream << indent_str;
3458           stream << "          (*((long double **)field))[0] = default_value->longdouble_arg;";
3459           stream << "\n";
3460           stream << indent_str;
3461           stream << "        }";
3462           stream << "\n";
3463           stream << indent_str;
3464           stream << "        break;";
3465           stream << "\n";
3466           stream << indent_str;
3467         }
3468       if (has_arg_longlong)
3469         {
3470           stream << "      case ARG_LONGLONG:";
3471           stream << "\n";
3472           stream << indent_str;
3473           stream << "#ifdef HAVE_LONG_LONG";
3474           stream << "\n";
3475           stream << indent_str;
3476           stream << "        if (! *((long long int **)field)) {";
3477           stream << "\n";
3478           stream << indent_str;
3479           stream << "          *((long long int **)field) = (long long int *)malloc (sizeof (long long int));";
3480           stream << "\n";
3481           stream << indent_str;
3482           stream << "          (*((long long int **)field))[0] = default_value->longlong_arg;";
3483           stream << "\n";
3484           stream << indent_str;
3485           stream << "        }";
3486           stream << "\n";
3487           stream << indent_str;
3488           stream << "#else";
3489           stream << "\n";
3490           stream << indent_str;
3491           stream << "        if (! *((long **)field)) {";
3492           stream << "\n";
3493           stream << indent_str;
3494           stream << "          *((long **)field) = (long *)malloc (sizeof (long));";
3495           stream << "\n";
3496           stream << indent_str;
3497           stream << "          (*((long **)field))[0] = default_value->longlong_arg;";
3498           stream << "\n";
3499           stream << indent_str;
3500           stream << "        }";
3501           stream << "\n";
3502           stream << indent_str;
3503           stream << "#endif";
3504           stream << "\n";
3505           stream << indent_str;
3506           stream << "        break;";
3507           stream << "\n";
3508           stream << indent_str;
3509         }
3510       if (has_arg_string)
3511         {
3512           stream << "      case ARG_STRING:";
3513           stream << "\n";
3514           stream << indent_str;
3515           stream << "        if (! *((char ***)field)) {";
3516           stream << "\n";
3517           stream << indent_str;
3518           stream << "          *((char ***)field) = (char **)malloc (sizeof (char *));";
3519           stream << "\n";
3520           stream << indent_str;
3521           stream << "          (*((char ***)field))[0] = gengetopt_strdup(default_value->string_arg);";
3522           stream << "\n";
3523           stream << indent_str;
3524           stream << "        }";
3525           stream << "\n";
3526           stream << indent_str;
3527           stream << "        break;";
3528           stream << "\n";
3529           stream << indent_str;
3530         }
3531       stream << "      default: break;";
3532       stream << "\n";
3533       stream << indent_str;
3534       stream << "      }";
3535       stream << "\n";
3536       stream << indent_str;
3537       stream << "      if (!(*orig_field)) {";
3538       stream << "\n";
3539       stream << indent_str;
3540       stream << "        *orig_field = (char **) malloc (sizeof (char *));";
3541       stream << "\n";
3542       stream << indent_str;
3543       stream << "        (*orig_field)[0] = 0;";
3544       stream << "\n";
3545       stream << indent_str;
3546       stream << "      }";
3547       stream << "\n";
3548       stream << indent_str;
3549       stream << "    }";
3550       stream << "\n";
3551       stream << indent_str;
3552       stream << "  }";
3553       stream << "\n";
3554       stream << indent_str;
3555       stream << "}";
3556       stream << "\n";
3557       stream << indent_str;
3558     }
3559   if (has_modes)
3560     {
3561       stream << "\n";
3562       stream << indent_str;
3563       stream << "static int check_modes(";
3564       stream << "\n";
3565       stream << indent_str;
3566       stream << "  int given1[], const char *options1[],";
3567       stream << "\n";
3568       stream << indent_str;
3569       stream << "                       int given2[], const char *options2[])";
3570       stream << "\n";
3571       stream << indent_str;
3572       stream << "{";
3573       stream << "\n";
3574       stream << indent_str;
3575       stream << "  int i = 0, j = 0, errors = 0;";
3576       stream << "\n";
3577       stream << indent_str;
3578       indent = 2;
3579       stream << "  ";
3580       indent = 0;
3581       stream << "\n";
3582       stream << indent_str;
3583       stream << "  while (given1[i] >= 0) {";
3584       stream << "\n";
3585       stream << indent_str;
3586       stream << "    if (given1[i]) {";
3587       stream << "\n";
3588       stream << indent_str;
3589       stream << "      while (given2[j] >= 0) {";
3590       stream << "\n";
3591       stream << indent_str;
3592       stream << "        if (given2[j]) {";
3593       stream << "\n";
3594       stream << indent_str;
3595       stream << "          ++errors;";
3596       stream << "\n";
3597       stream << indent_str;
3598       stream << "          fprintf(stderr, \"%s: option %s conflicts with option %s\\n\",";
3599       stream << "\n";
3600       stream << indent_str;
3601       stream << "                  package_name, options1[i], options2[j]);";
3602       stream << "\n";
3603       stream << indent_str;
3604       stream << "        }";
3605       stream << "\n";
3606       stream << indent_str;
3607       stream << "        ++j;";
3608       stream << "\n";
3609       stream << indent_str;
3610       stream << "      }";
3611       stream << "\n";
3612       stream << indent_str;
3613       stream << "    }";
3614       stream << "\n";
3615       stream << indent_str;
3616       stream << "    ++i;";
3617       stream << "\n";
3618       stream << indent_str;
3619       stream << "  }";
3620       stream << "\n";
3621       stream << indent_str;
3622       indent = 2;
3623       stream << "  ";
3624       indent = 0;
3625       stream << "\n";
3626       stream << indent_str;
3627       stream << "  return errors;";
3628       stream << "\n";
3629       stream << indent_str;
3630       stream << "}";
3631       stream << "\n";
3632       stream << indent_str;
3633     }
3634   stream << "\n";
3635   stream << indent_str;
3636   stream << "int";
3637   stream << "\n";
3638   stream << indent_str;
3639   generate_string (parser_name, stream, indent + indent_str.length ());
3640   stream << "_internal (";
3641   stream << "\n";
3642   stream << indent_str;
3643   stream << "  int argc, char **argv, struct ";
3644   generate_string (args_info, stream, indent + indent_str.length ());
3645   stream << " *args_info,";
3646   stream << "\n";
3647   stream << indent_str;
3648   stream << "                        struct ";
3649   generate_string (parser_name, stream, indent + indent_str.length ());
3650   stream << "_params *params, const char *additional_error)";
3651   stream << "\n";
3652   stream << indent_str;
3653   stream << "{";
3654   stream << "\n";
3655   stream << indent_str;
3656   stream << "  int c;   /* Character of the parsed option.  */";
3657   stream << "\n";
3658   stream << indent_str;
3659   if (multiple_options_with_default)
3660     {
3661       stream << "  union generic_value multiple_default_value;";
3662       stream << "\n";
3663       stream << indent_str;
3664     }
3665   stream << "\n";
3666   stream << indent_str;
3667   indent = 2;
3668   if (list_def.size () > 0)
3669     generate_string (list_def, stream, indent + indent_str.length ());
3670   else
3671     generate_list_def (stream, indent + indent_str.length ());
3672   indent = 0;
3673   stream << indent_str;
3674   stream << "  int error = 0;";
3675   stream << "\n";
3676   stream << indent_str;
3677   stream << "  struct ";
3678   generate_string (args_info, stream, indent + indent_str.length ());
3679   stream << " local_args_info;";
3680   stream << "\n";
3681   stream << indent_str;
3682   indent = 2;
3683   stream << "  ";
3684   indent = 0;
3685   stream << "\n";
3686   stream << indent_str;
3687   stream << "  int override;";
3688   stream << "\n";
3689   stream << indent_str;
3690   stream << "  int initialize;";
3691   stream << "\n";
3692   stream << indent_str;
3693   stream << "  int check_required;";
3694   stream << "\n";
3695   stream << indent_str;
3696   stream << "  int check_ambiguity;";
3697   stream << "\n";
3698   stream << indent_str;
3699   if (include_getopt)
3700     {
3701       stream << "\n";
3702       stream << indent_str;
3703       stream << "  char *optarg;";
3704       stream << "\n";
3705       stream << indent_str;
3706       stream << "  int optind;";
3707       stream << "\n";
3708       stream << indent_str;
3709       stream << "  int opterr;";
3710       stream << "\n";
3711       stream << indent_str;
3712       stream << "  int optopt;";
3713       stream << "\n";
3714       stream << indent_str;
3715     }
3716   stream << "  ";
3717   stream << "\n";
3718   stream << indent_str;
3719   stream << "  package_name = argv[0];";
3720   stream << "\n";
3721   stream << indent_str;
3722   indent = 2;
3723   stream << "  ";
3724   indent = 0;
3725   stream << "\n";
3726   stream << indent_str;
3727   stream << "  override = params->override;";
3728   stream << "\n";
3729   stream << indent_str;
3730   stream << "  initialize = params->initialize;";
3731   stream << "\n";
3732   stream << indent_str;
3733   stream << "  check_required = params->check_required;";
3734   stream << "\n";
3735   stream << indent_str;
3736   stream << "  check_ambiguity = params->check_ambiguity;";
3737   stream << "\n";
3738   stream << indent_str;
3739   stream << "\n";
3740   stream << indent_str;
3741   stream << "  if (initialize)";
3742   stream << "\n";
3743   stream << indent_str;
3744   indent = 4;
3745   stream << "    ";
3746   generate_string (parser_name, stream, indent + indent_str.length ());
3747   stream << "_init (args_info);";
3748   indent = 0;
3749   stream << "\n";
3750   stream << indent_str;
3751   stream << "\n";
3752   stream << indent_str;
3753   indent = 2;
3754   stream << "  ";
3755   generate_string (parser_name, stream, indent + indent_str.length ());
3756   stream << "_init (&local_args_info);";
3757   indent = 0;
3758   stream << "\n";
3759   stream << indent_str;
3760   stream << "\n";
3761   stream << indent_str;
3762   stream << "  optarg = 0;";
3763   stream << "\n";
3764   stream << indent_str;
3765   stream << "  optind = 0;";
3766   stream << "\n";
3767   stream << indent_str;
3768   stream << "  opterr = params->print_errors;";
3769   stream << "\n";
3770   stream << indent_str;
3771   stream << "  optopt = '?';";
3772   stream << "\n";
3773   stream << indent_str;
3774   stream << "\n";
3775   stream << indent_str;
3776   stream << "  while (1)";
3777   stream << "\n";
3778   stream << indent_str;
3779   stream << "    {";
3780   stream << "\n";
3781   stream << indent_str;
3782   stream << "      int option_index = 0;";
3783   stream << "\n";
3784   stream << indent_str;
3785   stream << "\n";
3786   stream << indent_str;
3787   stream << "      static struct option long_options[] = {";
3788   stream << "\n";
3789   stream << indent_str;
3790   indent = 8;
3791   if (long_option_struct.size () > 0)
3792     generate_string (long_option_struct, stream, indent + indent_str.length ());
3793   else
3794     generate_long_option_struct (stream, indent + indent_str.length ());
3795   indent = 0;
3796   stream << indent_str;
3797   stream << "        { 0,  0, 0, 0 }";
3798   stream << "\n";
3799   stream << indent_str;
3800   stream << "      };";
3801   stream << "\n";
3802   stream << indent_str;
3803   stream << "\n";
3804   stream << indent_str;
3805   if (include_getopt)
3806     {
3807       stream << "      custom_optarg = optarg;";
3808       stream << "\n";
3809       stream << indent_str;
3810       stream << "      custom_optind = optind;";
3811       stream << "\n";
3812       stream << indent_str;
3813       stream << "      custom_opterr = opterr;";
3814       stream << "\n";
3815       stream << indent_str;
3816       stream << "      custom_optopt = optopt;";
3817       stream << "\n";
3818       stream << indent_str;
3819       stream << "\n";
3820       stream << indent_str;
3821       stream << "      c = custom_getopt_long (argc, argv, \"";
3822       generate_string (getopt_string, stream, indent + indent_str.length ());
3823       stream << "\", long_options, &option_index);";
3824       stream << "\n";
3825       stream << indent_str;
3826       stream << "\n";
3827       stream << indent_str;
3828       stream << "      optarg = custom_optarg;";
3829       stream << "\n";
3830       stream << indent_str;
3831       stream << "      optind = custom_optind;";
3832       stream << "\n";
3833       stream << indent_str;
3834       stream << "      opterr = custom_opterr;";
3835       stream << "\n";
3836       stream << indent_str;
3837       stream << "      optopt = custom_optopt;";
3838       stream << "\n";
3839       stream << indent_str;
3840     }
3841   else
3842     {
3843       stream << "      c = getopt_long (argc, argv, \"";
3844       generate_string (getopt_string, stream, indent + indent_str.length ());
3845       stream << "\", long_options, &option_index);";
3846       stream << "\n";
3847       stream << indent_str;
3848     }
3849   stream << "\n";
3850   stream << indent_str;
3851   stream << "      if (c == -1) break;  /* Exit from `while (1)' loop.  */";
3852   stream << "\n";
3853   stream << indent_str;
3854   stream << "\n";
3855   stream << indent_str;
3856   stream << "      switch (c)";
3857   stream << "\n";
3858   stream << indent_str;
3859   stream << "        {";
3860   stream << "\n";
3861   stream << indent_str;
3862   indent = 8;
3863   if (handle_option.size () > 0)
3864     generate_string (handle_option, stream, indent + indent_str.length ());
3865   else
3866     generate_handle_option (stream, indent + indent_str.length ());
3867   indent = 0;
3868   stream << indent_str;
3869   stream << "\n";
3870   stream << indent_str;
3871   stream << "        case 0:    /* Long option with no short option */";
3872   stream << "\n";
3873   stream << indent_str;
3874   indent = 10;
3875   if (handle_no_short_option.size () > 0)
3876     generate_string (handle_no_short_option, stream, indent + indent_str.length ());
3877   else
3878     generate_handle_no_short_option (stream, indent + indent_str.length ());
3879   indent = 0;
3880   stream << indent_str;
3881   if (handle_question_mark)
3882     {
3883       stream << "        case '?':      /* Invalid option.  */";
3884       stream << "\n";
3885       stream << indent_str;
3886       stream << "          /* `getopt_long' already printed an error message.  */";
3887       stream << "\n";
3888       stream << indent_str;
3889       stream << "          goto failure;";
3890       stream << "\n";
3891       stream << indent_str;
3892     }
3893   stream << "\n";
3894   stream << indent_str;
3895   stream << "        default:   /* bug: option not considered.  */";
3896   stream << "\n";
3897   stream << indent_str;
3898   stream << "          fprintf (stderr, \"%s: option unknown: %c%s\\n\", ";
3899   generate_string (package_var_name, stream, indent + indent_str.length ());
3900   stream << ", c, (additional_error ? additional_error : \"\"));";
3901   stream << "\n";
3902   stream << indent_str;
3903   stream << "          abort ();";
3904   stream << "\n";
3905   stream << indent_str;
3906   stream << "        } /* switch */";
3907   stream << "\n";
3908   stream << indent_str;
3909   stream << "    } /* while */";
3910   stream << "\n";
3911   stream << indent_str;
3912   stream << "\n";
3913   stream << indent_str;
3914   indent = 2;
3915   if (handle_group.size () > 0)
3916     generate_string (handle_group, stream, indent + indent_str.length ());
3917   else
3918     generate_handle_group (stream, indent + indent_str.length ());
3919   indent = 0;
3920   stream << indent_str;
3921   stream << "\n";
3922   stream << indent_str;
3923   indent = 2;
3924   if (multiple_fill_array.size () > 0)
3925     generate_string (multiple_fill_array, stream, indent + indent_str.length ());
3926   else
3927     generate_multiple_fill_array (stream, indent + indent_str.length ());
3928   indent = 0;
3929   stream << indent_str;
3930   indent = 2;
3931   if (update_multiple_given.size () > 0)
3932     generate_string (update_multiple_given, stream, indent + indent_str.length ());
3933   else
3934     generate_update_multiple_given (stream, indent + indent_str.length ());
3935   indent = 0;
3936   stream << indent_str;
3937   indent = 2;
3938   if (check_modes.size () > 0)
3939     generate_string (check_modes, stream, indent + indent_str.length ());
3940   else
3941     generate_check_modes (stream, indent + indent_str.length ());
3942   indent = 0;
3943   stream << indent_str;
3944   stream << "\n";
3945   stream << indent_str;
3946   if (check_required_options)
3947     {
3948       stream << "  if (check_required)";
3949       stream << "\n";
3950       stream << indent_str;
3951       stream << "    {";
3952       stream << "\n";
3953       stream << indent_str;
3954       stream << "      error += ";
3955       generate_string (parser_name, stream, indent + indent_str.length ());
3956       stream << "_required2 (args_info, argv[0], additional_error);";
3957       stream << "\n";
3958       stream << indent_str;
3959       stream << "    }";
3960       stream << "\n";
3961       stream << indent_str;
3962     }
3963   stream << "\n";
3964   stream << indent_str;
3965   indent = 2;
3966   stream << "  ";
3967   generate_string (parser_name, stream, indent + indent_str.length ());
3968   stream << "_release (&local_args_info);";
3969   indent = 0;
3970   stream << "\n";
3971   stream << indent_str;
3972   stream << "\n";
3973   stream << indent_str;
3974   stream << "  if ( error )";
3975   stream << "\n";
3976   stream << indent_str;
3977   stream << "    return (EXIT_FAILURE);";
3978   stream << "\n";
3979   stream << indent_str;
3980   stream << "\n";
3981   stream << indent_str;
3982   if (handle_unamed)
3983     {
3984       stream << "  if (optind < argc)";
3985       stream << "\n";
3986       stream << indent_str;
3987       stream << "    {";
3988       stream << "\n";
3989       stream << indent_str;
3990       stream << "      int i = 0 ;";
3991       stream << "\n";
3992       stream << indent_str;
3993       stream << "      int found_prog_name = 0;";
3994       stream << "\n";
3995       stream << indent_str;
3996       stream << "      /* whether program name, i.e., argv[0], is in the remaining args";
3997       stream << "\n";
3998       stream << indent_str;
3999       stream << "         (this may happen with some implementations of getopt,";
4000       stream << "\n";
4001       stream << indent_str;
4002       stream << "          but surely not with the one included by gengetopt) */";
4003       stream << "\n";
4004       stream << indent_str;
4005       stream << "\n";
4006       stream << indent_str;
4007       if (include_getopt)
4008         {
4009           
4010       
4011         }
4012       else
4013         {
4014           stream << "      i = optind;";
4015           stream << "\n";
4016           stream << indent_str;
4017           stream << "      while (i < argc)";
4018           stream << "\n";
4019           stream << indent_str;
4020           stream << "        if (argv[i++] == argv[0]) {";
4021           stream << "\n";
4022           stream << indent_str;
4023           stream << "          found_prog_name = 1;";
4024           stream << "\n";
4025           stream << indent_str;
4026           stream << "          break;";
4027           stream << "\n";
4028           stream << indent_str;
4029           stream << "        }";
4030           stream << "\n";
4031           stream << indent_str;
4032           stream << "      i = 0;";
4033           stream << "\n";
4034           stream << indent_str;
4035         }
4036       stream << "\n";
4037       stream << indent_str;
4038       stream << "      args_info->inputs_num = argc - optind - found_prog_name;";
4039       stream << "\n";
4040       stream << indent_str;
4041       stream << "      args_info->inputs =";
4042       stream << "\n";
4043       stream << indent_str;
4044       stream << "        (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;";
4045       stream << "\n";
4046       stream << indent_str;
4047       stream << "      while (optind < argc)";
4048       stream << "\n";
4049       stream << indent_str;
4050       if (include_getopt)
4051         {
4052           stream << "        args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind++]) ;";
4053           stream << "\n";
4054           stream << indent_str;
4055         }
4056       else
4057         {
4058           stream << "        if (argv[optind++] != argv[0])";
4059           stream << "\n";
4060           stream << indent_str;
4061           stream << "          args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ;";
4062           stream << "\n";
4063           stream << indent_str;
4064         }
4065       stream << "    }";
4066       stream << "\n";
4067       stream << indent_str;
4068       stream << "\n";
4069       stream << indent_str;
4070     }
4071   stream << "  return 0;";
4072   stream << "\n";
4073   stream << indent_str;
4074   stream << "\n";
4075   stream << indent_str;
4076   stream << "failure:";
4077   stream << "\n";
4078   stream << indent_str;
4079   indent = 2;
4080   stream << "  ";
4081   if (list_free.size () > 0)
4082     generate_string (list_free, stream, indent + indent_str.length ());
4083   else
4084     generate_list_free (stream, indent + indent_str.length ());
4085   indent = 0;
4086   stream << "\n";
4087   stream << indent_str;
4088   indent = 2;
4089   stream << "  ";
4090   generate_string (parser_name, stream, indent + indent_str.length ());
4091   stream << "_release (&local_args_info);";
4092   indent = 0;
4093   stream << "\n";
4094   stream << indent_str;
4095   stream << "  return (EXIT_FAILURE);";
4096   stream << "\n";
4097   stream << indent_str;
4098   stream << "}";
4099   stream << "\n";
4100   stream << indent_str;
4101   if (conf_parser)
4102     {
4103       stream << "\n";
4104       stream << indent_str;
4105       stream << "#ifndef CONFIG_FILE_LINE_SIZE";
4106       stream << "\n";
4107       stream << indent_str;
4108       stream << "#define CONFIG_FILE_LINE_SIZE 2048";
4109       stream << "\n";
4110       stream << indent_str;
4111       stream << "#endif";
4112       stream << "\n";
4113       stream << indent_str;
4114       stream << "#define ADDITIONAL_ERROR \" in configuration file \"";
4115       stream << "\n";
4116       stream << indent_str;
4117       stream << "\n";
4118       stream << indent_str;
4119       stream << "#define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3)";
4120       stream << "\n";
4121       stream << indent_str;
4122       stream << "/* 3 is for \"--\" and \"=\" */";
4123       stream << "\n";
4124       stream << indent_str;
4125       stream << "\n";
4126       stream << indent_str;
4127       stream << "static int";
4128       stream << "\n";
4129       stream << indent_str;
4130       stream << "_";
4131       generate_string (parser_name, stream, indent + indent_str.length ());
4132       stream << "_configfile (const char *filename, int *my_argc)";
4133       stream << "\n";
4134       stream << indent_str;
4135       stream << "{";
4136       stream << "\n";
4137       stream << indent_str;
4138       stream << "  FILE* file;";
4139       stream << "\n";
4140       stream << indent_str;
4141       stream << "  char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE+1];";
4142       stream << "\n";
4143       stream << indent_str;
4144       stream << "  char linebuf[CONFIG_FILE_LINE_SIZE];";
4145       stream << "\n";
4146       stream << indent_str;
4147       stream << "  int line_num = 0;";
4148       stream << "\n";
4149       stream << indent_str;
4150       stream << "  int result = 0, equal;";
4151       stream << "\n";
4152       stream << indent_str;
4153       stream << "  char *fopt, *farg;";
4154       stream << "\n";
4155       stream << indent_str;
4156       stream << "  char *str_index;";
4157       stream << "\n";
4158       stream << indent_str;
4159       stream << "  size_t len, next_token;";
4160       stream << "\n";
4161       stream << indent_str;
4162       stream << "  char delimiter;";
4163       stream << "\n";
4164       stream << indent_str;
4165       stream << "\n";
4166       stream << indent_str;
4167       stream << "  if ((file = fopen(filename, \"r\")) == 0)";
4168       stream << "\n";
4169       stream << indent_str;
4170       stream << "    {";
4171       stream << "\n";
4172       stream << indent_str;
4173       stream << "      fprintf (stderr, \"%s: Error opening configuration file '%s'\\n\",";
4174       stream << "\n";
4175       stream << indent_str;
4176       indent = 15;
4177       stream << "               ";
4178       generate_string (package_var_name, stream, indent + indent_str.length ());
4179       stream << ", filename);";
4180       indent = 0;
4181       stream << "\n";
4182       stream << indent_str;
4183       stream << "      return EXIT_FAILURE;";
4184       stream << "\n";
4185       stream << indent_str;
4186       stream << "    }";
4187       stream << "\n";
4188       stream << indent_str;
4189       stream << "\n";
4190       stream << indent_str;
4191       stream << "  while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != 0)";
4192       stream << "\n";
4193       stream << indent_str;
4194       stream << "    {";
4195       stream << "\n";
4196       stream << indent_str;
4197       stream << "      ++line_num;";
4198       stream << "\n";
4199       stream << indent_str;
4200       stream << "      my_argv[0] = '\\0';";
4201       stream << "\n";
4202       stream << indent_str;
4203       stream << "      len = strlen(linebuf);";
4204       stream << "\n";
4205       stream << indent_str;
4206       stream << "      if (len > (CONFIG_FILE_LINE_BUFFER_SIZE-1))";
4207       stream << "\n";
4208       stream << indent_str;
4209       stream << "        {";
4210       stream << "\n";
4211       stream << indent_str;
4212       stream << "          fprintf (stderr, \"%s:%s:%d: Line too long in configuration file\\n\",";
4213       stream << "\n";
4214       stream << indent_str;
4215       indent = 19;
4216       stream << "                   ";
4217       generate_string (package_var_name, stream, indent + indent_str.length ());
4218       stream << ", filename, line_num);";
4219       indent = 0;
4220       stream << "\n";
4221       stream << indent_str;
4222       stream << "          result = EXIT_FAILURE;";
4223       stream << "\n";
4224       stream << indent_str;
4225       stream << "          break;";
4226       stream << "\n";
4227       stream << indent_str;
4228       stream << "        }";
4229       stream << "\n";
4230       stream << indent_str;
4231       stream << "\n";
4232       stream << indent_str;
4233       stream << "      /* find first non-whitespace character in the line */";
4234       stream << "\n";
4235       stream << indent_str;
4236       stream << "      next_token = strspn (linebuf, \" \\t\\r\\n\");";
4237       stream << "\n";
4238       stream << indent_str;
4239       stream << "      str_index  = linebuf + next_token;";
4240       stream << "\n";
4241       stream << indent_str;
4242       stream << "\n";
4243       stream << indent_str;
4244       stream << "      if ( str_index[0] == '\\0' || str_index[0] == '#')";
4245       stream << "\n";
4246       stream << indent_str;
4247       stream << "        continue; /* empty line or comment line is skipped */";
4248       stream << "\n";
4249       stream << indent_str;
4250       stream << "\n";
4251       stream << indent_str;
4252       stream << "      fopt = str_index;";
4253       stream << "\n";
4254       stream << indent_str;
4255       stream << "\n";
4256       stream << indent_str;
4257       stream << "      /* truncate fopt at the end of the first non-valid character */";
4258       stream << "\n";
4259       stream << indent_str;
4260       stream << "      next_token = strcspn (fopt, \" \\t\\r\\n=\");";
4261       stream << "\n";
4262       stream << indent_str;
4263       stream << "\n";
4264       stream << indent_str;
4265       stream << "      if (fopt[next_token] == '\\0') /* the line is over */";
4266       stream << "\n";
4267       stream << indent_str;
4268       stream << "        {";
4269       stream << "\n";
4270       stream << indent_str;
4271       stream << "          farg  = 0;";
4272       stream << "\n";
4273       stream << indent_str;
4274       stream << "          equal = 0;";
4275       stream << "\n";
4276       stream << indent_str;
4277       stream << "          goto noarg;";
4278       stream << "\n";
4279       stream << indent_str;
4280       stream << "        }";
4281       stream << "\n";
4282       stream << indent_str;
4283       stream << "\n";
4284       stream << indent_str;
4285       stream << "      /* remember if equal sign is present */";
4286       stream << "\n";
4287       stream << indent_str;
4288       stream << "      equal = (fopt[next_token] == '=');";
4289       stream << "\n";
4290       stream << indent_str;
4291       stream << "      fopt[next_token++] = '\\0';";
4292       stream << "\n";
4293       stream << indent_str;
4294       stream << "\n";
4295       stream << indent_str;
4296       stream << "      /* advance pointers to the next token after the end of fopt */";
4297       stream << "\n";
4298       stream << indent_str;
4299       stream << "      next_token += strspn (fopt + next_token, \" \\t\\r\\n\");";
4300       stream << "\n";
4301       stream << indent_str;
4302       stream << "\n";
4303       stream << indent_str;
4304       stream << "      /* check for the presence of equal sign, and if so, skip it */";
4305       stream << "\n";
4306       stream << indent_str;
4307       stream << "      if ( !equal )";
4308       stream << "\n";
4309       stream << indent_str;
4310       stream << "        if ((equal = (fopt[next_token] == '=')))";
4311       stream << "\n";
4312       stream << indent_str;
4313       stream << "          {";
4314       stream << "\n";
4315       stream << indent_str;
4316       stream << "            next_token++;";
4317       stream << "\n";
4318       stream << indent_str;
4319       stream << "            next_token += strspn (fopt + next_token, \" \\t\\r\\n\");";
4320       stream << "\n";
4321       stream << indent_str;
4322       stream << "          }";
4323       stream << "\n";
4324       stream << indent_str;
4325       stream << "      str_index  += next_token;";
4326       stream << "\n";
4327       stream << indent_str;
4328       stream << "\n";
4329       stream << indent_str;
4330       stream << "      /* find argument */";
4331       stream << "\n";
4332       stream << indent_str;
4333       stream << "      farg = str_index;";
4334       stream << "\n";
4335       stream << indent_str;
4336       stream << "      if ( farg[0] == '\\\"' || farg[0] == '\\'' )";
4337       stream << "\n";
4338       stream << indent_str;
4339       stream << "        { /* quoted argument */";
4340       stream << "\n";
4341       stream << indent_str;
4342       stream << "          str_index = strchr (++farg, str_index[0] ); /* skip opening quote */";
4343       stream << "\n";
4344       stream << indent_str;
4345       stream << "          if (! str_index)";
4346       stream << "\n";
4347       stream << indent_str;
4348       stream << "            {";
4349       stream << "\n";
4350       stream << indent_str;
4351       stream << "              fprintf";
4352       stream << "\n";
4353       stream << indent_str;
4354       stream << "                (stderr,";
4355       stream << "\n";
4356       stream << indent_str;
4357       stream << "                 \"%s:%s:%d: unterminated string in configuration file\\n\",";
4358       stream << "\n";
4359       stream << indent_str;
4360       indent = 17;
4361       stream << "                 ";
4362       generate_string (package_var_name, stream, indent + indent_str.length ());
4363       stream << ", filename, line_num);";
4364       indent = 0;
4365       stream << "\n";
4366       stream << indent_str;
4367       stream << "              result = EXIT_FAILURE;";
4368       stream << "\n";
4369       stream << indent_str;
4370       stream << "              break;";
4371       stream << "\n";
4372       stream << indent_str;
4373       stream << "            }";
4374       stream << "\n";
4375       stream << indent_str;
4376       stream << "        }";
4377       stream << "\n";
4378       stream << indent_str;
4379       stream << "      else";
4380       stream << "\n";
4381       stream << indent_str;
4382       stream << "        { /* read up the remaining part up to a delimiter */";
4383       stream << "\n";
4384       stream << indent_str;
4385       stream << "          next_token = strcspn (farg, \" \\t\\r\\n#\\'\\\"\");";
4386       stream << "\n";
4387       stream << indent_str;
4388       stream << "          str_index += next_token;";
4389       stream << "\n";
4390       stream << indent_str;
4391       stream << "        }";
4392       stream << "\n";
4393       stream << indent_str;
4394       stream << "\n";
4395       stream << indent_str;
4396       stream << "      /* truncate farg at the delimiter and store it for further check */";
4397       stream << "\n";
4398       stream << indent_str;
4399       stream << "      delimiter = *str_index, *str_index++ = '\\0';";
4400       stream << "\n";
4401       stream << indent_str;
4402       stream << "\n";
4403       stream << indent_str;
4404       stream << "      /* everything but comment is illegal at the end of line */";
4405       stream << "\n";
4406       stream << indent_str;
4407       stream << "      if (delimiter != '\\0' && delimiter != '#')";
4408       stream << "\n";
4409       stream << indent_str;
4410       stream << "        {";
4411       stream << "\n";
4412       stream << indent_str;
4413       stream << "          str_index += strspn(str_index, \" \\t\\r\\n\");";
4414       stream << "\n";
4415       stream << indent_str;
4416       stream << "          if (*str_index != '\\0' && *str_index != '#')";
4417       stream << "\n";
4418       stream << indent_str;
4419       stream << "            {";
4420       stream << "\n";
4421       stream << indent_str;
4422       stream << "              fprintf";
4423       stream << "\n";
4424       stream << indent_str;
4425       stream << "                (stderr,";
4426       stream << "\n";
4427       stream << indent_str;
4428       stream << "                 \"%s:%s:%d: malformed string in configuration file\\n\",";
4429       stream << "\n";
4430       stream << indent_str;
4431       indent = 17;
4432       stream << "                 ";
4433       generate_string (package_var_name, stream, indent + indent_str.length ());
4434       stream << ", filename, line_num);";
4435       indent = 0;
4436       stream << "\n";
4437       stream << indent_str;
4438       stream << "              result = EXIT_FAILURE;";
4439       stream << "\n";
4440       stream << indent_str;
4441       stream << "              break;";
4442       stream << "\n";
4443       stream << indent_str;
4444       stream << "            }";
4445       stream << "\n";
4446       stream << indent_str;
4447       stream << "        }";
4448       stream << "\n";
4449       stream << indent_str;
4450       stream << "\n";
4451       stream << indent_str;
4452       stream << "    noarg:";
4453       stream << "\n";
4454       stream << indent_str;
4455       stream << "      if (!strcmp(fopt,\"include\")) {";
4456       stream << "\n";
4457       stream << indent_str;
4458       stream << "        if (farg && *farg) {";
4459       stream << "\n";
4460       stream << indent_str;
4461       stream << "          result = _";
4462       generate_string (parser_name, stream, indent + indent_str.length ());
4463       stream << "_configfile(farg, my_argc);";
4464       stream << "\n";
4465       stream << indent_str;
4466       stream << "        } else {";
4467       stream << "\n";
4468       stream << indent_str;
4469       stream << "          fprintf(stderr, \"%s:%s:%d: include requires a filename argument.\\n\",";
4470       stream << "\n";
4471       stream << indent_str;
4472       indent = 18;
4473       stream << "                  ";
4474       generate_string (package_var_name, stream, indent + indent_str.length ());
4475       stream << ", filename, line_num);";
4476       indent = 0;
4477       stream << "\n";
4478       stream << indent_str;
4479       stream << "        }";
4480       stream << "\n";
4481       stream << indent_str;
4482       stream << "        continue;";
4483       stream << "\n";
4484       stream << indent_str;
4485       stream << "      }";
4486       stream << "\n";
4487       stream << indent_str;
4488       stream << "      len = strlen(fopt);";
4489       stream << "\n";
4490       stream << indent_str;
4491       stream << "      strcat (my_argv, len > 1 ? \"--\" : \"-\");";
4492       stream << "\n";
4493       stream << indent_str;
4494       stream << "      strcat (my_argv, fopt);";
4495       stream << "\n";
4496       stream << indent_str;
4497       stream << "      if (len > 1 && ((farg && *farg) || equal))";
4498       stream << "\n";
4499       stream << indent_str;
4500       stream << "        strcat (my_argv, \"=\");";
4501       stream << "\n";
4502       stream << indent_str;
4503       stream << "      if (farg && *farg)";
4504       stream << "\n";
4505       stream << indent_str;
4506       stream << "        strcat (my_argv, farg);";
4507       stream << "\n";
4508       stream << indent_str;
4509       stream << "      ++(*my_argc);";
4510       stream << "\n";
4511       stream << indent_str;
4512       stream << "\n";
4513       stream << indent_str;
4514       stream << "      cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));";
4515       stream << "\n";
4516       stream << indent_str;
4517       stream << "      cmd_line_list_tmp->next = cmd_line_list;";
4518       stream << "\n";
4519       stream << indent_str;
4520       stream << "      cmd_line_list = cmd_line_list_tmp;";
4521       stream << "\n";
4522       stream << indent_str;
4523       stream << "      cmd_line_list->string_arg = gengetopt_strdup(my_argv);";
4524       stream << "\n";
4525       stream << indent_str;
4526       stream << "    } /* while */";
4527       stream << "\n";
4528       stream << indent_str;
4529       stream << "\n";
4530       stream << indent_str;
4531       stream << "  if (file)";
4532       stream << "\n";
4533       stream << indent_str;
4534       stream << "    fclose(file);";
4535       stream << "\n";
4536       stream << indent_str;
4537       stream << "  return result;";
4538       stream << "\n";
4539       stream << indent_str;
4540       stream << "}";
4541       stream << "\n";
4542       stream << indent_str;
4543       stream << "\n";
4544       stream << indent_str;
4545       stream << "int";
4546       stream << "\n";
4547       stream << indent_str;
4548       generate_string (parser_name, stream, indent + indent_str.length ());
4549       stream << "_configfile (";
4550       stream << "\n";
4551       stream << indent_str;
4552       stream << "  const char *filename,";
4553       stream << "\n";
4554       stream << indent_str;
4555       stream << "                           struct ";
4556       generate_string (args_info, stream, indent + indent_str.length ());
4557       stream << " *args_info,";
4558       stream << "\n";
4559       stream << indent_str;
4560       stream << "                           int override, int initialize, int check_required)";
4561       stream << "\n";
4562       stream << indent_str;
4563       stream << "{";
4564       stream << "\n";
4565       stream << indent_str;
4566       stream << "  struct ";
4567       generate_string (parser_name, stream, indent + indent_str.length ());
4568       stream << "_params params;";
4569       stream << "\n";
4570       stream << indent_str;
4571       stream << "\n";
4572       stream << indent_str;
4573       stream << "  params.override = override;";
4574       stream << "\n";
4575       stream << indent_str;
4576       stream << "  params.initialize = initialize;";
4577       stream << "\n";
4578       stream << indent_str;
4579       stream << "  params.check_required = check_required;";
4580       stream << "\n";
4581       stream << indent_str;
4582       stream << "  params.check_ambiguity = 0;";
4583       stream << "\n";
4584       stream << indent_str;
4585       stream << "  params.print_errors = 1;";
4586       stream << "\n";
4587       stream << indent_str;
4588       indent = 2;
4589       stream << "  ";
4590       indent = 0;
4591       stream << "\n";
4592       stream << indent_str;
4593       stream << "  return ";
4594       generate_string (parser_name, stream, indent + indent_str.length ());
4595       stream << "_config_file (filename, args_info, &params);";
4596       stream << "\n";
4597       stream << indent_str;
4598       stream << "}";
4599       stream << "\n";
4600       stream << indent_str;
4601       stream << "\n";
4602       stream << indent_str;
4603       stream << "int";
4604       stream << "\n";
4605       stream << indent_str;
4606       generate_string (parser_name, stream, indent + indent_str.length ());
4607       stream << "_config_file (const char *filename,";
4608       stream << "\n";
4609       stream << indent_str;
4610       stream << "                           struct ";
4611       generate_string (args_info, stream, indent + indent_str.length ());
4612       stream << " *args_info,";
4613       stream << "\n";
4614       stream << indent_str;
4615       stream << "                           struct ";
4616       generate_string (parser_name, stream, indent + indent_str.length ());
4617       stream << "_params *params)";
4618       stream << "\n";
4619       stream << indent_str;
4620       stream << "{";
4621       stream << "\n";
4622       stream << indent_str;
4623       stream << "  int i, result;";
4624       stream << "\n";
4625       stream << indent_str;
4626       stream << "  int my_argc = 1;";
4627       stream << "\n";
4628       stream << indent_str;
4629       stream << "  char **my_argv_arg;";
4630       stream << "\n";
4631       stream << indent_str;
4632       stream << "  char *additional_error;";
4633       stream << "\n";
4634       stream << indent_str;
4635       stream << "\n";
4636       stream << indent_str;
4637       stream << "  /* store the program name */";
4638       stream << "\n";
4639       stream << indent_str;
4640       stream << "  cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));";
4641       stream << "\n";
4642       stream << indent_str;
4643       stream << "  cmd_line_list_tmp->next = cmd_line_list;";
4644       stream << "\n";
4645       stream << indent_str;
4646       stream << "  cmd_line_list = cmd_line_list_tmp;";
4647       stream << "\n";
4648       stream << indent_str;
4649       stream << "  cmd_line_list->string_arg = gengetopt_strdup (";
4650       generate_string (package_var_name, stream, indent + indent_str.length ());
4651       stream << ");";
4652       stream << "\n";
4653       stream << indent_str;
4654       stream << "\n";
4655       stream << indent_str;
4656       stream << "  result = _";
4657       generate_string (parser_name, stream, indent + indent_str.length ());
4658       stream << "_configfile(filename, &my_argc);";
4659       stream << "\n";
4660       stream << indent_str;
4661       stream << "\n";
4662       stream << indent_str;
4663       stream << "  if (result != EXIT_FAILURE) {";
4664       stream << "\n";
4665       stream << indent_str;
4666       stream << "    my_argv_arg = (char **) malloc((my_argc+1) * sizeof(char *));";
4667       stream << "\n";
4668       stream << indent_str;
4669       stream << "    cmd_line_list_tmp = cmd_line_list;";
4670       stream << "\n";
4671       stream << indent_str;
4672       stream << "\n";
4673       stream << indent_str;
4674       stream << "    for (i = my_argc - 1; i >= 0; --i) {";
4675       stream << "\n";
4676       stream << indent_str;
4677       stream << "      my_argv_arg[i] = cmd_line_list_tmp->string_arg;";
4678       stream << "\n";
4679       stream << indent_str;
4680       stream << "      cmd_line_list_tmp = cmd_line_list_tmp->next;";
4681       stream << "\n";
4682       stream << indent_str;
4683       stream << "    }";
4684       stream << "\n";
4685       stream << indent_str;
4686       stream << "\n";
4687       stream << indent_str;
4688       stream << "    my_argv_arg[my_argc] = 0;";
4689       stream << "\n";
4690       stream << indent_str;
4691       stream << "\n";
4692       stream << indent_str;
4693       stream << "    additional_error = (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) + 1);";
4694       stream << "\n";
4695       stream << indent_str;
4696       stream << "    strcpy (additional_error, ADDITIONAL_ERROR);";
4697       stream << "\n";
4698       stream << indent_str;
4699       stream << "    strcat (additional_error, filename);";
4700       stream << "\n";
4701       stream << indent_str;
4702       stream << "    result =";
4703       stream << "\n";
4704       stream << indent_str;
4705       indent = 6;
4706       stream << "      ";
4707       generate_string (parser_name, stream, indent + indent_str.length ());
4708       stream << "_internal (my_argc, my_argv_arg, args_info,";
4709       indent = 0;
4710       stream << "\n";
4711       stream << indent_str;
4712       stream << "                              params,";
4713       stream << "\n";
4714       stream << indent_str;
4715       stream << "                              additional_error);";
4716       stream << "\n";
4717       stream << indent_str;
4718       stream << "\n";
4719       stream << indent_str;
4720       stream << "    free (additional_error);";
4721       stream << "\n";
4722       stream << indent_str;
4723       stream << "    free (my_argv_arg);";
4724       stream << "\n";
4725       stream << indent_str;
4726       stream << "  }";
4727       stream << "\n";
4728       stream << indent_str;
4729       stream << "\n";
4730       stream << indent_str;
4731       stream << "  free_cmd_list();";
4732       stream << "\n";
4733       stream << indent_str;
4734       indent = 2;
4735       stream << "  ";
4736       generate_string (final_exit, stream, indent + indent_str.length ());
4737       indent = 0;
4738       stream << "\n";
4739       stream << indent_str;
4740       stream << "}";
4741       stream << "\n";
4742       stream << indent_str;
4743     }
4744   if (generate_string_parser)
4745     {
4746       stream << "\n";
4747       stream << indent_str;
4748       stream << "static unsigned int";
4749       stream << "\n";
4750       stream << indent_str;
4751       generate_string (parser_name, stream, indent + indent_str.length ());
4752       stream << "_create_argv(const char *cmdline_, char ***argv_ptr, const char *prog_name)";
4753       stream << "\n";
4754       stream << indent_str;
4755       stream << "{";
4756       stream << "\n";
4757       stream << indent_str;
4758       stream << "  char *cmdline, *p;";
4759       stream << "\n";
4760       stream << indent_str;
4761       stream << "  size_t n = 0, j;";
4762       stream << "\n";
4763       stream << indent_str;
4764       stream << "  int i;";
4765       stream << "\n";
4766       stream << indent_str;
4767       stream << "\n";
4768       stream << indent_str;
4769       stream << "  if (prog_name) {";
4770       stream << "\n";
4771       stream << indent_str;
4772       stream << "    cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));";
4773       stream << "\n";
4774       stream << indent_str;
4775       stream << "    cmd_line_list_tmp->next = cmd_line_list;";
4776       stream << "\n";
4777       stream << indent_str;
4778       stream << "    cmd_line_list = cmd_line_list_tmp;";
4779       stream << "\n";
4780       stream << indent_str;
4781       stream << "    cmd_line_list->string_arg = gengetopt_strdup (prog_name);";
4782       stream << "\n";
4783       stream << indent_str;
4784       stream << "\n";
4785       stream << indent_str;
4786       stream << "    ++n;";
4787       stream << "\n";
4788       stream << indent_str;
4789       stream << "  }";
4790       stream << "\n";
4791       stream << indent_str;
4792       stream << "\n";
4793       stream << indent_str;
4794       stream << "  cmdline = gengetopt_strdup(cmdline_);";
4795       stream << "\n";
4796       stream << indent_str;
4797       stream << "  p = cmdline;";
4798       stream << "\n";
4799       stream << indent_str;
4800       stream << "\n";
4801       stream << indent_str;
4802       stream << "  while (p && strlen(p))";
4803       stream << "\n";
4804       stream << indent_str;
4805       stream << "    {";
4806       stream << "\n";
4807       stream << indent_str;
4808       stream << "      j = strcspn(p, \" \\t\");";
4809       stream << "\n";
4810       stream << indent_str;
4811       stream << "      ++n;";
4812       stream << "\n";
4813       stream << indent_str;
4814       stream << "      if (j && j < strlen(p))";
4815       stream << "\n";
4816       stream << indent_str;
4817       stream << "        {";
4818       stream << "\n";
4819       stream << indent_str;
4820       stream << "          p[j] = '\\0';";
4821       stream << "\n";
4822       stream << indent_str;
4823       stream << "\n";
4824       stream << indent_str;
4825       stream << "          cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));";
4826       stream << "\n";
4827       stream << indent_str;
4828       stream << "          cmd_line_list_tmp->next = cmd_line_list;";
4829       stream << "\n";
4830       stream << indent_str;
4831       stream << "          cmd_line_list = cmd_line_list_tmp;";
4832       stream << "\n";
4833       stream << indent_str;
4834       stream << "          cmd_line_list->string_arg = gengetopt_strdup (p);";
4835       stream << "\n";
4836       stream << indent_str;
4837       stream << "\n";
4838       stream << indent_str;
4839       stream << "          p += (j+1);";
4840       stream << "\n";
4841       stream << indent_str;
4842       stream << "          p += strspn(p, \" \\t\");";
4843       stream << "\n";
4844       stream << indent_str;
4845       stream << "        }";
4846       stream << "\n";
4847       stream << indent_str;
4848       stream << "      else";
4849       stream << "\n";
4850       stream << indent_str;
4851       stream << "        {";
4852       stream << "\n";
4853       stream << indent_str;
4854       stream << "          cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));";
4855       stream << "\n";
4856       stream << indent_str;
4857       stream << "          cmd_line_list_tmp->next = cmd_line_list;";
4858       stream << "\n";
4859       stream << indent_str;
4860       stream << "          cmd_line_list = cmd_line_list_tmp;";
4861       stream << "\n";
4862       stream << indent_str;
4863       stream << "          cmd_line_list->string_arg = gengetopt_strdup (p);";
4864       stream << "\n";
4865       stream << indent_str;
4866       stream << "\n";
4867       stream << indent_str;
4868       stream << "          break;";
4869       stream << "\n";
4870       stream << indent_str;
4871       stream << "        }";
4872       stream << "\n";
4873       stream << indent_str;
4874       stream << "    }";
4875       stream << "\n";
4876       stream << indent_str;
4877       stream << "\n";
4878       stream << indent_str;
4879       stream << "  *argv_ptr = (char **) malloc((n + 1) * sizeof(char *));";
4880       stream << "\n";
4881       stream << indent_str;
4882       stream << "  cmd_line_list_tmp = cmd_line_list;";
4883       stream << "\n";
4884       stream << indent_str;
4885       stream << "  for (i = (n-1); i >= 0; --i)";
4886       stream << "\n";
4887       stream << indent_str;
4888       stream << "    {";
4889       stream << "\n";
4890       stream << indent_str;
4891       stream << "      (*argv_ptr)[i] = cmd_line_list_tmp->string_arg;";
4892       stream << "\n";
4893       stream << indent_str;
4894       stream << "      cmd_line_list_tmp = cmd_line_list_tmp->next;";
4895       stream << "\n";
4896       stream << indent_str;
4897       stream << "    }";
4898       stream << "\n";
4899       stream << indent_str;
4900       stream << "\n";
4901       stream << indent_str;
4902       stream << "  (*argv_ptr)[n] = 0;";
4903       stream << "\n";
4904       stream << indent_str;
4905       stream << "\n";
4906       stream << indent_str;
4907       stream << "  free(cmdline);";
4908       stream << "\n";
4909       stream << indent_str;
4910       stream << "  return n;";
4911       stream << "\n";
4912       stream << indent_str;
4913       stream << "}";
4914       stream << "\n";
4915       stream << indent_str;
4916       stream << "\n";
4917       stream << indent_str;
4918       stream << "int";
4919       stream << "\n";
4920       stream << indent_str;
4921       generate_string (parser_name, stream, indent + indent_str.length ());
4922       stream << "_string(const char *cmdline, struct ";
4923       generate_string (args_info, stream, indent + indent_str.length ());
4924       stream << " *args_info, const char *prog_name)";
4925       stream << "\n";
4926       stream << indent_str;
4927       stream << "{";
4928       stream << "\n";
4929       stream << indent_str;
4930       stream << "  return ";
4931       generate_string (parser_name, stream, indent + indent_str.length ());
4932       stream << "_string2(cmdline, args_info, prog_name, 0, 1, 1);";
4933       stream << "\n";
4934       stream << indent_str;
4935       stream << "}";
4936       stream << "\n";
4937       stream << indent_str;
4938       stream << "\n";
4939       stream << indent_str;
4940       stream << "int";
4941       stream << "\n";
4942       stream << indent_str;
4943       generate_string (parser_name, stream, indent + indent_str.length ());
4944       stream << "_string2(const char *cmdline, struct ";
4945       generate_string (args_info, stream, indent + indent_str.length ());
4946       stream << " *args_info, const char *prog_name,";
4947       stream << "\n";
4948       stream << indent_str;
4949       stream << "    int override, int initialize, int check_required)";
4950       stream << "\n";
4951       stream << indent_str;
4952       stream << "{";
4953       stream << "\n";
4954       stream << indent_str;
4955       stream << "  struct ";
4956       generate_string (parser_name, stream, indent + indent_str.length ());
4957       stream << "_params params;";
4958       stream << "\n";
4959       stream << indent_str;
4960       stream << "\n";
4961       stream << indent_str;
4962       stream << "  params.override = override;";
4963       stream << "\n";
4964       stream << indent_str;
4965       stream << "  params.initialize = initialize;";
4966       stream << "\n";
4967       stream << indent_str;
4968       stream << "  params.check_required = check_required;";
4969       stream << "\n";
4970       stream << indent_str;
4971       stream << "  params.check_ambiguity = 0;";
4972       stream << "\n";
4973       stream << indent_str;
4974       stream << "  params.print_errors = 1;";
4975       stream << "\n";
4976       stream << indent_str;
4977       stream << "\n";
4978       stream << indent_str;
4979       stream << "  return ";
4980       generate_string (parser_name, stream, indent + indent_str.length ());
4981       stream << "_string_ext(cmdline, args_info, prog_name, &params);";
4982       stream << "\n";
4983       stream << indent_str;
4984       stream << "}";
4985       stream << "\n";
4986       stream << indent_str;
4987       stream << "\n";
4988       stream << indent_str;
4989       stream << "int";
4990       stream << "\n";
4991       stream << indent_str;
4992       generate_string (parser_name, stream, indent + indent_str.length ());
4993       stream << "_string_ext(const char *cmdline, struct ";
4994       generate_string (args_info, stream, indent + indent_str.length ());
4995       stream << " *args_info, const char *prog_name,";
4996       stream << "\n";
4997       stream << indent_str;
4998       stream << "    struct ";
4999       generate_string (parser_name, stream, indent + indent_str.length ());
5000       stream << "_params *params)";
5001       stream << "\n";
5002       stream << indent_str;
5003       stream << "{";
5004       stream << "\n";
5005       stream << indent_str;
5006       stream << "  char **argv_ptr = 0;";
5007       stream << "\n";
5008       stream << indent_str;
5009       stream << "  int result;";
5010       stream << "\n";
5011       stream << indent_str;
5012       stream << "  unsigned int argc;";
5013       stream << "\n";
5014       stream << indent_str;
5015       indent = 2;
5016       stream << "  ";
5017       indent = 0;
5018       stream << "\n";
5019       stream << indent_str;
5020       stream << "  argc = ";
5021       generate_string (parser_name, stream, indent + indent_str.length ());
5022       stream << "_create_argv(cmdline, &argv_ptr, prog_name);";
5023       stream << "\n";
5024       stream << indent_str;
5025       indent = 2;
5026       stream << "  ";
5027       indent = 0;
5028       stream << "\n";
5029       stream << indent_str;
5030       stream << "  result =";
5031       stream << "\n";
5032       stream << indent_str;
5033       indent = 4;
5034       stream << "    ";
5035       generate_string (parser_name, stream, indent + indent_str.length ());
5036       stream << "_internal (argc, argv_ptr, args_info, params, 0);";
5037       indent = 0;
5038       stream << "\n";
5039       stream << indent_str;
5040       indent = 2;
5041       stream << "  ";
5042       indent = 0;
5043       stream << "\n";
5044       stream << indent_str;
5045       stream << "  if (argv_ptr)";
5046       stream << "\n";
5047       stream << indent_str;
5048       stream << "    {";
5049       stream << "\n";
5050       stream << indent_str;
5051       stream << "      free (argv_ptr);";
5052       stream << "\n";
5053       stream << indent_str;
5054       stream << "    }";
5055       stream << "\n";
5056       stream << indent_str;
5057       stream << "\n";
5058       stream << indent_str;
5059       stream << "  free_cmd_list();";
5060       stream << "\n";
5061       stream << indent_str;
5062       indent = 2;
5063       stream << "  ";
5064       indent = 0;
5065       stream << "\n";
5066       stream << indent_str;
5067       indent = 2;
5068       stream << "  ";
5069       generate_string (final_exit, stream, indent + indent_str.length ());
5070       indent = 0;
5071       stream << "\n";
5072       stream << indent_str;
5073       stream << "}";
5074       stream << "\n";
5075       stream << indent_str;
5076       stream << "\n";
5077       stream << indent_str;
5078     }
5079 }