forked from KolibriOS/kolibrios
Rustem Gimadutdinov (rgimad)
68cf3e4293
- big refactoring, now uses libc.obj - added kfetch command git-svn-id: svn://kolibrios.org@8827 a494cfbc-eb01-0410-851d-a64ba20cac60
101 lines
2.7 KiB
C
101 lines
2.7 KiB
C
|
|
int parameters_prepare(char *param, char* argv[]) {
|
|
int i, param_len;
|
|
int argc = 1;
|
|
int quote = 0;
|
|
int argv_len;
|
|
|
|
param_len = strlen(param);
|
|
if ( param_len == 0 )
|
|
return 0;
|
|
|
|
argv[0] = (char*) malloc(4096);
|
|
|
|
argv_len = 0;
|
|
for (i = 0; i < param_len; i++) {
|
|
switch (param[i]) {
|
|
case '\\':
|
|
if (param[i+1]!='\0') {
|
|
switch(param[i+1]) {
|
|
|
|
case 'n':
|
|
argv[argc-1][argv_len] = '\n';
|
|
argv_len++;
|
|
i++;
|
|
break;
|
|
|
|
case 't':
|
|
argv[argc-1][argv_len] = '\t';
|
|
argv_len++;
|
|
i++;
|
|
|
|
case '\\':
|
|
case '\'':
|
|
case '"':
|
|
case '?':
|
|
argv[argc-1][argv_len] = param[i+1];
|
|
argv_len++;
|
|
i++;
|
|
break;
|
|
|
|
default:
|
|
i++;
|
|
};
|
|
}
|
|
break;
|
|
|
|
case '"':
|
|
if (quote == 0)
|
|
quote = 1;
|
|
else {
|
|
quote = 0;
|
|
argv[argc-1][argv_len] = '\0';
|
|
argc++;
|
|
argv[argc-1] = (char*) malloc(4096);
|
|
argv[argc-1][argv_len] = '\0';
|
|
argv_len = 0;
|
|
}
|
|
break;
|
|
|
|
case 9:
|
|
case 32:
|
|
if (quote == 0) {
|
|
if ( ( param[i+1] != 32) || ( param[i+1] != 9) ) {
|
|
if (argv_len != 0) {
|
|
argv[argc-1][argv_len] = '\0';
|
|
argc++;
|
|
argv[argc-1] = (char*) malloc(4096);
|
|
argv[argc-1][argv_len] = '\0';
|
|
argv_len = 0;
|
|
}
|
|
}
|
|
} else {
|
|
argv[argc-1][argv_len] = param[i];
|
|
argv_len++;
|
|
}
|
|
break;
|
|
default:
|
|
argv[argc-1][argv_len] = param[i];
|
|
argv_len++;
|
|
break;
|
|
|
|
}; // switch end
|
|
} // for end
|
|
|
|
argv[argc-1][argv_len] = '\0';
|
|
|
|
if ( strlen(argv[argc-1]) == 0 ) {
|
|
free(argv[argc-1]);
|
|
argc--;
|
|
}
|
|
|
|
return argc;
|
|
}
|
|
|
|
|
|
void parameters_free(int argc, char* argv[]) {
|
|
int i;
|
|
for (i = 0; i < argc; i++) free(argv[i]);
|
|
}
|
|
|