/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 1985-2011 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Glenn Fowler <[email protected]> *17* David Korn <[email protected]> *18* Phong Vo <[email protected]> *19* *20***********************************************************************/21#pragma prototyped2223#if _UWIN && __STDPP__24__STDPP__directive pragma pp:hide getenv25#endif2627#include "intercepts.h"2829#if _UWIN && __STDPP__30__STDPP__directive pragma pp:nohide getenv31#endif3233/*34* NOTE: the "intercepts" definition is here instead of astintercept.c because some35* static linkers miss lone references to "intercepts" without "astintercept()"36* ALSO: { 0 } definition required by some dynamic linkers averse to common symbols37* UWIN: no _ast_getenv macro map to maintain ast54 compatibility38*/3940Intercepts_t intercepts41#if _BLD_3d42;43#else44= { 0 };45#endif4647#if _UWIN && !defined(getenv)4849#include <windows.h>5051extern char** environ;5253static char*54default_getenv(const char* name)55{56register char** av;57register const char* cp;58register const char* sp;59register char c0;60register char c1;6162av = environ;63if (!av || !name || !(c0 = *name))64return 0;65if (!(c1 = *++name))66c1 = '=';67while (cp = *av++)68{69if (cp[0] != c0 || cp[1] != c1)70continue;71sp = name;72cp++;73while (*sp && *sp++ == *cp++);74if (*(sp-1) != *(cp-1))75continue;76if (*sp == 0 && *cp == '=')77return (char*)(cp+1);78}79return 0;80}8182#endif8384/*85* get name from the environment86*/8788#if defined(__EXPORT__) && defined(getenv)89#define extern __EXPORT__90#endif9192extern char*93getenv(const char* name)94{95#if _UWIN && !defined(getenv) /* for ast54 compatibility */96HANDLE dll;9798static char* (*posix_getenv)(const char*);99100if (!posix_getenv)101{102if (dll = GetModuleHandle("posix.dll"))103posix_getenv = (char*(*)(const char*))GetProcAddress(dll, "getenv");104if (!posix_getenv)105posix_getenv = default_getenv;106}107return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : (*posix_getenv)(name);108#else109#undef getenv110return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : getenv(name);111#endif112}113114115