Return the number of tokens given a command

C Program Return the number of tokens given a command


  1. /* in setup_stack()... */  
  2.  
  3.   int i = 0;
  4.   int argc = get_argc(file_name);
  5.   char *token, *save_ptr;
  6.   char **argv = malloc((argc + 1) * sizeof(char *));
  7.   size_t token_size;
  8.  
  9.   //generate argv and push args onto stack

  10.   for (token = strtok_r((char *)file_name, " ", &save_ptr); token != NULL; token = strtok_r(NULL, " ", &save_ptr)) {
  11.     token_size = strlen(token) + 1;
  12.     *esp = *esp - token_size;
  13.     argv[i] = *esp;
  14.     i++;
  15.     memcpy(*esp, token, token_size);
  16.   } argv[argc] = 0;
  17.  
  18.   //perform alignment

  19.   size_t alignment = (size_t) *esp % 4;
  20.   if (alignment) {
  21.     *esp = *esp - alignment;
  22.     memcpy(*esp, &argv[argc], alignment);
  23.   }
  24.  
  25.   //push argv pointers

  26.   for (= argc; i >= 0; i--) {
  27.     *esp = *esp - sizeof(char *);
  28.     memcpy(*esp, &argv[i], sizeof(char *));
  29.   }
  30.  
  31.   //push pointer to argv

  32.   char *ptr = *esp;
  33.   *esp = *esp - sizeof(char **);
  34.   memcpy(*esp, &ptr, sizeof(char **));
  35.  
  36.   //push argc
  37.   *esp = *esp - sizeof(int);
  38.   memcpy(*esp, &argc, sizeof(int));
  39.  
  40.  //push dummy return address

  41.   *esp = *esp - sizeof(void *);
  42.   memcpy(*esp, &argv[argc], sizeof(void *));
  43.  
  44.   free(argv);
  45.   return success;
  46. }
  47.  
  48. /* Return the number of tokens given a command 'file_name.' */

  49. int get_argc(const char* file_name) {
  50.     int argc = 0;
  51.     char *buffer, *token, *save_ptr;
  52.     buffer = malloc(sizeof(file_name));
  53.     strlcpy(buffer, file_name, sizeof(file_name));
  54.     for (token = strtok_r((char *)buffer, " ", &save_ptr); token != NULL; token = strtok_r(NULL, " ", &save_ptr)) {
  55.         argc++;
  56.     }
  57.     free(buffer);
  58.     return argc;
  59. }


Learn More :