diff --git a/expr.c b/expr.c index f1a00c63d8dc39fcce224050a57c6b80692da5a6..e435ec23560600714a6c03be4eb6aa3dc6155623 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 9d6b4085aca83a65adce574dee68df8107ad2893..5c2990abfb6c4a57e58825dbab54afde7afbc31f 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