char *dst = bufnew;
char *varname = NULL;
char *fallback = NULL;
+ char *gpr = NULL;
int isdollar = 0;
if (!src) return NULL;
while (*src && dst < bufnew + buflen - 1) {
fallback = src + 1;
} else if (*src == '}') {
*src = '\0';
- snprintf(dst, bufnew + buflen - dst - 1, "%s", getpref(varname, fallback));
+ snprintf(dst, bufnew + buflen - dst - 1, "%s", gpr = getpref(varname, fallback));
+ if (gpr) {
+ free(gpr);
+ gpr = NULL;
+ }
for (; *dst; dst++);
fallback = varname = NULL;
}
return prefcount;
}
-const char *
+/* getpref allocates memory for the return value.
+ This must be freed when finished */
+char *
getpref(char *key, char *fallback)
{
struct userpref *cpref;
for (cpref = userprefs; cpref; cpref = cpref->npref)
if (!strcmp(cpref->name, key))
- return (const char *)cpref->value;
- return fallback ? (const char *)fallback : "";
+ return strdup(cpref->value);
+ return fallback ? dgl_format_str(0, me, fallback, NULL) : strdup("");
}
int
extern int purge_stale_locks(int game);
extern int readprefs(void);
extern int writeprefs(void);
-extern const char *getpref(char *key, char *fallback);
+extern char *getpref(char *key, char *fallback);
extern int setpref(char *key, char *val);
extern int askpref(char *prompt, char *key);
/*extern int menuloop(void);*/
* %N, %W, %L (char; first character of their lowercase counterparts)
* ${varname[:default]} expands to userpref value of varname if defined, else
* default if specified.
+ *
+ * Now returns a dynamically allocated string which must be freed.
*/
char *
dgl_format_str(int game, struct dg_user *me, char *str, char *plrname)
{
char buf[1024];
char *f, *p, *end, *varname = NULL, *fallback = NULL;
+ char *gpr = NULL;
int ispercent = 0;
int isbackslash = 0;
int isdollar = 0;
}
if (*f == '}') {
*f = '\0';
- snprintf(p, end + 1 - p, "%s", getpref(varname, fallback));
+ snprintf(p, end + 1 - p, "%s", gpr = getpref(varname, fallback));
+ if (gpr) free(gpr);
for (; *p; p++);
varname = fallback = NULL;
}