ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/utils/wingetopt.cpp
Revision: 1943
Committed: Tue Nov 5 19:12:57 2013 UTC (11 years, 5 months ago) by gezelter
File size: 32693 byte(s)
Log Message:
Quiet down a few warnings in MSVC

File Contents

# User Rev Content
1 gezelter 1943 /* Getopt for Microsoft C
2     This code is a modification of the Free Software Foundation, Inc.
3     Getopt library for parsing command line argument the purpose was
4     to provide a Microsoft Visual C friendly derivative. This code
5     provides functionality for both Unicode and Multibyte builds.
6 gezelter 1795
7 gezelter 1943 Date: 02/03/2011 - Ludvik Jerabek - Initial Release
8     Version: 1.0
9     Comment: Supports getopt, getopt_long, and getopt_long_only
10     and POSIXLY_CORRECT environment flag
11     License: LGPL
12 gezelter 1795
13 gezelter 1943 Revisions:
14 gezelter 1795
15 gezelter 1943 02/03/2011 - Ludvik Jerabek - Initial Release
16     02/20/2011 - Ludvik Jerabek - Fixed compiler warnings at Level 4
17     07/05/2011 - Ludvik Jerabek - Added no_argument, required_argument, optional_argument defs
18     08/03/2011 - Ludvik Jerabek - Fixed non-argument runtime bug which caused runtime exception
19     08/09/2011 - Ludvik Jerabek - Added code to export functions for DLL and LIB
20     02/15/2012 - Ludvik Jerabek - Fixed _GETOPT_THROW definition missing in implementation file
21     08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi
22     10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features
23     21/03/2013 - Isaias Lourenco - Suppressed C4273 warning in Visual Studio
24 gezelter 1795
25 gezelter 1943 **DISCLAIMER**
26     THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
27     EITHER EXPRESS OR IMPLIED, INCLUDING, BUT Not LIMITED TO, THE
28     IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
29     PURPOSE, OR NON-INFRINGEMENT. SOME JURISDICTIONS DO NOT ALLOW THE
30     EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT
31     APPLY TO YOU. IN NO EVENT WILL I BE LIABLE TO ANY PARTY FOR ANY
32     DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES FOR ANY
33     USE OF THIS MATERIAL INCLUDING, WITHOUT LIMITATION, ANY LOST
34     PROFITS, BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER DATA ON
35     YOUR INFORMATION HANDLING SYSTEM OR OTHERWISE, EVEN If WE ARE
36     EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
37 gezelter 1795 */
38     #define _CRT_SECURE_NO_WARNINGS
39     #include <stdlib.h>
40     #include <stdio.h>
41 gezelter 1943 #include <malloc.h>
42     #include "wingetopt.h"
43 gezelter 1795
44     #ifdef __cplusplus
45     #define _GETOPT_THROW throw()
46     #else
47     #define _GETOPT_THROW
48     #endif
49    
50 gezelter 1943 #ifdef _MSC_VER
51     //Disable -> warning C4273: 'abc' : inconsistent dll linkage
52     #pragma warning (disable : 4273)
53     #endif
54 gezelter 1795
55     int optind = 1;
56     int opterr = 1;
57     int optopt = '?';
58 gezelter 1943 enum ENUM_ORDERING { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER };
59 gezelter 1795
60 gezelter 1943 //
61     //
62     // Ansi structures and functions follow
63     //
64     //
65    
66     static struct _getopt_data_a
67 gezelter 1795 {
68 gezelter 1943 int optind;
69     int opterr;
70     int optopt;
71     char *optarg;
72     int __initialized;
73     char *__nextchar;
74     enum ENUM_ORDERING __ordering;
75     int __posixly_correct;
76     int __first_nonopt;
77     int __last_nonopt;
78     } getopt_data_a;
79     char *optarg_a;
80 gezelter 1795
81 gezelter 1943 static void exchange_a(char **argv, struct _getopt_data_a *d)
82 gezelter 1795 {
83 gezelter 1943 int bottom = d->__first_nonopt;
84     int middle = d->__last_nonopt;
85     int top = d->optind;
86     char *tem;
87     while (top > middle && middle > bottom)
88     {
89     if (top - middle > middle - bottom)
90     {
91     int len = middle - bottom;
92     register int i;
93     for (i = 0; i < len; i++)
94     {
95     tem = argv[bottom + i];
96     argv[bottom + i] = argv[top - (middle - bottom) + i];
97     argv[top - (middle - bottom) + i] = tem;
98     }
99     top -= len;
100     }
101     else
102     {
103     int len = top - middle;
104     register int i;
105     for (i = 0; i < len; i++)
106     {
107     tem = argv[bottom + i];
108     argv[bottom + i] = argv[middle + i];
109     argv[middle + i] = tem;
110     }
111     bottom += len;
112     }
113     }
114     d->__first_nonopt += (d->optind - d->__last_nonopt);
115     d->__last_nonopt = d->optind;
116 gezelter 1795 }
117     static const char *_getopt_initialize_a (const char *optstring, struct _getopt_data_a *d, int posixly_correct)
118     {
119 gezelter 1943 d->__first_nonopt = d->__last_nonopt = d->optind;
120     d->__nextchar = NULL;
121     d->__posixly_correct = posixly_correct | !!getenv("POSIXLY_CORRECT");
122     if (optstring[0] == '-')
123     {
124     d->__ordering = RETURN_IN_ORDER;
125     ++optstring;
126     }
127     else if (optstring[0] == '+')
128     {
129     d->__ordering = REQUIRE_ORDER;
130     ++optstring;
131     }
132     else if (d->__posixly_correct)
133     d->__ordering = REQUIRE_ORDER;
134     else
135     d->__ordering = PERMUTE;
136     return optstring;
137 gezelter 1795 }
138 gezelter 1943 int _getopt_internal_r_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, struct _getopt_data_a *d, int posixly_correct)
139 gezelter 1795 {
140 gezelter 1943 int print_errors = d->opterr;
141     if (argc < 1)
142     return -1;
143     d->optarg = NULL;
144     if (d->optind == 0 || !d->__initialized)
145     {
146     if (d->optind == 0)
147     d->optind = 1;
148     optstring = _getopt_initialize_a (optstring, d, posixly_correct);
149     d->__initialized = 1;
150     }
151     else if (optstring[0] == '-' || optstring[0] == '+')
152     optstring++;
153     if (optstring[0] == ':')
154     print_errors = 0;
155     if (d->__nextchar == NULL || *d->__nextchar == '\0')
156     {
157     if (d->__last_nonopt > d->optind)
158     d->__last_nonopt = d->optind;
159     if (d->__first_nonopt > d->optind)
160     d->__first_nonopt = d->optind;
161     if (d->__ordering == PERMUTE)
162     {
163     if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
164     exchange_a ((char **) argv, d);
165     else if (d->__last_nonopt != d->optind)
166     d->__first_nonopt = d->optind;
167     while (d->optind < argc && (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0'))
168     d->optind++;
169     d->__last_nonopt = d->optind;
170     }
171     if (d->optind != argc && !strcmp(argv[d->optind], "--"))
172     {
173     d->optind++;
174     if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
175     exchange_a((char **) argv, d);
176     else if (d->__first_nonopt == d->__last_nonopt)
177     d->__first_nonopt = d->optind;
178     d->__last_nonopt = argc;
179     d->optind = argc;
180     }
181     if (d->optind == argc)
182     {
183     if (d->__first_nonopt != d->__last_nonopt)
184     d->optind = d->__first_nonopt;
185     return -1;
186     }
187     if ((argv[d->optind][0] != '-' || argv[d->optind][1] == '\0'))
188     {
189     if (d->__ordering == REQUIRE_ORDER)
190     return -1;
191     d->optarg = argv[d->optind++];
192     return 1;
193     }
194     d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == '-'));
195     }
196     if (longopts != NULL && (argv[d->optind][1] == '-' || (long_only && (argv[d->optind][2] || !strchr(optstring, argv[d->optind][1])))))
197     {
198     char *nameend;
199     unsigned int namelen;
200     const struct option_a *p;
201     const struct option_a *pfound = NULL;
202     struct option_list
203     {
204     const struct option_a *p;
205     struct option_list *next;
206     } *ambig_list = NULL;
207     int exact = 0;
208     int indfound = -1;
209     int option_index;
210     for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++);
211     namelen = (unsigned int)(nameend - d->__nextchar);
212     for (p = longopts, option_index = 0; p->name; p++, option_index++)
213     if (!strncmp(p->name, d->__nextchar, namelen))
214     {
215     if (namelen == (unsigned int)strlen(p->name))
216     {
217     pfound = p;
218     indfound = option_index;
219     exact = 1;
220     break;
221     }
222     else if (pfound == NULL)
223     {
224     pfound = p;
225     indfound = option_index;
226     }
227     else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
228     {
229     struct option_list *newp = (struct option_list*)alloca(sizeof(*newp));
230     newp->p = p;
231     newp->next = ambig_list;
232     ambig_list = newp;
233     }
234     }
235     if (ambig_list != NULL && !exact)
236     {
237     if (print_errors)
238     {
239     struct option_list first;
240     first.p = pfound;
241     first.next = ambig_list;
242     ambig_list = &first;
243     fprintf (stderr, "%s: option '%s' is ambiguous; possibilities:", argv[0], argv[d->optind]);
244     do
245     {
246     fprintf (stderr, " '--%s'", ambig_list->p->name);
247     ambig_list = ambig_list->next;
248     }
249     while (ambig_list != NULL);
250     fputc ('\n', stderr);
251     }
252     d->__nextchar += strlen(d->__nextchar);
253     d->optind++;
254     d->optopt = 0;
255     return '?';
256     }
257     if (pfound != NULL)
258     {
259     option_index = indfound;
260     d->optind++;
261     if (*nameend)
262     {
263     if (pfound->has_arg)
264     d->optarg = nameend + 1;
265     else
266     {
267     if (print_errors)
268     {
269     if (argv[d->optind - 1][1] == '-')
270     {
271     fprintf(stderr, "%s: option '--%s' doesn't allow an argument\n",argv[0], pfound->name);
272     }
273     else
274     {
275     fprintf(stderr, "%s: option '%c%s' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name);
276     }
277     }
278     d->__nextchar += strlen(d->__nextchar);
279     d->optopt = pfound->val;
280     return '?';
281     }
282     }
283     else if (pfound->has_arg == 1)
284     {
285     if (d->optind < argc)
286     d->optarg = argv[d->optind++];
287     else
288     {
289     if (print_errors)
290     {
291     fprintf(stderr,"%s: option '--%s' requires an argument\n",argv[0], pfound->name);
292     }
293     d->__nextchar += strlen(d->__nextchar);
294     d->optopt = pfound->val;
295     return optstring[0] == ':' ? ':' : '?';
296     }
297     }
298     d->__nextchar += strlen(d->__nextchar);
299     if (longind != NULL)
300     *longind = option_index;
301     if (pfound->flag)
302     {
303     *(pfound->flag) = pfound->val;
304     return 0;
305     }
306     return pfound->val;
307     }
308     if (!long_only || argv[d->optind][1] == '-' || strchr(optstring, *d->__nextchar) == NULL)
309     {
310     if (print_errors)
311     {
312     if (argv[d->optind][1] == '-')
313     {
314     fprintf(stderr, "%s: unrecognized option '--%s'\n",argv[0], d->__nextchar);
315     }
316     else
317     {
318     fprintf(stderr, "%s: unrecognized option '%c%s'\n",argv[0], argv[d->optind][0], d->__nextchar);
319     }
320     }
321     d->__nextchar = (char *)"";
322     d->optind++;
323     d->optopt = 0;
324     return '?';
325     }
326     }
327     {
328     char c = *d->__nextchar++;
329     char *temp = (char*)strchr(optstring, c);
330     if (*d->__nextchar == '\0')
331     ++d->optind;
332     if (temp == NULL || c == ':' || c == ';')
333     {
334     if (print_errors)
335     {
336     fprintf(stderr, "%s: invalid option -- '%c'\n", argv[0], c);
337     }
338     d->optopt = c;
339     return '?';
340     }
341     if (temp[0] == 'W' && temp[1] == ';')
342     {
343     char *nameend;
344     const struct option_a *p;
345     const struct option_a *pfound = NULL;
346     int exact = 0;
347     int ambig = 0;
348     int indfound = 0;
349     int option_index;
350     if (longopts == NULL)
351     goto no_longs;
352     if (*d->__nextchar != '\0')
353     {
354     d->optarg = d->__nextchar;
355     d->optind++;
356     }
357     else if (d->optind == argc)
358     {
359     if (print_errors)
360     {
361     fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c);
362     }
363     d->optopt = c;
364     if (optstring[0] == ':')
365     c = ':';
366     else
367     c = '?';
368     return c;
369     }
370     else
371     d->optarg = argv[d->optind++];
372     for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; nameend++);
373     for (p = longopts, option_index = 0; p->name; p++, option_index++)
374     if (!strncmp(p->name, d->__nextchar, nameend - d->__nextchar))
375     {
376     if ((unsigned int) (nameend - d->__nextchar) == strlen(p->name))
377     {
378     pfound = p;
379     indfound = option_index;
380     exact = 1;
381     break;
382     }
383     else if (pfound == NULL)
384     {
385     pfound = p;
386     indfound = option_index;
387     }
388     else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
389     ambig = 1;
390     }
391     if (ambig && !exact)
392     {
393     if (print_errors)
394     {
395     fprintf(stderr, "%s: option '-W %s' is ambiguous\n",argv[0], d->optarg);
396     }
397     d->__nextchar += strlen(d->__nextchar);
398     d->optind++;
399     return '?';
400     }
401     if (pfound != NULL)
402     {
403     option_index = indfound;
404     if (*nameend)
405     {
406     if (pfound->has_arg)
407     d->optarg = nameend + 1;
408     else
409     {
410     if (print_errors)
411     {
412     fprintf(stderr, "%s: option '-W %s' doesn't allow an argument\n",argv[0], pfound->name);
413     }
414     d->__nextchar += strlen(d->__nextchar);
415     return '?';
416     }
417     }
418     else if (pfound->has_arg == 1)
419     {
420     if (d->optind < argc)
421     d->optarg = argv[d->optind++];
422     else
423     {
424     if (print_errors)
425     {
426     fprintf(stderr, "%s: option '-W %s' requires an argument\n",argv[0], pfound->name);
427     }
428     d->__nextchar += strlen(d->__nextchar);
429     return optstring[0] == ':' ? ':' : '?';
430     }
431     }
432     else
433     d->optarg = NULL;
434     d->__nextchar += strlen(d->__nextchar);
435     if (longind != NULL)
436     *longind = option_index;
437     if (pfound->flag)
438     {
439     *(pfound->flag) = pfound->val;
440     return 0;
441     }
442     return pfound->val;
443     }
444     no_longs:
445     d->__nextchar = NULL;
446     return 'W';
447     }
448     if (temp[1] == ':')
449     {
450     if (temp[2] == ':')
451     {
452     if (*d->__nextchar != '\0')
453     {
454     d->optarg = d->__nextchar;
455     d->optind++;
456     }
457     else
458     d->optarg = NULL;
459     d->__nextchar = NULL;
460     }
461     else
462     {
463     if (*d->__nextchar != '\0')
464     {
465     d->optarg = d->__nextchar;
466     d->optind++;
467     }
468     else if (d->optind == argc)
469     {
470     if (print_errors)
471     {
472     fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c);
473     }
474     d->optopt = c;
475     if (optstring[0] == ':')
476     c = ':';
477     else
478     c = '?';
479     }
480     else
481     d->optarg = argv[d->optind++];
482     d->__nextchar = NULL;
483     }
484     }
485     return c;
486     }
487 gezelter 1795 }
488 gezelter 1943 int _getopt_internal_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, int posixly_correct)
489 gezelter 1795 {
490 gezelter 1943 int result;
491     getopt_data_a.optind = optind;
492     getopt_data_a.opterr = opterr;
493     result = _getopt_internal_r_a (argc, argv, optstring, longopts,longind, long_only, &getopt_data_a,posixly_correct);
494     optind = getopt_data_a.optind;
495     optarg_a = getopt_data_a.optarg;
496     optopt = getopt_data_a.optopt;
497     return result;
498 gezelter 1795 }
499 gezelter 1943 int getopt_a (int argc, char *const *argv, const char *optstring) _GETOPT_THROW
500 gezelter 1795 {
501 gezelter 1943 return _getopt_internal_a (argc, argv, optstring, (const struct option_a *) 0, (int *) 0, 0, 0);
502 gezelter 1795 }
503 gezelter 1943 int getopt_long_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW
504 gezelter 1795 {
505 gezelter 1943 return _getopt_internal_a (argc, argv, options, long_options, opt_index, 0, 0);
506 gezelter 1795 }
507 gezelter 1943 int getopt_long_only_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW
508 gezelter 1795 {
509 gezelter 1943 return _getopt_internal_a (argc, argv, options, long_options, opt_index, 1, 0);
510 gezelter 1795 }
511 gezelter 1943 int _getopt_long_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d)
512 gezelter 1795 {
513 gezelter 1943 return _getopt_internal_r_a (argc, argv, options, long_options, opt_index,0, d, 0);
514 gezelter 1795 }
515 gezelter 1943 int _getopt_long_only_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d)
516 gezelter 1795 {
517 gezelter 1943 return _getopt_internal_r_a (argc, argv, options, long_options, opt_index, 1, d, 0);
518 gezelter 1795 }
519    
520 gezelter 1943 //
521     //
522     // Unicode Structures and Functions
523     //
524     //
525    
526     static struct _getopt_data_w
527 gezelter 1795 {
528 gezelter 1943 int optind;
529     int opterr;
530     int optopt;
531     wchar_t *optarg;
532     int __initialized;
533     wchar_t *__nextchar;
534     enum ENUM_ORDERING __ordering;
535     int __posixly_correct;
536     int __first_nonopt;
537     int __last_nonopt;
538     } getopt_data_w;
539     wchar_t *optarg_w;
540 gezelter 1795
541 gezelter 1943 static void exchange_w(wchar_t **argv, struct _getopt_data_w *d)
542 gezelter 1795 {
543 gezelter 1943 int bottom = d->__first_nonopt;
544     int middle = d->__last_nonopt;
545     int top = d->optind;
546     wchar_t *tem;
547     while (top > middle && middle > bottom)
548     {
549     if (top - middle > middle - bottom)
550     {
551     int len = middle - bottom;
552     register int i;
553     for (i = 0; i < len; i++)
554     {
555     tem = argv[bottom + i];
556     argv[bottom + i] = argv[top - (middle - bottom) + i];
557     argv[top - (middle - bottom) + i] = tem;
558     }
559     top -= len;
560     }
561     else
562     {
563     int len = top - middle;
564     register int i;
565     for (i = 0; i < len; i++)
566     {
567     tem = argv[bottom + i];
568     argv[bottom + i] = argv[middle + i];
569     argv[middle + i] = tem;
570     }
571     bottom += len;
572     }
573     }
574     d->__first_nonopt += (d->optind - d->__last_nonopt);
575     d->__last_nonopt = d->optind;
576 gezelter 1795 }
577 gezelter 1943 static const wchar_t *_getopt_initialize_w (const wchar_t *optstring, struct _getopt_data_w *d, int posixly_correct)
578 gezelter 1795 {
579 gezelter 1943 d->__first_nonopt = d->__last_nonopt = d->optind;
580     d->__nextchar = NULL;
581     d->__posixly_correct = posixly_correct | !!_wgetenv(L"POSIXLY_CORRECT");
582     if (optstring[0] == L'-')
583     {
584     d->__ordering = RETURN_IN_ORDER;
585     ++optstring;
586     }
587     else if (optstring[0] == L'+')
588     {
589     d->__ordering = REQUIRE_ORDER;
590     ++optstring;
591     }
592     else if (d->__posixly_correct)
593     d->__ordering = REQUIRE_ORDER;
594     else
595     d->__ordering = PERMUTE;
596     return optstring;
597 gezelter 1795 }
598 gezelter 1943 int _getopt_internal_r_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, struct _getopt_data_w *d, int posixly_correct)
599 gezelter 1795 {
600 gezelter 1943 int print_errors = d->opterr;
601     if (argc < 1)
602     return -1;
603     d->optarg = NULL;
604     if (d->optind == 0 || !d->__initialized)
605     {
606     if (d->optind == 0)
607     d->optind = 1;
608     optstring = _getopt_initialize_w (optstring, d, posixly_correct);
609     d->__initialized = 1;
610     }
611     else if (optstring[0] == L'-' || optstring[0] == L'+')
612     optstring++;
613     if (optstring[0] == L':')
614     print_errors = 0;
615     if (d->__nextchar == NULL || *d->__nextchar == L'\0')
616     {
617     if (d->__last_nonopt > d->optind)
618     d->__last_nonopt = d->optind;
619     if (d->__first_nonopt > d->optind)
620     d->__first_nonopt = d->optind;
621     if (d->__ordering == PERMUTE)
622     {
623     if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
624     exchange_w((wchar_t **) argv, d);
625     else if (d->__last_nonopt != d->optind)
626     d->__first_nonopt = d->optind;
627     while (d->optind < argc && (argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0'))
628     d->optind++;
629     d->__last_nonopt = d->optind;
630     }
631     if (d->optind != argc && !wcscmp(argv[d->optind], L"--"))
632     {
633     d->optind++;
634     if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
635     exchange_w((wchar_t **) argv, d);
636     else if (d->__first_nonopt == d->__last_nonopt)
637     d->__first_nonopt = d->optind;
638     d->__last_nonopt = argc;
639     d->optind = argc;
640     }
641     if (d->optind == argc)
642     {
643     if (d->__first_nonopt != d->__last_nonopt)
644     d->optind = d->__first_nonopt;
645     return -1;
646     }
647     if ((argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0'))
648     {
649     if (d->__ordering == REQUIRE_ORDER)
650     return -1;
651     d->optarg = argv[d->optind++];
652     return 1;
653     }
654     d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == L'-'));
655     }
656     if (longopts != NULL && (argv[d->optind][1] == L'-' || (long_only && (argv[d->optind][2] || !wcschr(optstring, argv[d->optind][1])))))
657     {
658     wchar_t *nameend;
659     unsigned int namelen;
660     const struct option_w *p;
661     const struct option_w *pfound = NULL;
662     struct option_list
663     {
664     const struct option_w *p;
665     struct option_list *next;
666     } *ambig_list = NULL;
667     int exact = 0;
668     int indfound = -1;
669     int option_index;
670     for (nameend = d->__nextchar; *nameend && *nameend != L'='; nameend++);
671     namelen = (unsigned int)(nameend - d->__nextchar);
672     for (p = longopts, option_index = 0; p->name; p++, option_index++)
673     if (!wcsncmp(p->name, d->__nextchar, namelen))
674     {
675     if (namelen == (unsigned int)wcslen(p->name))
676     {
677     pfound = p;
678     indfound = option_index;
679     exact = 1;
680     break;
681     }
682     else if (pfound == NULL)
683     {
684     pfound = p;
685     indfound = option_index;
686     }
687     else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
688     {
689     struct option_list *newp = (struct option_list*)alloca(sizeof(*newp));
690     newp->p = p;
691     newp->next = ambig_list;
692     ambig_list = newp;
693     }
694     }
695     if (ambig_list != NULL && !exact)
696     {
697     if (print_errors)
698     {
699     struct option_list first;
700     first.p = pfound;
701     first.next = ambig_list;
702     ambig_list = &first;
703     fwprintf(stderr, L"%s: option '%s' is ambiguous; possibilities:", argv[0], argv[d->optind]);
704     do
705     {
706     fwprintf (stderr, L" '--%s'", ambig_list->p->name);
707     ambig_list = ambig_list->next;
708     }
709     while (ambig_list != NULL);
710     fputwc (L'\n', stderr);
711     }
712     d->__nextchar += wcslen(d->__nextchar);
713     d->optind++;
714     d->optopt = 0;
715     return L'?';
716     }
717     if (pfound != NULL)
718     {
719     option_index = indfound;
720     d->optind++;
721     if (*nameend)
722     {
723     if (pfound->has_arg)
724     d->optarg = nameend + 1;
725     else
726     {
727     if (print_errors)
728     {
729     if (argv[d->optind - 1][1] == L'-')
730     {
731     fwprintf(stderr, L"%s: option '--%s' doesn't allow an argument\n",argv[0], pfound->name);
732     }
733     else
734     {
735     fwprintf(stderr, L"%s: option '%c%s' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name);
736     }
737     }
738     d->__nextchar += wcslen(d->__nextchar);
739     d->optopt = pfound->val;
740     return L'?';
741     }
742     }
743     else if (pfound->has_arg == 1)
744     {
745     if (d->optind < argc)
746     d->optarg = argv[d->optind++];
747     else
748     {
749     if (print_errors)
750     {
751     fwprintf(stderr,L"%s: option '--%s' requires an argument\n",argv[0], pfound->name);
752     }
753     d->__nextchar += wcslen(d->__nextchar);
754     d->optopt = pfound->val;
755     return optstring[0] == L':' ? L':' : L'?';
756     }
757     }
758     d->__nextchar += wcslen(d->__nextchar);
759     if (longind != NULL)
760     *longind = option_index;
761     if (pfound->flag)
762     {
763     *(pfound->flag) = pfound->val;
764     return 0;
765     }
766     return pfound->val;
767     }
768     if (!long_only || argv[d->optind][1] == L'-' || wcschr(optstring, *d->__nextchar) == NULL)
769     {
770     if (print_errors)
771     {
772     if (argv[d->optind][1] == L'-')
773     {
774     fwprintf(stderr, L"%s: unrecognized option '--%s'\n",argv[0], d->__nextchar);
775     }
776     else
777     {
778     fwprintf(stderr, L"%s: unrecognized option '%c%s'\n",argv[0], argv[d->optind][0], d->__nextchar);
779     }
780     }
781     d->__nextchar = (wchar_t *)L"";
782     d->optind++;
783     d->optopt = 0;
784     return L'?';
785     }
786     }
787     {
788     wchar_t c = *d->__nextchar++;
789     wchar_t *temp = (wchar_t*)wcschr(optstring, c);
790     if (*d->__nextchar == L'\0')
791     ++d->optind;
792     if (temp == NULL || c == L':' || c == L';')
793     {
794     if (print_errors)
795     {
796     fwprintf(stderr, L"%s: invalid option -- '%c'\n", argv[0], c);
797     }
798     d->optopt = c;
799     return L'?';
800     }
801     if (temp[0] == L'W' && temp[1] == L';')
802     {
803     wchar_t *nameend;
804     const struct option_w *p;
805     const struct option_w *pfound = NULL;
806     int exact = 0;
807     int ambig = 0;
808     int indfound = 0;
809     int option_index;
810     if (longopts == NULL)
811     goto no_longs;
812     if (*d->__nextchar != L'\0')
813     {
814     d->optarg = d->__nextchar;
815     d->optind++;
816     }
817     else if (d->optind == argc)
818     {
819     if (print_errors)
820     {
821     fwprintf(stderr,L"%s: option requires an argument -- '%c'\n",argv[0], c);
822     }
823     d->optopt = c;
824     if (optstring[0] == L':')
825     c = L':';
826     else
827     c = L'?';
828     return c;
829     }
830     else
831     d->optarg = argv[d->optind++];
832     for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != L'='; nameend++);
833     for (p = longopts, option_index = 0; p->name; p++, option_index++)
834     if (!wcsncmp(p->name, d->__nextchar, nameend - d->__nextchar))
835     {
836     if ((unsigned int) (nameend - d->__nextchar) == wcslen(p->name))
837     {
838     pfound = p;
839     indfound = option_index;
840     exact = 1;
841     break;
842     }
843     else if (pfound == NULL)
844     {
845     pfound = p;
846     indfound = option_index;
847     }
848     else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
849     ambig = 1;
850     }
851     if (ambig && !exact)
852     {
853     if (print_errors)
854     {
855     fwprintf(stderr, L"%s: option '-W %s' is ambiguous\n",argv[0], d->optarg);
856     }
857     d->__nextchar += wcslen(d->__nextchar);
858     d->optind++;
859     return L'?';
860     }
861     if (pfound != NULL)
862     {
863     option_index = indfound;
864     if (*nameend)
865     {
866     if (pfound->has_arg)
867     d->optarg = nameend + 1;
868     else
869     {
870     if (print_errors)
871     {
872     fwprintf(stderr, L"%s: option '-W %s' doesn't allow an argument\n",argv[0], pfound->name);
873     }
874     d->__nextchar += wcslen(d->__nextchar);
875     return L'?';
876     }
877     }
878     else if (pfound->has_arg == 1)
879     {
880     if (d->optind < argc)
881     d->optarg = argv[d->optind++];
882     else
883     {
884     if (print_errors)
885     {
886     fwprintf(stderr, L"%s: option '-W %s' requires an argument\n",argv[0], pfound->name);
887     }
888     d->__nextchar += wcslen(d->__nextchar);
889     return optstring[0] == L':' ? L':' : L'?';
890     }
891     }
892     else
893     d->optarg = NULL;
894     d->__nextchar += wcslen(d->__nextchar);
895     if (longind != NULL)
896     *longind = option_index;
897     if (pfound->flag)
898     {
899     *(pfound->flag) = pfound->val;
900     return 0;
901     }
902     return pfound->val;
903     }
904     no_longs:
905     d->__nextchar = NULL;
906     return L'W';
907     }
908     if (temp[1] == L':')
909     {
910     if (temp[2] == L':')
911     {
912     if (*d->__nextchar != L'\0')
913     {
914     d->optarg = d->__nextchar;
915     d->optind++;
916     }
917     else
918     d->optarg = NULL;
919     d->__nextchar = NULL;
920     }
921     else
922     {
923     if (*d->__nextchar != L'\0')
924     {
925     d->optarg = d->__nextchar;
926     d->optind++;
927     }
928     else if (d->optind == argc)
929     {
930     if (print_errors)
931     {
932     fwprintf(stderr,L"%s: option requires an argument -- '%c'\n",argv[0], c);
933     }
934     d->optopt = c;
935     if (optstring[0] == L':')
936     c = L':';
937     else
938     c = L'?';
939     }
940     else
941     d->optarg = argv[d->optind++];
942     d->__nextchar = NULL;
943     }
944     }
945     return c;
946     }
947 gezelter 1795 }
948 gezelter 1943 int _getopt_internal_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, int posixly_correct)
949 gezelter 1795 {
950 gezelter 1943 int result;
951     getopt_data_w.optind = optind;
952     getopt_data_w.opterr = opterr;
953     result = _getopt_internal_r_w (argc, argv, optstring, longopts,longind, long_only, &getopt_data_w,posixly_correct);
954     optind = getopt_data_w.optind;
955     optarg_w = getopt_data_w.optarg;
956     optopt = getopt_data_w.optopt;
957     return result;
958 gezelter 1795 }
959 gezelter 1943 int getopt_w (int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW
960     {
961     return _getopt_internal_w (argc, argv, optstring, (const struct option_w *) 0, (int *) 0, 0, 0);
962     }
963     int getopt_long_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW
964     {
965     return _getopt_internal_w (argc, argv, options, long_options, opt_index, 0, 0);
966     }
967 gezelter 1795 int getopt_long_only_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW
968     {
969 gezelter 1943 return _getopt_internal_w (argc, argv, options, long_options, opt_index, 1, 0);
970 gezelter 1795 }
971 gezelter 1943 int _getopt_long_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d)
972 gezelter 1795 {
973 gezelter 1943 return _getopt_internal_r_w (argc, argv, options, long_options, opt_index,0, d, 0);
974 gezelter 1795 }
975     int _getopt_long_only_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d)
976     {
977 gezelter 1943 return _getopt_internal_r_w (argc, argv, options, long_options, opt_index, 1, d, 0);
978 gezelter 1795 }

Properties

Name Value
svn:eol-style native