+ char *p, *q, *key;
+ struct keyval *xrms, *ret;
+
+ p = q = strchr(string, ':');
+ if (!q) {
+ fprintf(stderr, "pterm: expected a colon in resource string"
+ " \"%s\"\n", string);
+ return;
+ }
+ q++;
+ while (p > string && p[-1] != '.' && p[-1] != '*')
+ p--;
+ xrms = snew(struct keyval);
+ key = snewn(q-p, char);
+ memcpy(key, p, q-p);
+ key[q-p-1] = '\0';
+ xrms->key = key;
+ while (*q && isspace((unsigned char)*q))
+ q++;
+ xrms->value = dupstr(q);
+
+ if (!xrmtree)
+ xrmtree = newtree234(keycmp);
+
+ ret = add234(xrmtree, xrms);
+ if (ret) {
+ /* Override an existing string. */
+ del234(xrmtree, ret);
+ add234(xrmtree, xrms);
+ }
+}
+
+const char *get_setting(const char *key)
+{
+ struct keyval tmp, *ret;
+ tmp.key = key;
+ if (xrmtree) {
+ ret = find234(xrmtree, &tmp, NULL);
+ if (ret)
+ return ret->value;
+ }
+ return x_get_default(key);
+}
+
+void *open_settings_r(const char *sessionname)
+{
+ char filename[FILENAME_MAX];
+ FILE *fp;
+ char *line;
+ tree234 *ret;
+
+ make_filename(filename, INDEX_SESSION, sessionname);
+ fp = fopen(filename, "r");
+ if (!fp)
+ return NULL; /* can't open */
+
+ ret = newtree234(keycmp);
+
+ while ( (line = fgetline(fp)) ) {
+ char *value = strchr(line, '=');
+ struct keyval *kv;
+
+ if (!value)
+ continue;
+ *value++ = '\0';
+ value[strcspn(value, "\r\n")] = '\0'; /* trim trailing NL */
+
+ kv = snew(struct keyval);
+ kv->key = dupstr(line);
+ kv->value = dupstr(value);
+ add234(ret, kv);
+
+ sfree(line);
+ }
+
+ fclose(fp);
+
+ return ret;
+}
+
+char *read_setting_s(void *handle, const char *key, char *buffer, int buflen)
+{
+ tree234 *tree = (tree234 *)handle;
+ const char *val;
+ struct keyval tmp, *kv;
+
+ tmp.key = key;
+ if (tree != NULL &&
+ (kv = find234(tree, &tmp, NULL)) != NULL) {
+ val = kv->value;
+ assert(val != NULL);
+ } else
+ val = get_setting(key);
+
+ if (!val)
+ return NULL;
+ else {
+ strncpy(buffer, val, buflen);
+ buffer[buflen-1] = '\0';
+ return buffer;
+ }
+}
+
+int read_setting_i(void *handle, const char *key, int defvalue)
+{
+ tree234 *tree = (tree234 *)handle;
+ const char *val;
+ struct keyval tmp, *kv;
+
+ tmp.key = key;
+ if (tree != NULL &&
+ (kv = find234(tree, &tmp, NULL)) != NULL) {
+ val = kv->value;
+ assert(val != NULL);
+ } else
+ val = get_setting(key);
+
+ if (!val)
+ return defvalue;
+ else
+ return atoi(val);