From edf9953ef47e048853e33be891e04dcfce5c01b0 Mon Sep 17 00:00:00 2001
From: Dirk Zimoch <dirk.zimoch@psi.ch>
Date: Wed, 2 May 2018 15:59:45 +0200
Subject: [PATCH] add cond?"string1":"string2" on top level expression

---
 expr.c      | 51 +++++++++++++++++++++++++++++++++++++--------------
 teststrings |  3 ++-
 2 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/expr.c b/expr.c
index f1a00c63..e435ec23 100644
--- a/expr.c
+++ b/expr.c
@@ -336,11 +336,27 @@ static long parseString(const char **pp, const char **pstart)
     return length;
 }
 
+static void writeString(char** pw, const char* r, long length, char q)
+{
+    char* w = *pw;
+    *w++ = q;
+    while (length-- > 0)
+    {
+        if (*r == '\\') *w++ = *r++;
+        *w++ = *r++;
+    }
+    *w++ = q;
+    *w++ = 0;
+    *pw = w;
+}
+
 size_t replaceExpressions(const char *r, char *buffer, size_t buffersize)
 {
-    long val;
+    long val, string_length;
     char *w = buffer;
     char *s;
+    const char *string_start;
+    char q;
 
     *w = 0;
     while (*r)
@@ -349,17 +365,9 @@ size_t replaceExpressions(const char *r, char *buffer, size_t buffersize)
         if (*r == '"' || *r == '\'')
         {
             /* quoted strings */
-            const char *start;
-            char q = *r;
-            long length = parseString(&r, &start);
-            *w++ = q;
-            while (length-- > 0)
-            {
-                if (*start == '\\') *w++ = *start++;
-                *w++ = *start++;
-            }
-            *w++ = q;
-            *w++ = 0;
+            q = *r;
+            string_length = parseString(&r, &string_start);
+            writeString(&w, string_start, string_length, q);
             if (exprDebug) printf("quoted string %s\n", s);
         }
         else if (*r == '%')
@@ -383,8 +391,23 @@ size_t replaceExpressions(const char *r, char *buffer, size_t buffersize)
         else if (parseExpr(&r, &val) >= 0)
         {
             /* unformatted expression */
-            w += sprintf(w, "%ld", val);
-            *w = 0;
+            if (r[-1] == '?' && (q = parseSep(&r, "\"'")))
+            {
+                /* handle expression ? "string1" : "string2" */
+                w = s;
+                r--;
+                string_length = parseString(&r, &string_start);
+                if (val) writeString(&w, string_start, string_length, q);
+                if (parseSep(&r, ":"))
+                {
+                    string_length = parseString(&r, &string_start);
+                    if (!val) writeString(&w, string_start, string_length, q);
+                }
+            }
+            else
+            {
+                w += sprintf(w, "%ld", val);
+            }
             if (exprDebug) printf("expression %s\n", s);
         }
         else {
diff --git a/teststrings b/teststrings
index 9d6b4085..5c2990ab 100644
--- a/teststrings
+++ b/teststrings
@@ -88,4 +88,5 @@ x=#"Hello World"[2:8]
 x=#Hello World
 # $(x) should be: #Hello World
 
-
+x=1 ? "true" : "false"
+# $(x) should be: true
-- 
GitLab