
/*
 * 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)
        					CopySBitMap();
struct Layer *				CreateBehindLayer();
BPTR		CreateDir();
struct MsgPort *			CreatePort();
struct Process *			CreateProc();
struct IOStdReq *			CreateStdIO();
struct Task *				CreateTask();
struct Layer *				CreateUpfrontLayer();
BPTR					CurrentDir();
void					CurrentTime();
void					CWait();
long *					DateStamp();
void					Deallocate();
void					Debug();
void					Delay();
short					DeleteFile();
void					DeleteLayer();
void					DeletePort();
void					DeleteStdIO();
void					DeleteTask();
struct Process *			DeviceProc();
void					Disable();
void					DisownBlitter();
short					DisplayAlert();
void					DisplayBeep();
void					DisposeRegion();
void					DoCollision();
long					DoIO();
short					DoubleClick();
void					Draw();
void					DrawBorder();
void					DrawEllipse();
void					DrawGList();
void					DrawImage();
BPTR					DupLock();
void					Enable();
void					EndRefresh();
void					EndRequest();
void					EndUpdate();
void					Enqueue();
short					ExNext();
short					Examine();
short					Execute();
void					Exit();
struct ConfigDev *			FindConfigDev();
struct Node *				FindName();
struct MsgPort *			FindPort();
struct Resident *			FindResident();
struct SignalSemaphore *		FindSemaphore();
struct Task *				FindTask();
char *					FindToolType();
short					Flood();
void					FlushCList();
void					Forbid();
void					FreeBoardMem();
void					FreeCList();
void					FreeColorMap();
void					FreeConfigDev();
v