C Program Return the number of tokens given a command
- /* in setup_stack()... */
- int i = 0;
- int argc = get_argc(file_name);
- char *token, *save_ptr;
- char **argv = malloc((argc + 1) * sizeof(char *));
- size_t token_size;
//generate argv and push args onto stack
- for (token = strtok_r((char *)file_name, " ", &save_ptr); token != NULL; token = strtok_r(NULL, " ", &save_ptr)) {
- token_size = strlen(token) + 1;
- *esp = *esp - token_size;
- argv[i] = *esp;
- i++;
- memcpy(*esp, token, token_size);
- } argv[argc] = 0;
//perform alignment
- size_t alignment = (size_t) *esp % 4;
- if (alignment) {
- *esp = *esp - alignment;
- memcpy(*esp, &argv[argc], alignment);
- }
//push argv pointers
- for (i = argc; i >= 0; i--) {
- *esp = *esp - sizeof(char *);
- memcpy(*esp, &argv[i], sizeof(char *));
- }
//push pointer to argv
- char *ptr = *esp;
- *esp = *esp - sizeof(char **);
- memcpy(*esp, &ptr, sizeof(char **));
- //push argc
- *esp = *esp - sizeof(int);
- memcpy(*esp, &argc, sizeof(int));
//push dummy return address
- *esp = *esp - sizeof(void *);
- memcpy(*esp, &argv[argc], sizeof(void *));
- free(argv);
- return success;
- }
/* Return the number of tokens given a command 'file_name.' */
- int get_argc(const char* file_name) {
- int argc = 0;
- char *buffer, *token, *save_ptr;
- buffer = malloc(sizeof(file_name));
- strlcpy(buffer, file_name, sizeof(file_name));
- for (token = strtok_r((char *)buffer, " ", &save_ptr); token != NULL; token = strtok_r(NULL, " ", &save_ptr)) {
- argc++;
- }
- free(buffer);
- return argc;
- }