void qspStatementSetVarValue(QSP_CHAR *s) { QSPVariant v; int oldRefreshCount; QSP_CHAR ch, *name, *pos = qspStrPos(s, QSP_EQUAL, QSP_FALSE); if (!pos) { qspSetError(QSP_ERR_EQNOTFOUND); return; } oldRefreshCount = qspRefreshCount; v = qspExprValue(pos + QSP_LEN(QSP_EQUAL)); if (qspRefreshCount != oldRefreshCount || qspErrorNum) return; if (pos != s && qspIsInList(QSP_ADD QSP_SUB QSP_DIV QSP_MUL, *(pos - 1))) --pos; ch = *pos; *pos = 0; name = qspDelSpcCanRetSelf(s); qspSetVar(name, &v, ch); *pos = ch; if (name != s) free(name); if (v.IsStr) free(QSP_STR(v)); }
static void qspSetVarValue(QSP_CHAR *name, QSPVariant *v, QSP_CHAR op) { QSPVariant v2; QSP_BOOL isSingleValue, notFirstValue = QSP_FALSE; QSP_CHAR *newValPos, *newCommaPos, *valPos, *commaPos = name; int oldRefreshCount = qspRefreshCount; if (v->IsStr) { valPos = QSP_PSTR(v); isSingleValue = QSP_FALSE; /* Multiple values by default */ } else isSingleValue = QSP_TRUE; while (1) { newCommaPos = qspStrPos(commaPos, QSP_COMMA, QSP_FALSE); if (newCommaPos) { *newCommaPos = 0; if (isSingleValue) { if (notFirstValue) qspSetVar(commaPos, &v2, op); else qspSetVar(commaPos, v, op); if (qspRefreshCount != oldRefreshCount || qspErrorNum) { *newCommaPos = QSP_COMMA[0]; break; } } else { newValPos = qspStrStr(valPos, QSP_VALSDELIM); if (newValPos) { notFirstValue = QSP_TRUE; v2.IsStr = QSP_TRUE; QSP_STR(v2) = qspGetNewText(valPos, (int)(newValPos - valPos)); qspSetVar(commaPos, &v2, op); if (qspRefreshCount != oldRefreshCount || qspErrorNum) { *newCommaPos = QSP_COMMA[0]; break; } if (v2.IsStr) free(QSP_STR(v2)); valPos = newValPos + QSP_LEN(QSP_VALSDELIM); } else /* The last value */ { isSingleValue = QSP_TRUE; if (notFirstValue) { v2.IsStr = QSP_TRUE; QSP_STR(v2) = qspGetNewText(valPos, -1); qspSetVar(commaPos, &v2, op); } else qspSetVar(commaPos, v, op); if (qspRefreshCount != oldRefreshCount || qspErrorNum) { *newCommaPos = QSP_COMMA[0]; break; } } } *newCommaPos = QSP_COMMA[0]; } else /* The last variable */ { if (notFirstValue) /* Not a first value */ { if (!isSingleValue) { v2.IsStr = QSP_TRUE; QSP_STR(v2) = qspGetNewText(valPos, -1); } qspSetVar(commaPos, &v2, op); } else qspSetVar(commaPos, v, op); break; } commaPos = newCommaPos + QSP_LEN(QSP_COMMA); } if (notFirstValue && v2.IsStr) free(QSP_STR(v2)); }