Jump to content

Recommended Posts

Posted

Hello,

 

i have to create a project  C Shell console in linux i have it but one of requirements is to create the history, like when you press arrows up/down to show last commands used

 

 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <termios.h>
#include <poll.h>

#define MAX_LINE 80 
#define BUFFER_SIZE 50
#define buffer "\n\nIstoricul comenzilor:\n"

char history[10][bUFFER_SIZE];
int count = 0;
int caught = 0;

void printHistory()
   {
     int i;
     int j = 0;
     int hcount = count;
     for (i=0;i<10;i++)
       {
         printf("%d. ", hcount);
         while (history[i][j] != '\n' && history[i][j] != '\0')
   	   {
             printf("%c", history[i][j]);
             j++;
           }
         printf("\n");
         j = 0;
         hcount--;
         if (hcount ==  0)
         break;
       }
     printf("\n");
     printf(" SHELL:~$ ");
     fflush(stdout);
   }  
void handle_SIGINT()
   {
     write(STDOUT_FILENO,buffer,sizeof(buffer));
     printHistory();
     caught = 1;
   }
void setup(char inputBuffer[], char *args[],int *background)
   {
     int length,
     i,    
     start, 
     ct;    
     ct = 0; 
     length = read(STDIN_FILENO, inputBuffer, MAX_LINE);
     if (caught == 1)
       {
         length = read(STDIN_FILENO, inputBuffer, MAX_LINE);
         caught = 0;
       }
     for (i = 9;i>0; i--)
     strcpy(history[i], history[i-1]);
     strcpy(history[0],inputBuffer);
     count++;
     start = -1;
     if (length == 0)
     exit(0);           
     if (length < 0)
       {
         perror("comanda nu poate fi citita\n");
         exit(-1);       
       }
     for (i=0;i<length;i++)
       {
         switch (inputBuffer[i])
           {
             case ' ':
             case '\t' :               
             if(start != -1)
               {
                 args[ct] = &inputBuffer[start];   
	 ct++;
       }
             inputBuffer[i] = '\0'; 
     start = -1;
     break;
             case '\n':                
             if (start != -1)
       {
                 args[ct] = &inputBuffer[start];
	 ct++;
        }
              inputBuffer[i] = '\0';
              args[ct] = NULL; 
      break;
      default :           
      if (start == -1)
      start = i;
              if (inputBuffer[i] == '&')
	{
          *background  = 1;
                  inputBuffer[i] = '\0';
	 }
      }
        }

     args[ct] = NULL; 
   }

int main(void)
   {
     char inputBuffer[MAX_LINE]; 
     int background;            
     char *args[MAX_LINE/+1];
	    unsigned char line[128];
    unsigned int count = 0;
    int ret;
     pid_t pid;
     int i;

     printf("              \n\n                  #====================================#\n");
     printf("                  #         Sisteme de Operare         #\n");
     printf("                  #             Linux Shell            #\n");
     printf("                  #                                                #\n");
     printf("                  #====================================#\n\n");
     struct sigaction handler;
     handler.sa_handler = handle_SIGINT;
     sigaction(SIGINT, &handler, NULL);

     while (1)
       {            
         background = 0;
         printf("\n SHELL:~$  ");
         setup(inputBuffer,args,&background);  

         pid = fork();
         if (pid < 0)
           {
             printf("Fork fail.\n");
     exit (1);
   }   
  else if (pid == 0)
            {
              if (execvp (args[0], args) == -1)
              printf("Comanda nu poate fi executata\n");
             }
   else
             {
       if (background == 0)
       wait(NULL);
     }
 }
    }

 

anyone can help me to implement history with key arrows  to show last command used ?  i have an kind on history by pressing ctrl+c is show all last used commands but is not good.. 

 

 

Thanks

Posted

Can you just make it read from bash history. Like same as when you type "history" but use tail?

 

i think require readline and i dont know how to do with it

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...