[trunk] Start FolderReorgProposal task
[openjpeg.git] / src / bin / common / opj_getopt.c
1 /*
2  * Copyright (c) 1987, 1993, 1994
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 /* last review : october 29th, 2002 */
35
36 #if defined(LIBC_SCCS) && !defined(lint)
37 static char sccsid[] = "@(#)opj_getopt.c        8.3 (Berkeley) 4/27/95";
38 #endif                          /* LIBC_SCCS and not lint */
39
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43 #include "opj_getopt.h"
44
45 int opj_opterr = 1,                     /* if error message should be printed */
46  opj_optind = 1,                        /* index into parent argv vector */
47  opj_optopt,                    /* character checked for validity */
48  opj_optreset;                  /* reset getopt */
49  char *opj_optarg;                      /* argument associated with option */
50
51 #define BADCH   (int)'?'
52 #define BADARG  (int)':'
53 static char EMSG[]={""};
54
55 /* As this class remembers its values from one Java call to the other, reset the values before each use */
56 void reset_options_reading(void) {
57         opj_opterr = 1;
58         opj_optind = 1;
59 }
60
61 /*
62  * getopt --
63  *      Parse argc/argv argument vector.
64  */
65 int opj_getopt(int nargc, char *const *nargv, const char *ostr) {
66 #  define __progname nargv[0]
67   static char *place = EMSG;    /* option letter processing */
68   char *oli = NULL;                     /* option letter list index */
69
70   if (opj_optreset || !*place) {        /* update scanning pointer */
71     opj_optreset = 0;
72     if (opj_optind >= nargc || *(place = nargv[opj_optind]) != '-') {
73       place = EMSG;
74       return (-1);
75     }
76     if (place[1] && *++place == '-') {  /* found "--" */
77       ++opj_optind;
78       place = EMSG;
79       return (-1);
80     }
81   }                             /* option letter okay? */
82   if ((opj_optopt = (int) *place++) == (int) ':' ||
83       !(oli = strchr(ostr, opj_optopt))) {
84     /*
85      * if the user didn't specify '-' as an option,
86      * assume it means -1.
87      */
88     if (opj_optopt == (int) '-')
89       return (-1);
90     if (!*place)
91       ++opj_optind;
92                 if (opj_opterr && *ostr != ':') {
93       fprintf(stderr,
94                      "%s: illegal option -- %c\n", __progname, opj_optopt);
95                         return (BADCH);
96                 }
97   }
98   if (*++oli != ':') {          /* don't need argument */
99     opj_optarg = NULL;
100     if (!*place)
101       ++opj_optind;
102   } else {                      /* need an argument */
103     if (*place)                 /* no white space */
104       opj_optarg = place;
105     else if (nargc <= ++opj_optind) {   /* no arg */
106       place = EMSG;
107       if (*ostr == ':')
108         return (BADARG);
109                         if (opj_opterr) {
110                                 fprintf(stderr,
111                        "%s: option requires an argument -- %c\n",
112                        __progname, opj_optopt);
113                                 return (BADCH);
114                         }
115     } else                      /* white space */
116       opj_optarg = nargv[opj_optind];
117     place = EMSG;
118     ++opj_optind;
119   }
120   return (opj_optopt);          /* dump back option letter */
121 }
122
123
124 int opj_getopt_long(int argc, char * const argv[], const char *optstring,
125 const opj_option_t *longopts, int totlen) {
126         static int lastidx,lastofs;
127         char *tmp;
128         int i,len;
129         char param = 1;
130
131 again:
132         if (opj_optind >= argc || !argv[opj_optind] || *argv[opj_optind]!='-')
133                 return -1;
134
135         if (argv[opj_optind][0]=='-' && argv[opj_optind][1]==0) {
136                 if(opj_optind >= (argc - 1)){ /* no more input parameters */
137                         param = 0;
138                 }
139                 else{ /* more input parameters */
140                         if(argv[opj_optind + 1][0] == '-'){
141                                 param = 0; /* Missing parameter after '-' */
142                         }
143                         else{
144                                 param = 2;
145                         }
146                 }
147         }
148
149         if (param == 0) {
150                 ++opj_optind;
151                 return (BADCH);
152         }
153
154         if (argv[opj_optind][0]=='-') { /* long option */
155                 char* arg=argv[opj_optind]+1;
156                 const opj_option_t* o;
157                 o=longopts;
158                 len=sizeof(longopts[0]);
159
160                 if (param > 1){
161                         arg = argv[opj_optind+1];
162                         opj_optind++;
163                 }
164                 else
165                         arg = argv[opj_optind]+1;
166
167                 if(strlen(arg)>1){
168                         for (i=0;i<totlen;i=i+len,o++) {
169                                 if (!strcmp(o->name,arg)) {     /* match */
170                                         if (o->has_arg == 0) {
171                                                 if ((argv[opj_optind+1])&&(!(argv[opj_optind+1][0]=='-'))){
172                                                         fprintf(stderr,"%s: option does not require an argument. Ignoring %s\n",arg,argv[opj_optind+1]);
173                                                         ++opj_optind;
174                                                 }
175                                         }else{ 
176                                                 opj_optarg=argv[opj_optind+1];
177                                                 if(opj_optarg){
178                                                         if (opj_optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */                                                            
179                                                                 if (opj_opterr) {
180                                                                         fprintf(stderr,"%s: option requires an argument\n",arg);
181                                                                         return (BADCH);
182                                                                 }
183                                                         }
184                                                 }
185                                                 if (!opj_optarg && o->has_arg==1) {     /* no argument there */
186                                                         if (opj_opterr) {
187                                                                 fprintf(stderr,"%s: option requires an argument \n",arg);
188                                                                 return (BADCH);
189                                                         }
190                                                 }
191                                                 ++opj_optind;
192                                         }
193                                         ++opj_optind;
194                                         if (o->flag)
195                                                 *(o->flag)=o->val;
196                                         else
197                                                 return o->val;
198                                         return 0;
199                                 }
200                         }/*(end for)String not found in the list*/
201                         fprintf(stderr,"Invalid option %s\n",arg);
202                         ++opj_optind;
203                         return (BADCH);
204                 }else{ /*Single character input parameter*/
205                         if (*optstring==':') return ':';
206                         if (lastidx!=opj_optind) {
207                                 lastidx=opj_optind; lastofs=0;
208                         }
209                         opj_optopt=argv[opj_optind][lastofs+1];
210                         if ((tmp=strchr(optstring,opj_optopt))) {/*Found input parameter in list*/
211                                 if (*tmp==0) {  /* apparently, we looked for \0, i.e. end of argument */
212                                         ++opj_optind;
213                                         goto again;
214                                 }
215                                 if (tmp[1]==':') {      /* argument expected */
216                                         if (tmp[2]==':' || argv[opj_optind][lastofs+2]) {       /* "-foo", return "oo" as opj_optarg */
217                                                 if (!*(opj_optarg=argv[opj_optind]+lastofs+2)) opj_optarg=0;
218                                                 goto found;
219                                         }
220                                         opj_optarg=argv[opj_optind+1];
221                                         if(opj_optarg){
222                                                 if (opj_optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */
223                                                         if (opj_opterr) {
224                                                                 fprintf(stderr,"%s: option requires an argument\n",arg);
225                                                                 return (BADCH);
226                                                         }
227                                                 }
228                                         }
229                                         if (!opj_optarg) {      /* missing argument */
230                                                 if (opj_opterr) {
231                                                         fprintf(stderr,"%s: option requires an argument\n",arg);
232                                                         return (BADCH);
233                                                 }
234                                         }
235                                         ++opj_optind;
236                                 }else {/*Argument not expected*/
237                                         ++lastofs;
238                                         return opj_optopt;
239                                 }
240 found:
241                                 ++opj_optind;
242                                 return opj_optopt;
243                         }       else {  /* not found */
244                                 fprintf(stderr,"Invalid option %s\n",arg);
245                                 ++opj_optind;
246                                 return (BADCH);
247                         }/*end of not found*/
248                 
249                 }/* end of single character*/
250         }/*end '-'*/
251         fprintf(stderr,"Invalid option\n");
252         ++opj_optind;
253         return (BADCH);;
254 }/*end function*/