home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d107 / csh.lha / Csh / set.c < prev    next >
C/C++ Source or Header  |  1987-10-31  |  4KB  |  174 lines

  1.  
  2. /*
  3.  * SET.C
  4.  *
  5.  * (c)1986 Matthew Dillon     9 October 1986
  6.  *
  7.  * Version 2.07M by Steve Drew 10-Sep-87
  8.  *
  9.  */
  10.  
  11. #include "shell.h"
  12. #define MAXLEVELS (3 + MAXSRC)
  13.  
  14. struct MASTER {
  15.    struct MASTER *next;
  16.    struct MASTER *last;
  17.    char *name;
  18.    char *text;
  19. };
  20.  
  21. static struct MASTER *Mbase[MAXLEVELS];
  22.  
  23. char *
  24. set_var(level, name, str)
  25. register char *name, *str;
  26. {
  27.    register struct MASTER *base = Mbase[level];
  28.    register struct MASTER *last;
  29.    register int len;
  30.  
  31.    for (len = 0; isalphanum(name[len]); ++len);
  32.    while (base != NULL) {
  33.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  34.      Free (base->text);
  35.      goto gotit;
  36.       }
  37.       last = base;
  38.       base = base->next;
  39.    }
  40.    if (base == Mbase[level]) {
  41.       base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
  42.       base->last = NULL;
  43.    } else {
  44.       base = (struct MASTER *)malloc (sizeof(struct MASTER));
  45.       base->last = last;
  46.       last->next = base;
  47.    }
  48.    base->name = malloc (len + 1);
  49.    bmov (name, base->name, len);
  50.    base->name[len] = 0;
  51.    base->next = NULL;
  52. gotit:
  53.    base->text = malloc (strlen(str) + 1);
  54.    strcpy (base->text, str);
  55.    return (base->text);
  56. }
  57.  
  58. char *
  59. get_var (level, name)
  60. register char *name;
  61. {
  62.    register struct MASTER *base = Mbase[level];
  63.    register unsigned char *scr;
  64.    register int len;
  65.  
  66.    for (scr = (unsigned char *)name; *scr && *scr != 0x80 && *scr != ' ' && *scr != ';' && *scr != '|'; ++scr);
  67.    len = scr - name;
  68.  
  69.    while (base != NULL) {
  70.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0)
  71.      return (base->text);
  72.       base = base->next;
  73.    }
  74.    return (NULL);
  75. }
  76.  
  77. unset_level(level)
  78. {
  79.    register struct MASTER *base = Mbase[level];
  80.  
  81.    while (base) {
  82.       Free (base->name);
  83.       Free (base->text);
  84.       Free (base);
  85.       base = base->next;
  86.    }
  87.    Mbase[level] = NULL;
  88. }
  89.  
  90. unset_var(level, name)
  91. char *name;
  92. {
  93.    register struct MASTER *base = Mbase[level];
  94.    register struct MASTER *last = NULL;
  95.    register int len;
  96.  
  97.    for (len = 0; isalphanum(name[len]); ++len);
  98.    while (base) {
  99.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  100.      if (base != Mbase[level])
  101.         last->next = base->next;
  102.      else
  103.         Mbase[level] = base->next;
  104.      if (base->next != NULL)
  105.         base->next->last = last;
  106.      if (base == Mbase[level])
  107.         Mbase[level] = base->next;
  108.      Free (base->name);
  109.      Free (base->text);
  110.      Free (base);
  111.      return (1);
  112.       }
  113.       last = base;
  114.       base = base->next;
  115.    }
  116.    return (-1);
  117. }
  118.  
  119.  
  120. do_unset_var(str, level)
  121. char *str;
  122. {
  123.    register int i;
  124.  
  125.    for (i = 1; i < ac; ++i)
  126.       unset_var (level, av[i]);
  127.    sys_vars();
  128.    return (0);
  129. }
  130.  
  131. do_set_var(command, level)
  132. char *command;
  133. {
  134.    register struct MASTER *base = Mbase[level];
  135.    register char *str;
  136.  
  137.    if (ac == 1) {
  138.       while (base) {
  139.      if (CHECKBREAK())
  140.          return(0);
  141.      printf ("%-10s ", base->name);
  142.      puts (base->text);
  143.      base = base->next;
  144.       }
  145.       return (0);
  146.    }
  147.    if (ac == 2) {
  148.       str = get_var (level, av[1]);
  149.       if (str) {
  150.      printf ("%-10s ", av[1]);
  151.      puts(str);
  152.       } else if (level == LEVEL_SET) { /* only create var if set command */
  153.      set_var (level, av[1], "");
  154.       }
  155.    }
  156.    if (ac > 2) {
  157.       set_var (level, av[1], next_word (next_word (command)));
  158.      }
  159.    sys_vars();
  160.    return (0);
  161. }
  162.  
  163. sys_vars()
  164. {
  165.    char *str;
  166.    
  167.    if (*av[1] == '_') {
  168.       S_histlen = (str = get_var(LEVEL_SET, V_HIST))   ? atoi(str) : 0;
  169.       debug    = (str = get_var(LEVEL_SET, V_DEBUG))  ? (*str != '\0') : 0;
  170.       Verbose = (str = get_var(LEVEL_SET, V_VERBOSE)) ? (*str != '\0') : 0;
  171.       if (S_histlen < 2)   S_histlen = 2;
  172.    }
  173. }
  174.