Advertisement
Armaritto

Untitled

Mar 7th, 2024
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.64 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/wait.h>
  6. #define RED   "\x1B[31m"
  7. #define RESET "\x1B[0m"
  8.  
  9. char* varNames[1000];
  10. char* varValues[1000];
  11. int varIndex = 0;
  12.  
  13. void on_child_exit(){
  14.     /*reap_child_zombie()
  15.     write_to_log_file("Child terminated")*/
  16. }
  17.  
  18. void register_child_signal(){
  19.  
  20. }
  21.  
  22. void execute_command(char** args){
  23.     int pid;
  24.     int status;
  25.     pid = fork();
  26.     if(pid == 0){
  27.         execvp(args[0], args);
  28.         printf("Error! Command not found\n");
  29.         exit(0);
  30.     }
  31.     else if(pid < 0){
  32.         printf("Error forking!\n");
  33.     }
  34.     else{
  35.         do{
  36.             waitpid(pid, &status, 0);
  37.         }
  38.         while(!WIFEXITED(status) && !WIFSIGNALED(status));
  39.     }
  40. }
  41.  
  42. void execute_shell_builtin(char** command_array){
  43.     if(!strcmp("cd", command_array[0])){
  44.         if(command_array[1] == NULL || !strcmp("~", command_array[1])){
  45.             chdir(getenv("HOME"));
  46.         }
  47.         else if(!strcmp("..", command_array[1])){
  48.             chdir("..");
  49.         }
  50.         else{
  51.             if (chdir(command_array[1]) != 0)
  52.                 printf("Error! Directory not found\n");
  53.         }
  54.     }
  55.     else if(!strcmp("echo", command_array[0])){
  56.         if(command_array[1] == NULL){
  57.             printf("\n");
  58.         }
  59.         else{
  60.             int j = 1;
  61.             while(command_array[j] != NULL){
  62.                 if(command_array[j][0] == '$'){
  63.                     char* varName = command_array[1] + 1;
  64.                     for(int i = 0; i < varIndex; i++){
  65.                         if(!strcmp(varName, varNames[i])){
  66.                             char* token = strtok(varValues[i], "\"");
  67.                             printf("%s\n", token);
  68.                             return;
  69.                         }
  70.                     }
  71.                     printf("Error! Variable not found\n");
  72.                 }
  73.                 else{
  74.                     for(int i = 1; command_array[i] != NULL; i++){
  75.                         char* token = strtok(command_array[i], "\"");
  76.                         printf("%s ", token);
  77.                     }
  78.                     printf("\n");
  79.                 }
  80.                 j++;
  81.             }
  82.         }
  83.     }
  84.     else if(!strcmp("export", command_array[0])){
  85.         char* token = strtok(command_array[1], "=");
  86.         varNames[varIndex] = strdup(token);
  87.         token = strtok(NULL, "=");
  88.         varValues[varIndex] = strdup(token);
  89.         varIndex++;
  90.     }
  91. }
  92.  
  93. int evaluate_command(char** command_array){
  94.     if(!strcmp("cd", command_array[0]) || !strcmp("echo", command_array[0]) || !strcmp("export", command_array[0])){
  95.         return 0;
  96.     }
  97.     else if(!strcmp("exit", command_array[0])){
  98.         return -1;
  99.     }
  100.     else if(!strcmp(" ", command_array[0]) || !strcmp("", command_array[0])){
  101.         return 10;
  102.     }
  103.     else{
  104.         return 1;
  105.     }
  106. }
  107.  
  108. char** parse_command(char input[]){
  109.     static char* strings[100];
  110.     int x = 0;
  111.     while(strings[x] != NULL){
  112.         strings[x] = NULL;
  113.         x++;
  114.     }
  115.     static char* quotations[3];
  116.     x=0;
  117.     while(quotations[x] != NULL){
  118.         quotations[x] = NULL;
  119.         x++;
  120.     }
  121.     int index = 0;
  122.     int iQuotation = 0;
  123.     char* tknQuotation = strtok(input, "\"");
  124.     while(tknQuotation != NULL){
  125.         quotations[iQuotation++] = tknQuotation;
  126.         tknQuotation = strtok(NULL, "\"");
  127.     }
  128.     if(quotations[1] == NULL){
  129.         char* token = strtok(input, " \n"); // split string by space and newline
  130.         while (token != NULL){
  131.             if (token[0] == '$'){
  132.                 char* varName = token + 1;
  133.                 for(int i = 0; i < varIndex; i++){
  134.                     if(!strcmp(varName, varNames[i])){
  135.                         strings[index++] = varValues[i];
  136.                     }
  137.                 }
  138.             }
  139.             else{
  140.                 strings[index++] = token ;
  141.             }
  142.             token = strtok(NULL, " \n");
  143.         }
  144.         strings[index] = NULL;
  145.     }
  146.     else{
  147.         for(int i = 0; i < 3; i++) {
  148.             if(i!=1){
  149.                 char* token = strtok(quotations[i], " \n");
  150.                 while (token != NULL){
  151.                     strings[index++] = token;
  152.                     token = strtok(NULL, " \n");
  153.                 }
  154.             }
  155.             else{
  156.                 char* q[100];
  157.                 int j = 0;
  158.                 char* tkn = strtok(quotations[i], " \n");
  159.                 while(tkn != NULL){
  160.                     if(tkn[0] == '$'){
  161.                         char* varName = tkn + 1;
  162.                         for(int k = 0; k < varIndex; k++){
  163.                             if(!strcmp(varName, varNames[k])){
  164.                                 char* token = strtok(varValues[k], "\"");
  165.                                 q[j++] = token;
  166.                             }
  167.                         }
  168.                     }
  169.                     else {
  170.                         q[j++] = tkn;
  171.                     }
  172.                     tkn = strtok(NULL, " \n");
  173.                 }
  174.                 char str[100] = "";
  175.                 strcpy(str, q[0]);
  176.                 int k = 1;
  177.                 while(k<j){
  178.                     strcat(str, " ");
  179.                     strcat(str, q[k]);
  180.                     k++;
  181.                 }
  182.                 strings[index++] = strdup(str);
  183.             }
  184.         }
  185.     }
  186.     return strings;
  187. }
  188.  
  189. void shell_loop(){
  190.     int status = 1;
  191.     do {
  192.         if(!strcmp(getenv("HOME"), getcwd(NULL, 0))){
  193.             printf(RED "%s", "ubuntu@Armia-PC:");
  194.             printf( "%s", "~$ " RESET);
  195.         }
  196.         else{
  197.             printf(RED "%s", "ubuntu@Armia-PC:");
  198.             printf("%s", getcwd(NULL, 0));
  199.             printf("%s", "$ " RESET);
  200.         }
  201.         char input_command[100] ;
  202.         fgets(input_command, 100, stdin);
  203.         char** command_array = parse_command(input_command);  // parse array of char to array of strings seperated by space and ended with null
  204.         int type = evaluate_command(command_array); // 0: shell builtin, 1: executable or error, -1: exit
  205.         switch (type) {
  206.             case 0:
  207.                 execute_shell_builtin(command_array);
  208.                 break;
  209.             case 1:
  210.                 execute_command(command_array);
  211.                 break;
  212.             case -1:
  213.                 status = 0;
  214.                 break;
  215.             default:
  216.                 break;
  217.         }
  218.  
  219.     }
  220.     while(status);
  221. }
  222.  
  223. void setup_environment(){
  224.     chdir(getenv("HOME"));
  225. }
  226.  
  227.  
  228.  
  229. int main() {
  230.     //register_child_signal(on_child_exit());
  231.     setup_environment();
  232.     shell_loop();
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement