home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 3
/
goldfish_volume_3.bin
/
files
/
text
/
misc
/
cvt
/
source
/
getenv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-28
|
2KB
|
102 lines
/*
* 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