xref: /kvm-unit-tests/lib/argv.c (revision 809ebcb3f0739a22c7377460f457788456044e93)
1 #include "libcflat.h"
2 #include "auxinfo.h"
3 
4 int __argc;
5 char *__argv[100];
6 char *__args;
7 
8 static char args_copy[1000];
9 static char *copy_ptr = args_copy;
10 
11 static bool isblank(char p)
12 {
13     return p == ' ' || p == '\t';
14 }
15 
16 static char *skip_blanks(char *p)
17 {
18     while (isblank(*p))
19         ++p;
20     return p;
21 }
22 
23 void __setup_args(void)
24 {
25     char *args = __args;
26     char **argv = __argv + __argc;
27 
28     while (*(args = skip_blanks(args)) != '\0') {
29         *argv++ = copy_ptr;
30         while (*args != '\0' && !isblank(*args))
31             *copy_ptr++ = *args++;
32         *copy_ptr++ = '\0';
33     }
34     __argc = argv - __argv;
35 }
36 
37 void setup_args(char *args)
38 {
39     if (!args)
40         return;
41 
42     __args = args;
43     __setup_args();
44 }
45 
46 void setup_args_progname(char *args)
47 {
48     __argv[0] = copy_ptr;
49     strcpy(__argv[0], auxinfo.progname);
50     copy_ptr += strlen(auxinfo.progname) + 1;
51     ++__argc;
52     if (args) {
53         __args = args;
54         __setup_args();
55     }
56 }
57