summaryrefslogtreecommitdiff
path: root/gs/src/gp_wgetv.c
diff options
context:
space:
mode:
Diffstat (limited to 'gs/src/gp_wgetv.c')
-rw-r--r--gs/src/gp_wgetv.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/gs/src/gp_wgetv.c b/gs/src/gp_wgetv.c
new file mode 100644
index 000000000..23ea0ed9f
--- /dev/null
+++ b/gs/src/gp_wgetv.c
@@ -0,0 +1,130 @@
+/* Copyright (C) 1998 Aladdin Enterprises. All rights reserved.
+
+ This file is part of Aladdin Ghostscript.
+
+ Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
+ or distributor accepts any responsibility for the consequences of using it,
+ or for whether it serves any particular purpose or works at all, unless he
+ or she says so in writing. Refer to the Aladdin Ghostscript Free Public
+ License (the "License") for full details.
+
+ Every copy of Aladdin Ghostscript must include a copy of the License,
+ normally in a plain ASCII text file named PUBLIC. The License grants you
+ the right to copy, modify and redistribute Aladdin Ghostscript, but only
+ under certain conditions described in the License. Among other things, the
+ License requires that the copyright notice and this notice be preserved on
+ all copies.
+ */
+
+/*Id: gp_wgetv.c */
+/* MS Windows implementation of gp_getenv */
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h> /* for getenv */
+#include <string.h>
+#include "gscdefs.h" /* for gs_product and gs_revision */
+
+/* prototypes */
+int gp_getenv_registry(HKEY hkeyroot, const char *key, const char *name,
+ char *ptr, int *plen);
+
+/* ------ Environment variables ------ */
+
+/* Get the value of an environment variable. See gp.h for details. */
+int
+gp_getenv(const char *name, char *ptr, int *plen)
+{
+ const char *str = getenv(name);
+
+ if (str) {
+ int len = strlen(str);
+
+ if (len < *plen) {
+ /* string fits */
+ strcpy(ptr, str);
+ *plen = len + 1;
+ return 0;
+ }
+ /* string doesn't fit */
+ *plen = len + 1;
+ return -1;
+ }
+ /* environment variable was not found */
+
+#ifdef __WIN32__
+ {
+ /* If using Win32, look in the registry for a value with
+ * the given name. The registry value will be under the key
+ * HKEY_CURRENT_USER\Software\Aladdin Ghostscript\N.NN
+ * or if that fails under the key
+ * HKEY_LOCAL_MACHINE\Software\Aladdin Ghostscript\N.NN
+ * where "Aladdin Ghostscript" is actually gs_product
+ * and N.NN is obtained from gs_revision.
+ */
+ DWORD version = GetVersion();
+
+ if (!(((HIWORD(version) & 0x8000) != 0)
+ && ((HIWORD(version) & 0x4000) == 0))) {
+ /* not Win32s */
+ int code;
+ char key[256];
+ sprintf(key, "Software\\%s\\%d.%d", gs_product,
+ (int)(gs_revision / 100), (int)(gs_revision % 100));
+
+ code = gp_getenv_registry(HKEY_CURRENT_USER, key, name, ptr, plen);
+ if ( code <= 0 )
+ return code; /* found it */
+
+ code = gp_getenv_registry(HKEY_LOCAL_MACHINE, key, name, ptr, plen);
+ if ( code <= 0 )
+ return code; /* found it */
+ }
+ }
+#endif
+
+ /* nothing found at all */
+
+ if (*plen > 0)
+ *ptr = 0;
+ *plen = 1;
+ return 1;
+}
+
+
+/*
+ * Get a named registry value.
+ * Key = hkeyroot\\key, named value = name.
+ * name, ptr, plen and return values are the same as in gp_getenv();
+ */
+
+int
+gp_getenv_registry(HKEY hkeyroot, const char *key, const char *name,
+ char *ptr, int *plen)
+{
+ HKEY hkey;
+ DWORD cbData, keytype;
+ BYTE b;
+ LONG rc;
+ BYTE *bptr = (BYTE *)ptr;
+
+ if (RegOpenKeyEx(hkeyroot, key, 0, KEY_READ, &hkey)
+ == ERROR_SUCCESS) {
+ keytype = REG_SZ;
+ cbData = *plen;
+ if (bptr == (char *)NULL)
+ bptr = &b; /* Registry API won't return ERROR_MORE_DATA */
+ /* if ptr is NULL */
+ rc = RegQueryValueEx(hkey, (char *)name, 0, &keytype, bptr, &cbData);
+ RegCloseKey(hkey);
+ if (rc == ERROR_SUCCESS) {
+ *plen = cbData;
+ return 0; /* found environment variable and copied it */
+ } else if (rc == ERROR_MORE_DATA) {
+ /* buffer wasn't large enough */
+ *plen = cbData;
+ return -1;
+ }
+ }
+ return 1; /* not found */
+}