2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
6 #include <exec/memory.h>
7 #include <proto/exec.h>
9 #include <aros/symbolsets.h>
10 #include <aros/autoinit.h>
13 #include <aros/debug.h>
15 #include "autoinit_intern.h"
17 int __nocommandline
__attribute__((weak
)) = 0;
19 extern void *WBenchMsg
;
20 extern char *__argstr
;
21 extern ULONG __argsize
;
29 static void process_cmdline(int *argc
, char *args
, char *argv
[]);
31 int __initcommandline(void)
42 /* Copy args into buffer */
43 if (!(__args
= AllocMem(__argsize
+1, MEMF_ANY
)))
52 /* Find out how many arguments we have */
53 process_cmdline(&__argmax
, __args
, NULL
);
55 if (!(__argv
= AllocMem (sizeof (char *) * (__argmax
+1), MEMF_ANY
| MEMF_CLEAR
)) )
58 D(bug("arg(%d)=\"%s\", argmax=%d\n", __argsize
, __args
, __argmax
));
61 process_cmdline(&__argc
, __args
, __argv
);
67 if (!(__argv
= AllocMem (sizeof (char *)*2, MEMF_CLEAR
| MEMF_ANY
)))
74 __argv
[0] = __get_command_name();
76 #if DEBUG /* Debug argument parsing */
78 kprintf("argc = %d\n", __argc
);
81 for (t
=0; t
<__argc
; t
++)
82 kprintf("argv[%d] = \"%s\"\n", t
, __argv
[t
]);
90 static BOOL
is_space(char c
)
106 static BOOL
is_escape(char c
)
114 static BOOL
is_final_quote(char *ptr
)
116 if(*ptr
== '\"' && (ptr
[1] == '\0' || is_space(ptr
[1])))
122 static void process_cmdline(int *pargc
, char *args
, char *argv
[])
130 /* skip leading white spaces */
131 while(is_space(*ptr
))
140 /* quoted parameter starts here */
143 /* store pointer to the parameter */
147 /* unescape quoted parameter */
149 while(!(*ptr
== '\0' || is_final_quote(ptr
)))
179 /* don't touch anything, just skip escapes */
190 /* skip final quote */
193 /* quoted parameter ends here */
199 /* unquoted parameter starts here */
201 /* store pointer to the parameter */
205 /* no escaping, just find the end */
206 while(!(*ptr
== '\0' || is_space(*ptr
)))
209 /* stop processing if we reached the end of argument string */
213 /* unquoted parameter ends here */
218 /* store the number of arguments */
222 void __exitcommandline(void)
224 if (WBenchMsg
!= NULL
)
228 FreeMem(__argv
, sizeof (char *) * (__argmax
+1));
231 FreeMem(__args
, __argsize
+1);
234 ADD2INIT(__initcommandline
, 0);
235 ADD2EXIT(__exitcommandline
, 0);