Jump to content

[Help] C Shell Console in linux


claww

Recommended Posts

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

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...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock