/*
 *  GETENV.C
 *
 *  (c)Copyright 1992 by Tobias Ferber, All Rights Reserved
 */

#include <stdio.h>

#ifndef AMIGA
#error "This code will only work on a Commodore Amiga"
#endif /* AMIGA */

static char rcs_id[]= "$Id: getenv.c,v 1.1 92/02/17 04:12:27 tf Exp $";

#define OFFSET_BEGINNING 0L
#define OFFSET_END 2L

typedef struct env {
  struct env *next;
  char *name, *value;
} env;

static env *_envbase= (env *)0L;

char *getenv(const char *varname)
{
  env *e;

  for(e=_envbase; e; e=e->next)
    if(stricmp(varname,e->name)==0)
      break;

  if(!e && varname && *varname)
  { char *fname= (char *)malloc( (5+strlen(varname)) * sizeof(char) );
    if(fname)
    { FILE *fp;
      strcpy(fname,"ENV:");
      strcat(fname,varname);
      if(fp= fopen(fname,"r"))
      { long fsize;
        fseek(fp,0L,OFFSET_END);
        fsize= (long)ftell(fp);
        if(fsize>0)
        { char *val= (char *)malloc( (fsize+1) * sizeof(char) );
          if(val)
          { fseek(fp,0L,OFFSET_BEGINNING);
            fread(val, sizeof(char), fsize, fp);
            val[fsize]= '\0';
            if(e= (env *)malloc( sizeof(env) ))
            { e->value= val;
              e->name= (char *)malloc( (1+strlen(varname)) * sizeof(char) );
              if(e->name)
              { strcpy(e->name,varname);
                e->next= _envbase; /* add head */
                _envbase= e;
              }
              else free(e);
            }
            else free(val);
          }
        }
        fclose(fp);
      }
      free(fname);
    }
  }
#ifdef DEBUG
  if(e) fprintf(stderr,"getenv(\"%s\") = \"%s\"\n",e->name,e->value);
  else fprintf(stderr,"getenv(\"%s\") = (null)\n",varname);
#endif
  return e ? e->value : (char *)0L;
}

#ifdef EXPERIMENTAL
void ungetenv(char *varname)
{
  if(varname && *varname)
  { env *d= (env *)0L, *e= _envbase;
    while(e && strnicmp(varname,e->name))
    { d= e;
      e= e->next;
    }
    if(e)
    { if(e->name) free(e->name);
      if(e->value) free(e->value);
      if(d) d->next= e->next;
      else _envbase= e->next;
    }
  }
  else /* flush all */
  { env *e= _envbase;
    while(e)
    { env *t= e;
      if(t->name) free(t->name);
      if(t->value) free(t->value);
      e= t->next;
      free(t);
    }
  }
}
#endif
