
/*
 * SET.C
 *
 * (c)1986 Matthew Dillon     9 October 1986
 *
 * Version 2.07M by Steve Drew 10-Sep-87
 *
 * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
 *
 */

extern struct Window *w;

#define MAXLEVELS (3 + MAXSRC)

struct MASTER {
	struct MASTER *next;
	struct MASTER *last;
	char *name;
	char *text;
};

static struct MASTER *Mbase[MAXLEVELS];

char *set_var(level, name, str)
register char *name, *str;
{
   register struct MASTER *base = Mbase[level];
   register struct MASTER *last;
   register int len;

   for (len = 0; isalphanum(name[len]); ++len);
   while (base != NULL) {
      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
         Free (base->text);
         goto gotit;
      }
      last = base;
      base = base->next;
   }
   if (base == Mbase[level]) {
      base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
      base->last = NULL;
   } else {
      base = (struct MASTER *)malloc (sizeof(struct MASTER));
      base->last = last;
      last->next = base;
   }
   base->name = malloc (len + 1);
   bmov (name, base->name, len);
   base->name[len] = 0;
   base->next = NULL;
gotit:
   base->text = malloc (strlen(str) + 1);
   strcpy (base->text, str);
   if (*name=='_') sys_vars();
   return (base->text);
}

char *get_var (level, name)
register char *name;
{
   register struct MASTER *base = Mbase[level];
   register unsigned char *scr;
   register int len;

   for (scr = (unsigned char *)name; *scr && *scr != 0x80 && *scr != ' ' && *scr != ';' && *scr != '|'; ++scr);
   len = scr - name;

   while (base != NULL) {
      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0)
         return (base->text);
      base = base->next;
   }
   return (NULL);
}

unset_level(level)
{
   register struct MASTER *base = Mbase[level];

   while (base) {
      Free (base->name);
      Free (base->text);
      Free (base);
      base = base->next;
   }
   Mbase[level] = NULL;
}

unset_var(level, name)
char *name;
{
   register struct MASTER *base = Mbase[level];
   register struct MASTER *last = NULL;
   register int len;

   for (len = 0; isalphanum(name[len]); ++len);
   while (base) {
      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
         if (base != Mbase[level])
            last->next = base->next;
         else
            Mbase[level] = base->next;
         if (base->next != NULL)
            base->next->last = last;
         if (base == Mbase[level])
            Mbase[level] = base->next;
         Free (base->name);
         Free (base->text);
         Free (base);
         return (1);
      }
      last = base;
      base = base->next;
   }
   return (-1);
}

do_unset_var(str, level)
char *str;
{
register unsigned int i;

for (i = 1; i < ac; ++i) unset_var (level, av[i]);
sys_vars();
return 0;
}

do_set_var(command, level)
char *command;
{
register struct MASTER *base = Mbase[level];
register char *str;

switch (ac) {
case 1:
	while (base && !dobreak()) {
		printf ("\2330m%-10s %s\n", base->name, base->text);
		base = base->next;
		}
	break;
case 2:
	if (str=get_var(level,av[1])) printf ("%-10s %s\n", av[1], str);
	break;
default:
	set_var (level, av[1], next_word (next_word (command)));
	if (*av[1]=='_') sys_vars();
	break;
	}
return 0;
}

sys_vars()
{
register char *str, *t;
extern char trueprompt[100];

if (strcmp(w->Title, str=get_var(LEVEL_SET, v_titlebar)))
	SetWindowTitles(w, str, -1L);
S_histlen=(str = get_var(LEVEL_SET, v_hist)) ? atoi(str) : 0;
debug  =(get_var(LEVEL_SET, v_debug)  !=NULL);
Verbose=(get_var(LEVEL_SET, v_verbose)!=NULL);
if (S_histlen < 2) S_histlen=2;

if ( (str=get_var(LEVEL_SET,v_prompt)) ==NULL) str="$ ";
t=trueprompt;
while (*str)
	if (*str=='%' && str[1]=='p') {
		str+=2;
		strcpy(t,get_var(LEVEL_SET, "_cwd"));
		t+=strlen(t);
		}
	else *t++=*str++;
strcpy(t,"\2330m");
}
