add cond?"string1":"string2" on top level expression

This commit is contained in:
2018-05-02 15:59:45 +02:00
parent 3613328132
commit edf9953ef4
2 changed files with 39 additions and 15 deletions
+37 -14
View File
@@ -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 {
+2 -1
View File
@@ -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