summaryrefslogtreecommitdiffstats
path: root/private/crt32/misc/getenv.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/misc/getenv.c')
-rw-r--r--private/crt32/misc/getenv.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/private/crt32/misc/getenv.c b/private/crt32/misc/getenv.c
new file mode 100644
index 000000000..7d14d2a74
--- /dev/null
+++ b/private/crt32/misc/getenv.c
@@ -0,0 +1,167 @@
+/***
+*getenv.c - get the value of an environment variable
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* defines getenv() - searches the environment for a string variable
+* and returns the value of it.
+*
+*Revision History:
+* 11-22-83 RN initial version
+* 04-13-87 JCR added const to declaration
+* 11-09-87 SKS avoid indexing past end of strings (add strlen check)
+* 12-11-87 JCR Added "_LOAD_DS" to declaration
+* 06-01-88 PHG Merged normal/DLL versions
+* 03-14-90 GJF Replaced _LOAD_DS with _CALLTYPE1, added #include
+* <cruntime.h>, removed #include <register.h> and fixed
+* the copyright. Also, cleaned up the formatting a bit.
+* 04-05-90 GJF Added #include <string.h>.
+* 07-25-90 SBM Removed redundant include (stdio.h)
+* 08-13-90 SBM Compiles cleanly with -W3 (made length unsigned int)
+* 10-04-90 GJF New-style function declarator.
+* 01-18-91 GJF ANSI naming.
+* 02-06-91 SRW Added _WIN32_ conditional for GetEnvironmentVariable
+* 02-18-91 SRW Removed _WIN32_ conditional for GetEnvironmentVariable
+* 01-10-92 GJF Final unlock and return statements shouldn't be in
+* if-block.
+* 03-11-92 GJF Use case-insensitive comparison for Win32.
+* 04-27-92 GJF Repackaged MTHREAD support for Win32 to create a
+* _getenv_lk.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <stdlib.h>
+#include <string.h>
+#include <os2dll.h>
+#include <oscalls.h>
+
+/***
+*char *getenv(option) - search environment for a string
+*
+*Purpose:
+* searches the environment for a string of the form "option=value",
+* if found, return value, otherwise NULL.
+*
+*Entry:
+* const char *option - variable to search for in environment
+*
+*Exit:
+* returns the value part of the environment string if found,
+* otherwise NULL
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+#ifdef _CRUISER_
+
+char * _CALLTYPE1 getenv (
+ REG3 const char *option
+ )
+{
+#ifdef _POSIX_
+ REG1 char **search = environ;
+#else
+ REG1 char **search = _environ;
+#endif
+ REG2 unsigned int length;
+
+ _mlock( _ENV_LOCK );
+
+ if (search && option)
+ {
+
+ length = strlen(option);
+
+ /*
+ ** Make sure `*search' is long enough to be a candidate
+ ** (We must NOT index past the '\0' at the end of `*search'!)
+ ** and that it has an equal sign (`=') in the correct spot.
+ ** If both of these requirements are met, compare the strings.
+ */
+ while (*search)
+ {
+ if (strlen(*search) > length && (*(*search + length)
+ == '=') && (strncmp(*search, option, length) == 0)) {
+ _munlock( _ENV_LOCK );
+ return(*search + length + 1);
+ }
+
+ search++;
+ }
+ }
+
+ _munlock( _ENV_LOCK );
+ return(NULL);
+}
+
+
+#else /* ndef _CRUISER_ */
+#ifdef _WIN32_
+
+
+#ifdef MTHREAD
+
+
+char * _CALLTYPE1 getenv (
+ const char *option
+ )
+{
+ char *retval;
+
+ _mlock(_ENV_LOCK);
+
+ retval = _getenv_lk(option);
+
+ _munlock(_ENV_LOCK);
+
+ return(retval);
+
+}
+
+
+char * _CALLTYPE1 _getenv_lk (
+ const char *option
+ )
+
+#else /* ndef MTHREAD */
+
+char * _CALLTYPE1 getenv (
+ const char *option
+ )
+
+#endif /* MTHREAD */
+{
+ char **search = _environ;
+ unsigned int length;
+
+ if (search && option)
+ {
+
+ length = strlen(option);
+
+ /*
+ ** Make sure `*search' is long enough to be a candidate
+ ** (We must NOT index past the '\0' at the end of `*search'!)
+ ** and that it has an equal sign (`=') in the correct spot.
+ ** If both of these requirements are met, compare the strings.
+ */
+ while (*search)
+ {
+ if (strlen(*search) > length && (*(*search + length)
+ == '=') && (strnicmp(*search, option, length) == 0)) {
+ return(*search + length + 1);
+ }
+
+ search++;
+ }
+ }
+
+ return(NULL);
+}
+
+
+#endif /* _WIN32_ */
+#endif /* _CRUISER_ */