serge
serge

Reputation: 366

passing value of array to the start of the loop

My goal is to have the user view the history of entered commands (historyArray - done) and allow him to re-run any command in history, by entering history 1, history 2 where 1 and 2 is the number of the list of commands as printed-out from historyArray. I have managed to obtain the index from the second parameter (history 1) of the user input. My question is now, how to execute that specific command obtained from history N?

So, for example:

     hshell> test [Enter]
     Command not found
     hshell> history 1
     Command not found

Here is my progress:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv[])
{
    int i=0; int j=0; int k=0;
    int elementCounter = 0;
    char inputString[100];
    char *result=NULL;
    char delims[] = " ";
    char historyArray[30][20] = {0};
    char tokenArray[20][20] ;
    int tempIndex = 0;
    char hCommand[2][20]={0};

    do
    {
             j = 0;
             printf("hshell>");
             gets(inputString);

             strcpy (historyArray[k], inputString);
             k = (k+1) % 20;

            if (elementCounter <= 20)
             {         
              elementCounter++;                
             }

             if (elementCounter == 21)
             {
                k = 20;
                for (i=0; i<20; i++)
                {
                    strcpy(historyArray[i], historyArray[i+1]);
                }
                 strcpy (historyArray[19], inputString);                 
             }

             // Break the string into parts
             result = strtok(inputString, delims);


             while (result!=NULL)
             {
                  strcpy(tokenArray[j], result);
                   j++;
                  result= strtok(NULL, delims);                      
             }

              if (strcmp(tokenArray[0], "exit") == 0)
              {
                 return 0;
              }
              else if (strcmp(tokenArray[0], "history") ==  0)
              {
                   if (j>1)
                   { 
                      tempIndex = atoi(tokenArray[1]);
                     strcpy(hCommand,historyArray[tempIndex-1]);
                     puts(hCommand);
                    // tempIndex = atoi(tokenArray[j]);
                     //puts(tempIndex);
                   }
                   else
                   {
                       //print history array
                       for (i=0; i<elementCounter-1;i++)
                           printf("%i. %s\n", i+1, historyArray[i]);
                   }
              }
              else
              {
                  printf("Command not found\n");
              }



    }while (1);
}

Upvotes: 0

Views: 124

Answers (2)

user890166
user890166

Reputation:

You can use the 'system' function in unistd.h.

#include <unistd.h>
int system(const char *command);

This function is included in both windows and *nix. You do not need to worry about calling fork or CreateProcess separately, this will take care of it for you. See the MSDN documentation for details.

In your code, you would write:

system(hCommand);

It will return when the command finishes (it is a synchronous call).

Upvotes: 0

KiaMorot
KiaMorot

Reputation: 1746

After getting the name of the command you wanna execute I would suggest going through the system call exec. Take into account the exec replaces the current process image with the one you are going to execute. Otherwise you might be interested in fork.

EDIT#1 Then I believe you need this API. Note that I am not familiar which of those functions are equivalent to the ones I have provided in first place. With a bit time you could figure it out, right? :)

Upvotes: 1

Related Questions