]> skyeroc.xyz Git - dgamelaunch/commitdiff
bugfixes - userpref nesting, and breaking up strings with \0 that get used again.
authorTangles <andyrthomson@gmail.com>
Sun, 16 Feb 2020 05:19:28 +0000 (16:19 +1100)
committerTangles <andyrthomson@gmail.com>
Sun, 16 Feb 2020 05:19:28 +0000 (16:19 +1100)
dgamelaunch.c
dgl-common.c

index 290aa2e6d3d7d86a9ab55b6bc5bfa6c0d5dfcbe5..d8d2b18ab44ade9506d38d79c212d0042ffd4606 100644 (file)
@@ -411,7 +411,7 @@ bannerstr_substprefs(char *buf, char *bufnew, int buflen)
     if (!src) return NULL;
     while (*src && dst < bufnew + buflen - 1) {
         if (varname || fallback) {
-            if (*src == ':' && !nest) {
+            if (*src == ':' && nest == 1) {
                 *src = '\0';
                 fallback = src + 1;
             } else if (*src == '{') {
index 4b56778f287101804b7b120df7c591f90c64545d..404382e831161ef92a289e46b51365deb9d06082 100644 (file)
@@ -147,7 +147,7 @@ dgl_format_str(int game, struct dg_user *me, char *str, char *plrname)
 
     while (*f) {
         if (varname || fallback) {
-           if (*f == ':' && !nest) {
+           if (*f == ':' && nest == 1) {
                fallback = f+1;
                *f = '\0';
            } else if (*f == '{') {
@@ -155,6 +155,8 @@ dgl_format_str(int game, struct dg_user *me, char *str, char *plrname)
            } else if (*f == '}' && !(--nest)) {
                *f = '\0';
                gpr = getpref(varname, fallback);
+               *f = '}'; /* put back how we found it */
+               if (fallback) *(fallback-1) = ':';
                if (firstchar) {
                    snprintf(p, end + 1 - p, "%c", gpr[0]);
                    firstchar = 0;
@@ -260,6 +262,7 @@ dgl_format_str(int game, struct dg_user *me, char *str, char *plrname)
            } else if (*f == '\\') {
                isbackslash = 1;
             } else if (isdollar && *f == '{') {
+               nest++;
                varname = f+1;
                fallback = NULL;
                isdollar = 0;
@@ -361,10 +364,11 @@ dgl_exec_cmdqueue_w(struct dg_cmdpart *queue, int game, struct dg_user *me, char
                int myargc = 0;
                char *words[32]; /* max args - this is arbitrary */
                char **myargv; /* allocate these when we know how many */
-               char *p; 
+               char *p;
                int isspace = 1;
                int i;
-               for (p = tmp->param2; *p; p++) {
+                char *p2_unformat = strdup(tmp->param2);
+               for (p = p2_unformat; *p; p++) {
                    if (*p == ' ') {
                        isspace++;
                        *p = 0;
@@ -380,6 +384,7 @@ dgl_exec_cmdqueue_w(struct dg_cmdpart *queue, int game, struct dg_user *me, char
                     myargv[i] = dgl_format_str(game, me, words[i-1], playername);
                }
                myargv[i] = 0;
+                free(p2_unformat);
 
                clear();
                refresh();