C   29

fish c

Guest on 30th May 2022 01:58:41 AM

  1. #include <sys/types.h>
  2. #include <sys/wait.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <threads.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <histedit.h>
  9. #include <err.h>
  10.  
  11. static void loop(void);
  12. static void run_shell(void);
  13. static int T(void *arg);
  14.  
  15. static const char *
  16. prompt(void)
  17. {
  18.  
  19.         return "> ";
  20. }
  21.  
  22. static History *hist;
  23. static HistEvent he;
  24. static EditLine *elptr;
  25.  
  26. int
  27. main(int argc, char **argv)
  28. {
  29.         hist = history_init();
  30.         history(hist, &he, H_SETSIZE, 100);
  31.         elptr = el_init(getprogname(), stdin, stdout, stderr);
  32.         el_set(elptr, EL_EDITOR, "emacs");
  33.         el_set(elptr, EL_SIGNAL, 0);
  34.         el_set(elptr, EL_HIST, history, hist);
  35.         el_set(elptr, EL_PROMPT, prompt);
  36.         el_source(elptr, NULL);
  37.  
  38.         loop();
  39.  
  40.         return 0;
  41. }
  42.  
  43. static void
  44. loop(void)
  45. {
  46.         Tokenizer *tok;
  47.         const LineInfo *li;
  48.         const char *line;
  49.         int count;
  50.         int argc;
  51.         const char **argv;
  52.         int rv;
  53.  
  54.         while ((line = el_gets(elptr, &count)) != NULL && count > 0) {
  55.                 history(hist, &he, H_ENTER, line);
  56.        
  57.                 tok = tok_init(NULL);
  58.  
  59.                 li = el_line(elptr);
  60.                 if ((rv = tok_line(tok, li, &argc, &argv, NULL, NULL)) != 0)
  61.                         continue;
  62.  
  63.                 if (argc > 0 && strcmp(argv[0], "fish") == 0) {
  64.                         thrd_t t;
  65.                         thrd_create(&t, T, NULL);
  66.                 }
  67.  
  68.                 tok_reset(tok);
  69.                 tok_end(tok);
  70.  
  71.                 if (rv == 'q')
  72.                         break;
  73.         }
  74. }
  75.  
  76. static void
  77. run_shell()
  78. {
  79.         pid_t child;
  80.         int status;
  81.  
  82.         child = fork();
  83.         if (child == 0) {
  84.                 execl("/usr/games/fish", "/usr/games/fish");
  85.        
  86.                 err(EXIT_FAILURE, "execvp");
  87.  
  88.                 /* NOTREACHABLE */
  89.         }
  90.        
  91.         waitpid(child, &status, WEXITED);
  92. }
  93.  
  94. static int
  95. T(void *arg)
  96. {
  97.         run_shell();
  98.  
  99.         return 0;
  100. }

Raw Paste


Login or Register to edit or fork this paste. It's free.