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