#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DEFAULT_SIZE 10
typedef struct {
char (*pointer)[256];
int used;
int size;
} Array;
Array *createArray(int start_size) {
Array
*array
= malloc(sizeof( *array
)); array->used = 0;
array->size = start_size;
array
->pointer
= malloc(start_size
* sizeof *array
->pointer
); // <--- here return array;
}
void append(Array *array, char* elem) {
if (array->used >= array->size) {
// expand table
array
->pointer
= realloc(array
->pointer
, array
->size
* 2 * sizeof *array
->pointer
); array->size *= 2;
}
// append new arg
strcpy(array
->pointer
[array
->used
] , elem
); // <-- here array->used++;
}
Array *parse(char* command) {
// split command by space and store each arg in array
char *args_str;
Array *args_list = createArray(DEFAULT_SIZE); // expandable array holding arguments
args_str
= strtok(command
, " ");
do {
append(args_list, args_str);
} while(args_str
= strtok(NULL
, " "));
return args_list;
}
int main(void)
{
Array *array;
char cmd[] = "ls -alh --color /tmp";
array = parse(cmd);
if(array == NULL)
return 0;
printf("Array->used: %d, array->size: %d\n", array
->used
, array
->size
); for(int i = 0; i < array->used; ++i)
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBERUZBVUxUX1NJWkUgMTAKCnR5cGVkZWYgc3RydWN0IHsKCWNoYXIgKCpwb2ludGVyKVsyNTZdOwoJaW50IHVzZWQ7CglpbnQgc2l6ZTsKfSBBcnJheTsKCkFycmF5ICpjcmVhdGVBcnJheShpbnQgc3RhcnRfc2l6ZSkgewogICAgQXJyYXkgKmFycmF5ID0gbWFsbG9jKHNpemVvZiggKmFycmF5KSk7CiAgICBhcnJheS0+dXNlZCA9IDA7CiAgICBhcnJheS0+c2l6ZSA9IHN0YXJ0X3NpemU7CiAgICBhcnJheS0+cG9pbnRlciA9IG1hbGxvYyhzdGFydF9zaXplICogc2l6ZW9mICphcnJheS0+cG9pbnRlcik7IC8vIDwtLS0gaGVyZQogICAgcmV0dXJuIGFycmF5Owp9CgoKdm9pZCBhcHBlbmQoQXJyYXkgKmFycmF5LCBjaGFyKiBlbGVtKSB7CiAgICBpZiAoYXJyYXktPnVzZWQgPj0gYXJyYXktPnNpemUpIHsKICAgICAgICAvLyBleHBhbmQgdGFibGUKICAgICAgICBhcnJheS0+cG9pbnRlciA9IHJlYWxsb2MoYXJyYXktPnBvaW50ZXIsIGFycmF5LT5zaXplICogMiAqIHNpemVvZiAqYXJyYXktPnBvaW50ZXIpOwogICAgICAgIGFycmF5LT5zaXplICo9IDI7CiAgICB9CiAgICAvLyBhcHBlbmQgbmV3IGFyZwogICAgc3RyY3B5KGFycmF5LT5wb2ludGVyW2FycmF5LT51c2VkXSAsIGVsZW0pOyAvLyA8LS0gaGVyZQogICAgYXJyYXktPnVzZWQrKzsKfQoKQXJyYXkgKnBhcnNlKGNoYXIqIGNvbW1hbmQpIHsKICAgIC8vIHNwbGl0IGNvbW1hbmQgYnkgc3BhY2UgYW5kIHN0b3JlIGVhY2ggYXJnIGluIGFycmF5CiAgICBjaGFyICphcmdzX3N0cjsKICAgIEFycmF5ICphcmdzX2xpc3QgPSBjcmVhdGVBcnJheShERUZBVUxUX1NJWkUpOyAvLyBleHBhbmRhYmxlIGFycmF5IGhvbGRpbmcgYXJndW1lbnRzCgogICAgYXJnc19zdHIgPSBzdHJ0b2soY29tbWFuZCwgIiAiKTsKCglkbyB7CgkJYXBwZW5kKGFyZ3NfbGlzdCwgYXJnc19zdHIpOwoJfSB3aGlsZShhcmdzX3N0ciA9IHN0cnRvayhOVUxMLCAiICIpKTsKCgoJcmV0dXJuIGFyZ3NfbGlzdDsKfQoKaW50IG1haW4odm9pZCkKewoJQXJyYXkgKmFycmF5OwoJY2hhciBjbWRbXSA9ICJscyAtYWxoIC0tY29sb3IgL3RtcCI7CgoJYXJyYXkgPSBwYXJzZShjbWQpOwoKCWlmKGFycmF5ID09IE5VTEwpCgkJcmV0dXJuIDA7CgoJcHJpbnRmKCJBcnJheS0+dXNlZDogJWQsIGFycmF5LT5zaXplOiAlZFxuIiwgYXJyYXktPnVzZWQsIGFycmF5LT5zaXplKTsKCWZvcihpbnQgaSA9IDA7IGkgPCBhcnJheS0+dXNlZDsgKytpKQoJCXB1dHMoYXJyYXktPnBvaW50ZXJbaV0pOwoKCWZyZWUoYXJyYXktPnBvaW50ZXIpOwoJZnJlZShhcnJheSk7Cn0K