Brought up to date
[swftools.git] / lib / args.h
blobac8586c5ab7ab7dc96af31cd76c6590b2bd796e7
1 /* args.h
2 Routines to simplify argument handling
4 Part of the swftools package.
6 Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
22 #ifndef __args_h__
23 #define __args_h__
25 extern int args_callback_option(char*,char*);
26 extern int args_callback_longoption(char*,char*);
27 extern int args_callback_command(char*,char*);
28 extern void args_callback_usage(char*name);
30 //int argn;
31 //char**argv;
33 void processargs(int argn2,char**argv2)
35 int t;
36 if(argn2==1)
38 args_callback_usage(argv2[0]);
39 exit(1);
41 for(t=1;t<argn2;t++)
43 char*next;
44 if(t<argn2-1) next=argv2[t+1];
45 else next=0;
47 if(argv2[t][0]=='-')
49 if(argv2[t][1]=='-')
51 if(!strcmp(&argv2[t][2],"help"))
53 args_callback_usage(argv2[0]);
54 exit(1);
56 t+=args_callback_longoption(&argv2[t][2],next);
58 else
60 if(strchr("?h",argv2[t][1]))
62 args_callback_usage(argv2[0]);
63 exit(1);
65 if(argv2[t][1]) // this might be something like e.g. -xvf
67 char buf[2];
68 int s=1;
69 int ret;
70 buf[1]=0;
71 do{
72 if(argv2[t][s+1]) {
73 buf[0] = argv2[t][s];
74 ret = args_callback_option(buf,&argv2[t][s+1]);
76 else {
77 t+= args_callback_option(&argv2[t][s], next);
78 break;
80 s++;
81 } while(!ret);
83 else // - usually means "read stdout"
85 t+=args_callback_option(&argv2[t][1],next);
89 else
91 t+=args_callback_command(argv2[t],next);
96 struct options_t
98 char*shortoption;
99 char*longoption;
102 int args_long2shortoption(struct options_t*options, char*name, char*val)
104 char*equal = strchr(name,'=');
105 if (equal) {
106 *equal = 0;
107 equal++;
109 while(options->shortoption) {
110 if(!strcmp(options->longoption, name)) {
111 char*tmp = (char*)malloc(strlen(options->shortoption)
112 +(equal?strlen(equal)+2:2));
113 strcpy(tmp, options->shortoption);
114 if(equal) {
115 //strcpy(&tmp[strlen(tmp)], equal);
116 int ret = args_callback_option(tmp, equal);
117 if(!ret) {
118 fprintf(stderr, "Warning: Option --%s takes no parameter.\n", name);
120 return 0;
122 return args_callback_option(tmp,val);
124 options++;
126 fprintf(stderr, "Unknown option: --%s\n", name);
127 exit(1);
130 /* check whether the value t is in a given range.
131 examples: 3 is in range 1-10: true
132 7 is in range 2-4,6,8-10: false
133 9 is in range 1,2,3-12: true
135 char is_in_range(int t, char*irange)
137 char*pos = irange;
138 char*digits;
139 int num;
140 char range = 0;
141 int last=0;
142 char tmp;
144 if(!irange) // no range resembles (-OO,OO)
145 return 1;
147 while(*pos)
149 while(*pos == ' ' || *pos == '\r' || *pos == '\n' || *pos == '\t')
150 pos++;
152 digits = pos;
153 while(*digits>='0' && *digits<='9')
154 digits++;
155 if(digits == pos) {
156 fprintf(stderr, "Error: \"%s\" is not a valid format (digit expected)\n",irange);
157 exit(1);
160 tmp=*digits;*digits=0;
161 num = atoi(pos);
162 *digits=tmp;
163 pos = digits;
165 while(*pos == ' ' || *pos == '\r' || *pos == '\n' || *pos == '\t')
166 pos++;
168 if(range && last<=t && num>=t)
169 return 1;
170 if(range) {
171 range = 0;
172 if(*pos)
173 pos ++;
174 continue;
177 if(*pos=='-')
179 if(range) {
180 fprintf(stderr, "Error: \"%s\" is not a valid format (too many '-'s)\n",irange);
181 exit(1);
183 last = num;
184 range = 1;
185 if(*pos)
186 pos ++;
187 continue;
189 else
191 /* if it isn't a '-', we assume it is a seperator like
192 ',', ';', ':', whatever. */
193 if(t == num)
194 return 1;
195 if(*pos)
196 pos ++;
197 continue;
200 if(range && last<=t)
201 return 1;
202 return 0;
205 #endif //__args_h__