Small cleanup of extensions code
[AROS.git] / compiler / autoinit / commandline.c
blob385508f90d50b1dd0da24d6b7b9d184c0b3cee18
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
4 */
5 #include <dos/dos.h>
6 #include <exec/memory.h>
7 #include <proto/exec.h>
8 #include <proto/dos.h>
9 #include <aros/symbolsets.h>
10 #include <aros/autoinit.h>
12 #define DEBUG 0
13 #include <aros/debug.h>
15 int __nocommandline __attribute__((weak)) = 0;
17 extern void *WBenchMsg;
18 extern char *__argstr;
19 extern ULONG __argsize;
21 extern char **__argv;
22 extern int __argc;
24 static char *__args;
25 static int __argmax;
27 static void process_cmdline(int *argc, char *args, char *argv[]);
29 int __initcommandline(void)
31 char *ptr = NULL;
33 if (WBenchMsg)
34 return 1;
36 if (__argsize)
38 /* Copy args into buffer */
39 if (!(__args = AllocMem(__argsize+1, MEMF_ANY)))
40 return 0;
42 ptr = __args;
43 while ((*ptr++ = *__argstr++)) {}
45 /* Find out how many arguments we have */
46 process_cmdline(&__argmax, __args, NULL);
48 if (!(__argv = AllocMem (sizeof (char *) * (__argmax+1), MEMF_ANY | MEMF_CLEAR)) )
49 return 0;
51 D(bug("arg(%d)=\"%s\", argmax=%d\n", __argsize, __args, __argmax));
53 /* create argv */
54 process_cmdline(&__argc, __args, __argv);
56 else
58 __argmax = 1;
59 __argc = 1;
60 if (!(__argv = AllocMem (sizeof (char *)*2, MEMF_CLEAR | MEMF_ANY)))
61 return 0;
65 * get program name
67 __argv[0] = FindTask(NULL)->tc_Node.ln_Name;
69 if (!__argv[0])
70 return 0;
72 #if DEBUG /* Debug argument parsing */
74 kprintf("argc = %d\n", __argc);
76 int t;
77 for (t=0; t<__argc; t++)
78 kprintf("argv[%d] = \"%s\"\n", t, __argv[t]);
81 #endif
83 return 1;
86 static BOOL is_space(char c)
88 switch(c)
90 case ' ':
91 case '\n':
92 case '\t':
93 case '\v':
94 case '\f':
95 case '\r':
96 return TRUE;
97 default:
98 return FALSE;
102 static BOOL is_escape(char c)
104 if(c == '*')
105 return TRUE;
106 else
107 return FALSE;
110 static BOOL is_final_quote(char *ptr)
112 if(*ptr == '\"' && (ptr[1] == '\0' || is_space(ptr[1])))
113 return TRUE;
114 else
115 return FALSE;
118 static void process_cmdline(int *pargc, char *args, char *argv[])
120 char *ptr = args;
121 char *arg;
122 int argc = 1;
124 while(TRUE)
126 /* skip leading white spaces */
127 while(is_space(*ptr))
128 ptr++;
130 if(*ptr == '\0')
131 break;
133 argc++;
134 if(*ptr == '\"')
136 /* quoted parameter starts here */
137 ptr++;
139 /* store pointer to the parameter */
140 if(argv)
141 argv[argc-1] = ptr;
143 /* unescape quoted parameter */
144 arg = ptr;
145 while(!(*ptr == '\0' || is_final_quote(ptr)))
147 if(argv)
149 /* unescaping */
150 if(is_escape(*ptr))
152 ptr++;
153 switch(*ptr)
155 case 'e':
156 case 'E':
157 *arg++ = '\033';
158 break;
159 case 'N':
160 case 'n':
161 *arg++ = '\n';
162 break;
163 case '\0':
164 break;
165 default:
166 *arg++ = *ptr;
168 ptr++;
170 else
171 *arg++ = *ptr++;
173 else
175 /* don't touch anything, just skip escapes */
176 if(is_escape(*ptr))
178 ptr++;
179 if(*ptr != '\0')
180 ptr++;
182 else
183 ptr++;
186 /* skip final quote */
187 if(*ptr != '\0')
188 ptr++;
189 /* quoted parameter ends here */
190 if(argv)
191 *arg = '\0';
193 else
195 /* unquoted parameter starts here */
197 /* store pointer to the parameter */
198 if(argv)
199 argv[argc-1] = ptr;
201 /* no escaping, just find the end */
202 while(!(*ptr == '\0' || is_space(*ptr)))
203 ptr++;
205 /* stop processing if we reached the end of argument string */
206 if(*ptr == '\0')
207 break;
209 /* unquoted parameter ends here */
210 if(argv)
211 *ptr++ = '\0';
214 /* store the number of arguments */
215 *pargc = argc;
218 void __exitcommandline(void)
220 if (WBenchMsg != NULL)
221 return;
223 if (__argv)
224 FreeMem(__argv, sizeof (char *) * (__argmax+1));
226 if (__args)
227 FreeMem(__args, __argsize+1);
230 ADD2INIT(__initcommandline, 0);
231 ADD2EXIT(__exitcommandline, 0);