1 /**
2  * \file   l4util/lib/src/getopt2.c
3  * \brief  initialize argc/argv from multiboot structure
4  *
5  * \author Frank Mehnert <fm3@os.inf.tu-dresden.de> */
6 
7 /*
8  * (c) 2003-2009 Author(s)
9  *     economic rights: Technische Universität Dresden (Germany)
10  * This file is part of TUD:OS and distributed under the terms of the
11  * GNU Lesser General Public License 2.1.
12  * Please see the COPYING-LGPL-2.1 file for details.
13  */
14 
15 #include <string.h>
16 #include <stdio.h>
17 
18 //#include <l4/util/mbi_argv.h>
19 //#include <l4/crtn/crt0.h>
20 
21 #define MAXARGC 50
22 #define MAXENVC 50
23 
24 char *l4util_argv[MAXARGC];
25 int  l4util_argc = 0;
26 
27 #define isspace(c) ((c)==' '||(c)=='\t'||(c)=='\r'||(c)=='\n')
28 
29 void __l4util_parse_args(char *argbuf);
__l4util_parse_args(char * argbuf)30 void __l4util_parse_args(char *argbuf)
31 {
32   char *cp;
33   char quote = 0;
34 
35   /* make l4util_argc, l4util_argv */
36   l4util_argc = 0;
37   cp = argbuf;
38 
39   /* Note, there's no support for escaping quotes! */
40 
41   while (*cp && l4util_argc < MAXARGC-1)
42     {
43       /* Skip whitespace */
44       while (*cp && isspace(*cp))
45 	cp++;
46 
47       /* New elem? */
48       if (*cp)
49 	{
50 	  /* Start of a quote? */
51 	  if (*cp == '"' || *cp == '\'')
52 	    {
53 	      quote = *cp;
54 	      cp++;
55 	    }
56 
57 	  l4util_argv[l4util_argc++] = cp;
58 
59 	  /* Forward to next whitespace / quote character */
60 	  while (*cp && ((!quote && !isspace(*cp)) || (quote && *cp != quote)))
61 	    cp++;
62 
63 	  /* Terminate array elem */
64 	  if (*cp)
65 	    *cp++ = '\0';
66 
67 	  quote = 0;
68 	}
69     }
70 
71   if(*cp && l4util_argc == MAXARGC-1)
72     printf("WARNING: parse_args() truncated at %dth argument!\n", MAXARGC);
73 
74   l4util_argv[l4util_argc] = (void*) 0;
75 }
76 
77 #if 0
78 static void
79 arg_init(char* cmdline)
80 {
81   if (cmdline)
82     {
83       l4util_parse_args(cmdline);
84     }
85 }
86 
87 void
88 l4util_mbi_to_argv(l4_mword_t flag, l4util_mb_info_t *mbi)
89 {
90   if (flag == L4UTIL_MB_VALID
91       && mbi && (mbi->flags & L4UTIL_MB_CMDLINE))
92     arg_init((char*)(l4_addr_t)mbi->cmdline);
93 }
94 #endif
95