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

  1. /*
  2.  *  GETENV.C
  3.  *
  4.  *  (c)Copyright 1992 by Tobias Ferber, All Rights Reserved
  5.  */
  6.  
  7. #include <stdio.h>
  8.  
  9. #ifndef AMIGA
  10. #error "This code will only work on a Commodore Amiga"
  11. #endif /* AMIGA */
  12.  
  13. static char rcs_id[]= "$Id: getenv.c,v 1.1 92/02/17 04:12:27 tf Exp $";
  14.  
  15. #define OFFSET_BEGINNING 0L
  16. #define OFFSET_END 2L
  17.  
  18. typedef struct env {
  19.   struct env *next;
  20.   char *name, *value;
  21. } env;
  22.  
  23. static env *_envbase= (env *)0L;
  24.  
  25. char *getenv(const char *varname)
  26. {
  27.   env *e;
  28.  
  29.   for(e=_envbase; e; e=e->next)
  30.     if(stricmp(varname,e->name)==0)
  31.       break;
  32.  
  33.   if(!e && varname && *varname)
  34.   { char *fname= (char *)malloc( (5+strlen(varname)) * sizeof(char) );
  35.     if(fname)
  36.     { FILE *fp;
  37.       strcpy(fname,"ENV:");
  38.       strcat(fname,varname);
  39.       if(fp= fopen(fname,"r"))
  40.       { long fsize;
  41.         fseek(fp,0L,OFFSET_END);
  42.         fsize= (long)ftell(fp);
  43.         if(fsize>0)
  44.         { char *val= (char *)malloc( (fsize+1) * sizeof(char) );
  45.           if(val)
  46.           { fseek(fp,0L,OFFSET_BEGINNING);
  47.             fread(val, sizeof(char), fsize, fp);
  48.             val[fsize]= '\0';
  49.             if(e= (env *)malloc( sizeof(env) ))
  50.             { e->value= val;
  51.               e->name= (char *)malloc( (1+strlen(varname)) * sizeof(char) );
  52.               if(e->name)
  53.               { strcpy(e->name,varname);
  54.                 e->next= _envbase; /* add head */
  55.                 _envbase= e;
  56.               }
  57.               else free(e);
  58.             }
  59.             else free(val);
  60.           }
  61.         }
  62.         fclose(fp);
  63.       }
  64.       free(fname);
  65.     }
  66.   }
  67. #ifdef DEBUG
  68.   if(e) fprintf(stderr,"getenv(\"%s\") = \"%s\"\n",e->name,e->value);
  69.   else fprintf(stderr,"getenv(\"%s\") = (null)\n",varname);
  70. #endif
  71.   return e ? e->value : (char *)0L;
  72. }
  73.  
  74. #ifdef EXPERIMENTAL
  75. void ungetenv(char *varname)
  76. {
  77.   if(varname && *varname)
  78.   { env *d= (env *)0L, *e= _envbase;
  79.     while(e && strnicmp(varname,e->name))
  80.     { d= e;
  81.       e= e->next;
  82.     }
  83.     if(e)
  84.     { if(e->name) free(e->name);
  85.       if(e->value) free(e->value);
  86.       if(d) d->next= e->next;
  87.       else _envbase= e->next;
  88.     }
  89.   }
  90.   else /* flush all */
  91.   { env *e= _envbase;
  92.     while(e)
  93.     { env *t= e;
  94.       if(t->name) free(t->name);
  95.       if(t->value) free(t->value);
  96.       e= t->next;
  97.       free(t);
  98.     }
  99.   }
  100. }
  101. #endif
  102.