home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / utility / misc / master / source / getenv.c next >
C/C++ Source or Header  |  1988-12-04  |  2KB  |  89 lines

  1. #ifdef COMMENT
  2.     Diese Funktion erlaubt den Zugriff auf Environmentvariablen aus allen
  3.     Programmen heraus. Unter Master existieren zwei Uebergabemechanismen:
  4.         1. Im Unix-Standardformat:
  5.  
  6.         als Blockdiagramm:
  7.  
  8.     +---------+-+-----+--+---------+-+-----+--+     +-----+--+--+
  9.     |Variable1|=|Wert1|\0|Variable2|=|Wert2|\0| ... |Wertn|\0|\0|
  10.     +---------+-+-----+--+---------+-+-----+--+     +-----+--+--+
  11.  
  12.         oder in C-Schreibweise:
  13.  
  14.         env = "var1=val1\0var2=val2\0 ... valn\0\0";
  15.  
  16.         2. Im GEM-Format:
  17.  
  18.         als Blockdiagramm:
  19.  
  20.     +---------+-+--+-----+--+---------+-+--+-----+--+     +-----+--+--+
  21.     |Variable1|=|\0|Wert1|\0|Variable2|=|\0|Wert2|\0| ... |Wertn|\0|\0|
  22.     +---------+-+--+-----+--+---------+-+--+-----+--+     +-----+--+--+
  23.  
  24.         oder in C-Schreibweise:
  25.  
  26.         env = "var1=\0val1\0var2=\0val2\0 ... valn\0\0";
  27. #endif COMMENT
  28.  
  29. #ifdef GEM_ENV
  30. # define equal(s1,s2,l)    !strcmp(s1,s2)
  31. #else
  32. # define equal(s1,s2,l)    !strncmp(s1,s2,l)
  33. #endif GEM_ENV
  34.  
  35. #define    MASTER_MAGIC    0x4D415354L
  36.  
  37. #include <osbind.h>
  38.  
  39. extern struct bp {
  40.         long    ptr[11];
  41.         char    **p_env;
  42.         char    filler[0x50];
  43.         char    cmdlin[0x80];
  44. } *_base;                    /* Name gilt in MMCC    */
  45.  
  46. char *getenv(str)
  47. char *str;
  48. {
  49.     register char    *tosenv, *teststr;
  50.     register int    len;
  51.     long    ssp;
  52.     long    **_shell_p = (long **) 0x4f6L;
  53.     long    *ptr;
  54.     char    *(*master)();
  55.  
  56.     ssp = Super(0L);
  57.         ptr = (*_shell_p);
  58.     Super(ssp);
  59.     if(*(ptr-2) == MASTER_MAGIC) {
  60.         master = (char *(*)) ++ptr;
  61.         return((*master)(1L,str));
  62.     }
  63.     tosenv = *(_base->p_env);        /* Environment-Zeiger    */
  64.                         /* aus der Basepage    */
  65.  
  66.     len = strlen(str) + 1;            /* sichere den String    */
  67.     teststr = (char *) malloc(len+1);
  68.     strcpy(teststr,str);            /* Variable in teststr    */
  69.     strcat(teststr,"=");            /* TOS braucht '='    */
  70.  
  71.     while(*tosenv) {
  72.         if(equal(*tosenv,teststr,len)) {/* schon gefunden ?    */
  73.             register int    lenv;
  74.             tosenv += len;        /* ueberspringe Namen    */
  75. #ifdef GEM_ENV
  76.             tosenv++;        /* und das 0-Byte    */
  77. #endif GEM_ENV
  78.             lenv = strlen(*tosenv) + 1;
  79.             free(teststr);        /* String freigeben    */
  80.  
  81.             teststr = (char *) malloc(lenv);
  82.             strcpy(teststr,tosenv);    /* Wert in teststr    */
  83.             return(teststr);    /* und zurueckgeben    */
  84.         }
  85.         tosenv += strlen(*tosenv)+1;    /* ueberspringe Eintrag    */
  86.     }
  87.     return((char *)0);            /* nicht gefunden    */
  88. }
  89.