1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
19da2e3ebdSchin *                   Phong Vo <kpv@research.att.com>                    *
20da2e3ebdSchin *                                                                      *
21da2e3ebdSchin ***********************************************************************/
227c2fbfb3SApril Chin #pragma prototyped
237c2fbfb3SApril Chin 
2434f9b3eeSRoland Mainz #if _UWIN && __STDPP__
2534f9b3eeSRoland Mainz __STDPP__directive pragma pp:hide getenv
2634f9b3eeSRoland Mainz #endif
2734f9b3eeSRoland Mainz 
287c2fbfb3SApril Chin #include "intercepts.h"
297c2fbfb3SApril Chin 
3034f9b3eeSRoland Mainz #if _UWIN && __STDPP__
3134f9b3eeSRoland Mainz __STDPP__directive pragma pp:nohide getenv
3234f9b3eeSRoland Mainz #endif
3334f9b3eeSRoland Mainz 
347c2fbfb3SApril Chin /*
357c2fbfb3SApril Chin  * NOTE: the "intercepts" definition is here instead of astintercept.c because some
367c2fbfb3SApril Chin  *	 static linkers miss lone references to "intercepts" without "astintercept()"
3734f9b3eeSRoland Mainz  * ALSO: { 0 } definition required by some dynamic linkers averse to common symbols
3834f9b3eeSRoland Mainz  * UWIN: no _ast_getenv macro map to maintain ast54 compatibility
397c2fbfb3SApril Chin  */
407c2fbfb3SApril Chin 
413e14f97fSRoger A. Faulkner Intercepts_t	intercepts
423e14f97fSRoger A. Faulkner #if _BLD_3d
433e14f97fSRoger A. Faulkner 		;
443e14f97fSRoger A. Faulkner #else
453e14f97fSRoger A. Faulkner 		= { 0 };
463e14f97fSRoger A. Faulkner #endif
477c2fbfb3SApril Chin 
4834f9b3eeSRoland Mainz #if _UWIN && !defined(getenv)
4934f9b3eeSRoland Mainz 
5034f9b3eeSRoland Mainz #include <windows.h>
5134f9b3eeSRoland Mainz 
5234f9b3eeSRoland Mainz extern char**	environ;
5334f9b3eeSRoland Mainz 
5434f9b3eeSRoland Mainz static char*
default_getenv(const char * name)5534f9b3eeSRoland Mainz default_getenv(const char* name)
5634f9b3eeSRoland Mainz {
5734f9b3eeSRoland Mainz 	register char**		av;
5834f9b3eeSRoland Mainz 	register const char*	cp;
5934f9b3eeSRoland Mainz 	register const char*	sp;
6034f9b3eeSRoland Mainz 	register char		c0;
6134f9b3eeSRoland Mainz 	register char		c1;
6234f9b3eeSRoland Mainz 
6334f9b3eeSRoland Mainz 	av = environ;
6434f9b3eeSRoland Mainz 	if (!av || !name || !(c0 = *name))
6534f9b3eeSRoland Mainz 		return 0;
6634f9b3eeSRoland Mainz 	if (!(c1 = *++name))
6734f9b3eeSRoland Mainz 		c1 = '=';
6834f9b3eeSRoland Mainz 	while (cp = *av++)
6934f9b3eeSRoland Mainz 	{
7034f9b3eeSRoland Mainz 		if (cp[0] != c0 || cp[1] != c1)
7134f9b3eeSRoland Mainz 			continue;
7234f9b3eeSRoland Mainz 		sp = name;
7334f9b3eeSRoland Mainz 		cp++;
7434f9b3eeSRoland Mainz 		while (*sp && *sp++ == *cp++);
7534f9b3eeSRoland Mainz 		if (*(sp-1) != *(cp-1))
7634f9b3eeSRoland Mainz 			continue;
7734f9b3eeSRoland Mainz 		if (*sp == 0 && *cp == '=')
7834f9b3eeSRoland Mainz 			return (char*)(cp+1);
7934f9b3eeSRoland Mainz 	}
8034f9b3eeSRoland Mainz 	return 0;
8134f9b3eeSRoland Mainz }
8234f9b3eeSRoland Mainz 
8334f9b3eeSRoland Mainz #endif
8434f9b3eeSRoland Mainz 
857c2fbfb3SApril Chin /*
867c2fbfb3SApril Chin  * get name from the environment
877c2fbfb3SApril Chin  */
887c2fbfb3SApril Chin 
8934f9b3eeSRoland Mainz #if defined(__EXPORT__) && defined(getenv)
9034f9b3eeSRoland Mainz #define extern	__EXPORT__
9134f9b3eeSRoland Mainz #endif
9234f9b3eeSRoland Mainz 
9334f9b3eeSRoland Mainz extern char*
getenv(const char * name)947c2fbfb3SApril Chin getenv(const char* name)
957c2fbfb3SApril Chin {
9634f9b3eeSRoland Mainz #if _UWIN && !defined(getenv) /* for ast54 compatibility */
9734f9b3eeSRoland Mainz 	HANDLE		dll;
9834f9b3eeSRoland Mainz 
9934f9b3eeSRoland Mainz 	static char*	(*posix_getenv)(const char*);
10034f9b3eeSRoland Mainz 
10134f9b3eeSRoland Mainz 	if (!posix_getenv)
10234f9b3eeSRoland Mainz 	{
10334f9b3eeSRoland Mainz 		if (dll = GetModuleHandle("posix.dll"))
10434f9b3eeSRoland Mainz 			posix_getenv = (char*(*)(const char*))GetProcAddress(dll, "getenv");
10534f9b3eeSRoland Mainz 		if (!posix_getenv)
10634f9b3eeSRoland Mainz 			posix_getenv = default_getenv;
10734f9b3eeSRoland Mainz 	}
10834f9b3eeSRoland Mainz 	return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : (*posix_getenv)(name);
10934f9b3eeSRoland Mainz #else
1107c2fbfb3SApril Chin #undef	getenv
1117c2fbfb3SApril Chin 	return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : getenv(name);
11234f9b3eeSRoland Mainz #endif
1137c2fbfb3SApril Chin }
114