#ifdef COMMENT Diese Funktion erlaubt den Zugriff auf Environmentvariablen aus allen Programmen heraus. Unter Master existieren zwei Uebergabemechanismen: 1. Im Unix-Standardformat: als Blockdiagramm: +---------+-+-----+--+---------+-+-----+--+ +-----+--+--+ |Variable1|=|Wert1|\0|Variable2|=|Wert2|\0| ... |Wertn|\0|\0| +---------+-+-----+--+---------+-+-----+--+ +-----+--+--+ oder in C-Schreibweise: env = "var1=val1\0var2=val2\0 ... valn\0\0"; 2. Im GEM-Format: als Blockdiagramm: +---------+-+--+-----+--+---------+-+--+-----+--+ +-----+--+--+ |Variable1|=|\0|Wert1|\0|Variable2|=|\0|Wert2|\0| ... |Wertn|\0|\0| +---------+-+--+-----+--+---------+-+--+-----+--+ +-----+--+--+ oder in C-Schreibweise: env = "var1=\0val1\0var2=\0val2\0 ... valn\0\0"; #endif COMMENT #ifdef GEM_ENV # define equal(s1,s2,l) !strcmp(s1,s2) #else # define equal(s1,s2,l) !strncmp(s1,s2,l) #endif GEM_ENV #define MASTER_MAGIC 0x4D415354L #include extern struct bp { long ptr[11]; char **p_env; char filler[0x50]; char cmdlin[0x80]; } *_base; /* Name gilt in MMCC */ char *getenv(str) char *str; { register char *tosenv, *teststr; register int len; long ssp; long **_shell_p = (long **) 0x4f6L; long *ptr; char *(*master)(); ssp = Super(0L); ptr = (*_shell_p); Super(ssp); if(*(ptr-2) == MASTER_MAGIC) { master = (char *(*)) ++ptr; return((*master)(1L,str)); } tosenv = *(_base->p_env); /* Environment-Zeiger */ /* aus der Basepage */ len = strlen(str) + 1; /* sichere den String */ teststr = (char *) malloc(len+1); strcpy(teststr,str); /* Variable in teststr */ strcat(teststr,"="); /* TOS braucht '=' */ while(*tosenv) { if(equal(*tosenv,teststr,len)) {/* schon gefunden ? */ register int lenv; tosenv += len; /* ueberspringe Namen */ #ifdef GEM_ENV tosenv++; /* und das 0-Byte */ #endif GEM_ENV lenv = strlen(*tosenv) + 1; free(teststr); /* String freigeben */ teststr = (char *) malloc(lenv); strcpy(teststr,tosenv); /* Wert in teststr */ return(teststr); /* und zurueckgeben */ } tosenv += strlen(*tosenv)+1; /* ueberspringe Eintrag */ } return((char *)0); /* nicht gefunden */ }