01 U0 FreeArgs(I64 argc, U8 **argv)
02 {
03   I64 i;
04   for (i = 0; i < argc; i++)
05     {
06     Free(argv[i]);
07   }
08   if (argv)
09     {
10     Free(argv);
11   }
12 }
13 
14 U8 **ParseArgs(U8 *str, I64 *argc)
15 { // Return argc, argv from str.
16   Bool quoted = FALSE;
17   I64 _argc = 0;
18   U8 **_argv = NULL;
19   U8 **_tmp = CAlloc(sizeof(U64) * StrLen(str));
20   I64 i = 0;
21   I64 s = 0;
22   I64 len;
23   while (i < StrLen(str) + 1)
24     {
25     switch (str[i])
26       {
27       case 0:
28       case ' ':
29         if (!quoted)
30           {
31           len = (str + i)-(str + s - 1);
32           if (str[i - 1] == '"')
33             {
34             len--;
35           }
36           if (len - 1)
37             {
38             _tmp[_argc] = CAlloc(len+1);
39             MemCpy(_tmp[_argc], str + s, len-1);
40             _argc++;
41           }
42           s = i + 1;
43         }
44         break;
45       case '"':
46         quoted = !quoted;
47         if (quoted)
48           {
49           s = i + 1;
50         }
51         break;
52       default:
53         break;
54     }
55     i++;
56   }
57   *argc = _argc;
58   _argv = CAlloc(sizeof(U64) * _argc);
59   MemCpy(_argv, _tmp, sizeof(U64) * _argc);
60   Free(_tmp);
61   return _argv;
62 }