home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / disks / disk458.lzh / Csh / src / set.c < prev    next >
C/C++ Source or Header  |  1991-02-15  |  4KB  |  178 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.  * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  10.  *
  11.  */
  12.  
  13. extern struct Window *w;
  14.  
  15. #define MAXLEVELS (3 + MAXSRC)
  16.  
  17. struct MASTER {
  18.     struct MASTER *next;
  19.     struct MASTER *last;
  20.     char *name;
  21.     char *text;
  22. };
  23.  
  24. static struct MASTER *Mbase[MAXLEVELS];
  25.  
  26. char *set_var(level, name, str)
  27. register char *name, *str;
  28. {
  29.    register struct MASTER *base = Mbase[level];
  30.    register struct MASTER *last;
  31.    register int len;
  32.  
  33.    for (len = 0; isalphanum(name[len]); ++len);
  34.    while (base != NULL) {
  35.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  36.          Free (base->text);
  37.          goto gotit;
  38.       }
  39.       last = base;
  40.       base = base->next;
  41.    }
  42.    if (base == Mbase[level]) {
  43.       base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
  44.       base->last = NULL;
  45.    } else {
  46.       base = (struct MASTER *)malloc (sizeof(struct MASTER));
  47.       base->last = last;
  48.       last->next = base;
  49.    }
  50.    base->name = malloc (len + 1);
  51.    bmov (name, base->name, len);
  52.    base->name[len] = 0;
  53.    base->next = NULL;
  54. gotit:
  55.    base->text = malloc (strlen(str) + 1);
  56.    strcpy (base->text, str);
  57.    if (*name=='_') sys_vars();
  58.    return (base->text);
  59. }
  60.  
  61. char *get_var (level, name)
  62. register char *name;
  63. {
  64.    register struct MASTER *base = Mbase[level];
  65.    register unsigned char *scr;
  66.    register int len;
  67.  
  68.    for (scr = (unsigned char *)name; *scr && *scr != 0x80 && *scr != ' ' && *scr != ';' && *scr != '|'; ++scr);
  69.    len = scr - name;
  70.  
  71.    while (base != NULL) {
  72.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0)
  73.          return (base->text);
  74.       base = base->next;
  75.    }
  76.    return (NULL);
  77. }
  78.  
  79. unset_level(level)
  80. {
  81.    register struct MASTER *base = Mbase[level];
  82.  
  83.    while (base) {
  84.       Free (base->name);
  85.       Free (base->text);
  86.       Free (base);
  87.       base = base->next;
  88.    }
  89.    Mbase[level] = NULL;
  90. }
  91.  
  92. unset_var(level, name)
  93. char *name;
  94. {
  95.    register struct MASTER *base = Mbase[level];
  96.    register struct MASTER *last = NULL;
  97.    register int len;
  98.  
  99.    for (len = 0; isalphanum(name[len]); ++len);
  100.    while (base) {
  101.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  102.          if (base != Mbase[level])
  103.             last->next = base->next;
  104.          else
  105.             Mbase[level] = base->next;
  106.          if (base->next != NULL)
  107.             base->next->last = last;
  108.          if (base == Mbase[level])
  109.             Mbase[level] = base->next;
  110.          Free (base->name);
  111.          Free (base->text);
  112.          Free (base);
  113.          return (1);
  114.       }
  115.       last = base;
  116.       base = base->next;
  117.    }
  118.    return (-1);
  119. }
  120.  
  121. do_unset_var(str, level)
  122. char *str;
  123. {
  124. register unsigned int i;
  125.  
  126. for (i = 1; i < ac; ++i) 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. switch (ac) {
  138. case 1:
  139.     while (base && !dobreak()) {
  140.         printf ("\2330m%-10s %s\n", base->name, base->text);
  141.         base = base->next;
  142.         }
  143.     break;
  144. case 2:
  145.     if (str=get_var(level,av[1])) printf ("%-10s %s\n", av[1], str);
  146.     break;
  147. default:
  148.     set_var (level, av[1], next_word (next_word (command)));
  149.     if (*av[1]=='_') sys_vars();
  150.     break;
  151.     }
  152. return 0;
  153. }
  154.  
  155. sys_vars()
  156. {
  157. register char *str, *t;
  158. extern char trueprompt[100];
  159.  
  160. if (strcmp(w->Title, str=get_var(LEVEL_SET, v_titlebar)))
  161.     SetWindowTitles(w, str, -1L);
  162. S_histlen=(str = get_var(LEVEL_SET, v_hist)) ? atoi(str) : 0;
  163. debug  =(get_var(LEVEL_SET, v_debug)  !=NULL);
  164. Verbose=(get_var(LEVEL_SET, v_verbose)!=NULL);
  165. if (S_histlen < 2) S_histlen=2;
  166.  
  167. if ( (str=get_var(LEVEL_SET,v_prompt)) ==NULL) str="$ ";
  168. t=trueprompt;
  169. while (*str)
  170.     if (*str=='%' && str[1]=='p') {
  171.         str+=2;
  172.         strcpy(t,get_var(LEVEL_SET, "_cwd"));
  173.         t+=strlen(t);
  174.         }
  175.     else *t++=*str++;
  176. strcpy(t,"\2330m");
  177. }
  178.