#define REG_ROOT "SOFTWARE\\GNU\\Emacs"
-LPBYTE
+static char *
+w32_get_rdb_resource (rdb, resource)
+ char *rdb;
+ char *resource;
+{
+ char *value = rdb;
+ int len = strlen (resource);
+
+ while (*value)
+ {
+ /* Comparison is case-insensitive because registry searches are too. */
+ if ((strnicmp (value, resource, len) == 0) && (value[len] == ':'))
+ return xstrdup (&value[len + 1]);
+
+ value = strchr (value, '\0') + 1;
+ }
+
+ return NULL;
+}
+
+LPBYTE
w32_get_string_resource (name, class, dwexptype)
char *name, *class;
DWORD dwexptype;
DWORD dwType;
DWORD cbData;
BOOL ok = FALSE;
-
+ HKEY hive = HKEY_CURRENT_USER;
+
+ trykey:
+
BLOCK_INPUT;
-
- /* Check both the current user and the local machine to see if we have any resources */
-
- if (RegOpenKeyEx (HKEY_CURRENT_USER, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS
- || RegOpenKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
+
+ /* Check both the current user and the local machine to see if we have
+ any resources */
+
+ if (RegOpenKeyEx (hive, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
{
char *keyname;
-
+
if (RegQueryValueEx (hrootkey, name, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS
&& dwType == dwexptype)
{
keyname = name;
- }
+ }
else if (RegQueryValueEx (hrootkey, class, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS
&& dwType == dwexptype)
{
{
keyname = NULL;
}
-
+
ok = (keyname
&& (lpvalue = (LPBYTE) xmalloc (cbData)) != NULL
&& RegQueryValueEx (hrootkey, keyname, NULL, NULL, lpvalue, &cbData) == ERROR_SUCCESS);
-
+
RegCloseKey (hrootkey);
}
-
+
UNBLOCK_INPUT;
-
- if (!ok)
+
+ if (!ok)
{
- if (lpvalue) xfree (lpvalue);
+ if (lpvalue)
+ {
+ xfree (lpvalue);
+ lpvalue = NULL;
+ }
+ if (hive == HKEY_CURRENT_USER)
+ {
+ hive = HKEY_LOCAL_MACHINE;
+ goto trykey;
+ }
return (NULL);
- }
- else
- {
- return (lpvalue);
}
+ return (lpvalue);
}
/* Retrieve the string resource specified by NAME with CLASS from
char *
x_get_string_resource (rdb, name, class)
- int rdb;
+ XrmDatabase rdb;
char *name, *class;
{
+ if (rdb)
+ {
+ char *resource;
+
+ if (resource = w32_get_rdb_resource (rdb, name))
+ return resource;
+ if (resource = w32_get_rdb_resource (rdb, class))
+ return resource;
+ }
+
return (w32_get_string_resource (name, class, REG_SZ));
}