1N/A/***********************************************************************
1N/A* *
1N/A* This software is part of the ast package *
1N/A* Copyright (c) 1985-2011 AT&T Intellectual Property *
1N/A* and is licensed under the *
1N/A* Common Public License, Version 1.0 *
1N/A* by AT&T Intellectual Property *
1N/A* *
1N/A* A copy of the License is available at *
1N/A* http://www.opensource.org/licenses/cpl1.0.txt *
1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1N/A* *
1N/A* Information and Software Systems Research *
1N/A* AT&T Research *
1N/A* Florham Park NJ *
1N/A* *
1N/A* Glenn Fowler <gsf@research.att.com> *
1N/A* David Korn <dgk@research.att.com> *
1N/A* Phong Vo <kpv@research.att.com> *
1N/A* *
1N/A***********************************************************************/
1N/A#pragma prototyped
1N/A
1N/A#if _UWIN && __STDPP__
1N/A__STDPP__directive pragma pp:hide getenv
1N/A#endif
1N/A
1N/A#include "intercepts.h"
1N/A
1N/A#if _UWIN && __STDPP__
1N/A__STDPP__directive pragma pp:nohide getenv
1N/A#endif
1N/A
1N/A/*
1N/A * NOTE: the "intercepts" definition is here instead of astintercept.c because some
1N/A * static linkers miss lone references to "intercepts" without "astintercept()"
1N/A * ALSO: { 0 } definition required by some dynamic linkers averse to common symbols
1N/A * UWIN: no _ast_getenv macro map to maintain ast54 compatibility
1N/A */
1N/A
1N/AIntercepts_t intercepts
1N/A#if _BLD_3d
1N/A ;
1N/A#else
1N/A = { 0 };
1N/A#endif
1N/A
1N/A#if _UWIN && !defined(getenv)
1N/A
1N/A#include <windows.h>
1N/A
1N/Aextern char** environ;
1N/A
1N/Astatic char*
1N/Adefault_getenv(const char* name)
1N/A{
1N/A register char** av;
1N/A register const char* cp;
1N/A register const char* sp;
1N/A register char c0;
1N/A register char c1;
1N/A
1N/A av = environ;
1N/A if (!av || !name || !(c0 = *name))
1N/A return 0;
1N/A if (!(c1 = *++name))
1N/A c1 = '=';
1N/A while (cp = *av++)
1N/A {
1N/A if (cp[0] != c0 || cp[1] != c1)
1N/A continue;
1N/A sp = name;
1N/A cp++;
1N/A while (*sp && *sp++ == *cp++);
1N/A if (*(sp-1) != *(cp-1))
1N/A continue;
1N/A if (*sp == 0 && *cp == '=')
1N/A return (char*)(cp+1);
1N/A }
1N/A return 0;
1N/A}
1N/A
1N/A#endif
1N/A
1N/A/*
1N/A * get name from the environment
1N/A */
1N/A
1N/A#if defined(__EXPORT__) && defined(getenv)
1N/A#define extern __EXPORT__
1N/A#endif
1N/A
1N/Aextern char*
1N/Agetenv(const char* name)
1N/A{
1N/A#if _UWIN && !defined(getenv) /* for ast54 compatibility */
1N/A HANDLE dll;
1N/A
1N/A static char* (*posix_getenv)(const char*);
1N/A
1N/A if (!posix_getenv)
1N/A {
1N/A if (dll = GetModuleHandle("posix.dll"))
1N/A posix_getenv = (char*(*)(const char*))GetProcAddress(dll, "getenv");
1N/A if (!posix_getenv)
1N/A posix_getenv = default_getenv;
1N/A }
1N/A return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : (*posix_getenv)(name);
1N/A#else
1N/A#undef getenv
1N/A return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : getenv(name);
1N/A#endif
1N/A}