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 */
27 extern int args_callback_option(char*,char*);
28 extern int args_callback_longoption(char*,char*);
29 extern int args_callback_command(char*,char*);
30 extern void args_callback_usage(char*name
);
35 static void processargs(int argn2
,char**argv2
)
40 args_callback_usage(argv2
[0]);
46 if(t
<argn2
-1) next
=argv2
[t
+1];
49 if(argv2
[t
][0]=='-' && argv2
[t
][1])
53 if(!strcmp(&argv2
[t
][2],"help"))
55 args_callback_usage(argv2
[0]);
58 t
+=args_callback_longoption(&argv2
[t
][2],next
);
62 if(strchr("?h",argv2
[t
][1]))
64 args_callback_usage(argv2
[0]);
67 if(argv2
[t
][1]) // this might be something like e.g. -xvf
76 ret
= args_callback_option(buf
,&argv2
[t
][s
+1]);
79 t
+= args_callback_option(&argv2
[t
][s
], next
);
89 int num
= args_callback_command(argv2
[t
],next
);
91 fprintf(stderr
, "internal error in command line parsing\n");
101 const char*shortoption
;
102 const char*longoption
;
105 static int args_long2shortoption(struct options_t
*options
, char*name
, char*val
)
107 char*equal
= strchr(name
,'=');
112 while(options
->shortoption
) {
113 if(!strcmp(options
->longoption
, name
)) {
114 char*tmp
= (char*)malloc(strlen(options
->shortoption
)
115 +(equal
?strlen(equal
)+2:2));
116 strcpy(tmp
, options
->shortoption
);
118 //strcpy(&tmp[strlen(tmp)], equal);
119 int ret
= args_callback_option(tmp
, equal
);
121 fprintf(stderr
, "Warning: Option --%s takes no parameter.\n", name
);
125 return args_callback_option(tmp
,val
);
129 fprintf(stderr
, "Unknown option: --%s\n", name
);
135 /* check whether the value t is in a given range.
136 examples: 3 is in range 1-10: true
137 7 is in range 2-4,6,8-10: false
138 9 is in range 1,2,3-12: true
140 static char is_in_range(int t
, char*irange
)
149 if(!irange
) // no range resembles (-OO,OO)
154 while(*pos
== ' ' || *pos
== '\r' || *pos
== '\n' || *pos
== '\t')
158 while(*digits
>='0' && *digits
<='9')
161 fprintf(stderr
, "Error: \"%s\" is not a valid format (digit expected)\n",irange
);
165 tmp
=*digits
;*digits
=0;
170 while(*pos
== ' ' || *pos
== '\r' || *pos
== '\n' || *pos
== '\t')
173 if(range
&& last
<=t
&& num
>=t
)
185 fprintf(stderr
, "Error: \"%s\" is not a valid format (too many '-'s)\n",irange
);
196 /* if it isn't a '-', we assume it is a seperator like
197 ',', ';', ':', whatever. */
210 static char* filename2template(char*filename
, int*startindex
)
212 int l
= strlen(filename
);
213 char*newname
= (char*)malloc(l
+5);
214 /* first look whether the file is already numbered */
217 if(l
<0 || strchr("0123456789", filename
[l
]))
223 while(firstdigit
&& strchr("0123456789", filename
[firstdigit
-1]))
225 *startindex
= atoi(filename
+firstdigit
);
226 memcpy(newname
, filename
, firstdigit
);
227 sprintf(newname
+firstdigit
, "%%%dd", lastdigit
+1-firstdigit
);
228 strcat(newname
+firstdigit
, filename
+lastdigit
+1);
231 /* if it isn't, try to paste a %d between filename and extension */
232 char*dot
= strrchr(filename
, '.');
234 int pos
= dot
-filename
;
235 memcpy(newname
, filename
, pos
);
236 newname
[pos
++] = '.';
237 newname
[pos
++] = '%';
238 newname
[pos
++] = 'd';
239 strcpy(newname
+pos
, dot
);
243 /* if that didn't work either, just append the number at the end */
244 strcpy(newname
, filename
);
245 strcat(newname
, ".%d");