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 }