diff --git a/runScript.c b/runScript.c index bb389502be652fd4ea77287e7844fc819e1e5db2..080040f7da611cbefa57feff61438e5144abe3f0 100644 --- a/runScript.c +++ b/runScript.c @@ -69,7 +69,7 @@ static int parseValue(const char** pp, int* v) while (isspace((unsigned char)*p)) p++; } while (*p == '+' && p++); o = *p; - if (strchr("-~!", o)) + if (memchr("-~!", o, 3)) { p++; if (!parseValue(&p, &val)) return 0; @@ -90,7 +90,7 @@ static int parseValue(const char** pp, int* v) char* e; val = strtol(p, &e, 0); if (e == p) return 0; /* no number */ - if (*e && !isspace((unsigned char)*e) && !strchr("+-*/%?)'\"",*e)) + if (*e && !isspace((unsigned char)*e) && !strchr("+-*/%?)'\",", *e)) { /* followed by rubbish */ if (runScriptDebug > 1) printf("parseValue: bail out from '%s' at '%s'\n", *pp, e); @@ -122,7 +122,7 @@ static int parseExpr(const char** pp, int* v) q = p; while (isspace((unsigned char)*q)) q++; o = *q; - while (o == '*' || o == '/' || o == '%') + while (memchr("*/%", o, 3)) { q++; if (!parseValue(&q, &val2)) return 0; @@ -155,11 +155,11 @@ const char* getFormat(const char** pp) if (runScriptDebug > 1) printf ("getFormat %s\n", p); if ((format[0] = *p++) == '%') { - while (i < sizeof(format) && strchr(" #-+0", *p)) + while (i < sizeof(format) && memchr(" #-+0", *p, 5)) format[i++] = *p++; - while (i < sizeof(format) && strchr("0123456789", *p)) + while (i < sizeof(format) && *p >= '0' && *p <= '9') format[i++] = *p++; - if (i < sizeof(format) && strchr("diouxXc", *p)) + if (i < sizeof(format) && memchr("diouxXc", *p, 7)) { format[i++] = *p++; format[i] = 0; @@ -353,9 +353,8 @@ int runScript(const char* filename, const char* args) if (*r) *w++ = *r++; *w = 0; if (runScriptDebug > 1) printf ("quoted string %s\n", s); - continue; } - if (*r == '%') + else if (*r == '%') { /* formatted expression */ const char* r2 = r; @@ -371,23 +370,32 @@ int runScript(const char* filename, const char* args) } w += sprintf(w, f , val); if (runScriptDebug > 1) printf ("formatted expression %s\n", s); - continue; } } - if (parseExpr(&r, &val)) + else if (parseExpr(&r, &val)) { /* unformatted expression */ w += sprintf(w, "%d", val); + *w = 0; if (runScriptDebug > 1) printf ("simple expression %s\n", s); - continue; } - /* unquoted string (i.e plain word) */ - do { + else if (*r == ',') + { + /* single comma */ *w++ = *r++; - } while (*r && !strchr("%(\"', \t\n",*r)); + } + else { + /* unquoted string (i.e plain word) */ + do { + *w++ = *r++; + } while (*r && !strchr("%(\"', \t\n", *r)); + *w = 0; + if (runScriptDebug > 1) printf ("plain word '%s'\n", s); + } + /* copy space */ while (isspace((unsigned char)*r)) *w++ = *r++; + /* terminate */ *w = 0; - if (runScriptDebug > 1) printf ("plain word '%s'\n", s); } if (runScriptDebug) printf("runScript: assign %s=%s\n", p, line_raw);