QSP_CHAR *qspFormatText(QSP_CHAR *txt, QSP_BOOL canReturnSelf) { QSPVariant val; QSP_CHAR *newTxt, *lPos, *rPos; int oldRefreshCount, len, txtLen, oldTxtLen, bufSize; if (qspGetVarNumValue(QSP_FMT("DISABLESUBEX"))) { if (canReturnSelf) return txt; return qspGetNewText(txt, -1); } lPos = qspStrStr(txt, QSP_LSUBEX); if (!lPos) { if (canReturnSelf) return txt; return qspGetNewText(txt, -1); } bufSize = 256; newTxt = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR)); txtLen = oldTxtLen = 0; oldRefreshCount = qspRefreshCount; do { len = (int)(lPos - txt); if ((txtLen += len) >= bufSize) { bufSize = txtLen + 128; newTxt = (QSP_CHAR *)realloc(newTxt, bufSize * sizeof(QSP_CHAR)); } qspStrNCopy(newTxt + oldTxtLen, txt, len); oldTxtLen = txtLen; txt = lPos + QSP_LEN(QSP_LSUBEX); rPos = qspStrPos(txt, QSP_RSUBEX, QSP_FALSE); if (!rPos) { qspSetError(QSP_ERR_BRACKNOTFOUND); free(newTxt); return 0; } *rPos = 0; val = qspExprValue(txt); *rPos = QSP_RSUBEX[0]; if (qspRefreshCount != oldRefreshCount || qspErrorNum) { free(newTxt); return 0; } qspConvertVariantTo(&val, QSP_TRUE); if ((txtLen += qspStrLen(QSP_STR(val))) >= bufSize) { bufSize = txtLen + 128; newTxt = (QSP_CHAR *)realloc(newTxt, bufSize * sizeof(QSP_CHAR)); } qspStrCopy(newTxt + oldTxtLen, QSP_STR(val)); free(QSP_STR(val)); oldTxtLen = txtLen; txt = rPos + QSP_LEN(QSP_RSUBEX); lPos = qspStrStr(txt, QSP_LSUBEX); } while (lPos); return qspGetAddText(newTxt, txt, txtLen, -1); }
int qspCodeWriteIntVal(QSP_CHAR **s, int len, int val, QSP_BOOL isCode) { QSP_CHAR buf[12], *temp; qspNumToStr(buf, val); if (isCode) { temp = qspCodeReCode(buf, QSP_TRUE); len = qspAddText(s, temp, len, -1, QSP_FALSE); free(temp); } else len = qspAddText(s, buf, len, -1, QSP_FALSE); return qspAddText(s, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE); }
QSP_CHAR *qspGetAllActionsAsCode() { int len = 0, count, i; QSP_CHAR *res, *temp; res = qspGetNewText(QSP_FMT(""), 0); for (i = 0; i < qspCurActionsCount; ++i) { len = qspAddText(&res, QSP_FMT("ACT '"), len, 5, QSP_FALSE); temp = qspReplaceText(qspCurActions[i].Desc, QSP_FMT("'"), QSP_FMT("''")); len = qspAddText(&res, temp, len, -1, QSP_FALSE); free(temp); if (qspCurActions[i].Image) { len = qspAddText(&res, QSP_FMT("','"), len, 3, QSP_FALSE); temp = qspReplaceText(qspCurActions[i].Image + qspQstPathLen, QSP_FMT("'"), QSP_FMT("''")); len = qspAddText(&res, temp, len, -1, QSP_FALSE); free(temp); } len = qspAddText(&res, QSP_FMT("':"), len, 2, QSP_FALSE); count = qspCurActions[i].OnPressLinesCount; if (count == 1 && qspIsAnyString(qspCurActions[i].OnPressLines->Str)) len = qspAddText(&res, qspCurActions[i].OnPressLines->Str, len, -1, QSP_FALSE); else { if (count >= 2) { len = qspAddText(&res, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE); temp = qspJoinPrepLines(qspCurActions[i].OnPressLines, count, QSP_STRSDELIM); len = qspAddText(&res, temp, len, -1, QSP_FALSE); free(temp); } len = qspAddText(&res, QSP_STRSDELIM QSP_FMT("END"), len, QSP_LEN(QSP_STRSDELIM) + 3, QSP_FALSE); } len = qspAddText(&res, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE); } return res; }
int qspCodeWriteVal(QSP_CHAR **s, int len, QSP_CHAR *val, QSP_BOOL isCode) { QSP_CHAR *temp; if (val) { if (isCode) { temp = qspCodeReCode(val, QSP_TRUE); len = qspAddText(s, temp, len, -1, QSP_FALSE); free(temp); } else len = qspAddText(s, val, len, -1, QSP_FALSE); } return qspAddText(s, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE); }
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); qspSetVarValue(name, &v, ch); *pos = ch; if (name != s) free(name); if (v.IsStr) free(QSP_STR(v)); }
void qspStatementLocal(QSP_CHAR *s) { QSPVariant v; QSPVar *var; QSP_BOOL isVarFound; QSP_CHAR *curPos, *varName, *commaPos, *eqPos; int i, groupInd, count, bufSize, oldRefreshCount; s = qspSkipSpaces(s); if (!(*s)) { qspSetError(QSP_ERR_SYNTAX); return; } groupInd = qspSavedVarsGroupsCount - 1; count = bufSize = qspSavedVarsGroups[groupInd].VarsCount; isVarFound = QSP_FALSE; curPos = s; eqPos = qspStrPos(curPos, QSP_EQUAL, QSP_FALSE); if (eqPos) *eqPos = 0; while (1) { /* Skip type char */ if (*curPos == QSP_STRCHAR[0]) ++curPos; /* Get variable's name */ commaPos = qspStrPos(curPos, QSP_COMMA, QSP_FALSE); if (commaPos) { *commaPos = 0; varName = (eqPos ? qspGetVarNameOnly(curPos) : qspDelSpc(curPos)); *commaPos = QSP_COMMA[0]; } else varName = (eqPos ? qspGetVarNameOnly(curPos) : qspDelSpc(curPos)); qspUpperStr(varName); /* Check for the existence */ for (i = 0; i < count; ++i) { if (!qspStrsComp(varName, qspSavedVarsGroups[groupInd].Vars[i].Name)) { isVarFound = QSP_TRUE; break; } } /* Get variable's data */ if (isVarFound) { /* Already exists */ isVarFound = QSP_FALSE; free(varName); } else { /* Add variable to the local group */ if (!(var = qspVarReference(varName, QSP_FALSE))) { free(varName); if (eqPos) *eqPos = QSP_EQUAL[0]; return; } if (count >= bufSize) { bufSize = count + 4; qspSavedVarsGroups[groupInd].Vars = (QSPVar *)realloc(qspSavedVarsGroups[groupInd].Vars, bufSize * sizeof(QSPVar)); } qspMoveVar(qspSavedVarsGroups[groupInd].Vars + count, var); qspSavedVarsGroups[groupInd].Vars[count].Name = varName; qspSavedVarsGroups[groupInd].VarsCount = ++count; } if (!commaPos) break; curPos = qspSkipSpaces(commaPos + QSP_LEN(QSP_COMMA)); if (!(*curPos)) { qspSetError(QSP_ERR_SYNTAX); if (eqPos) *eqPos = QSP_EQUAL[0]; return; } } if (eqPos) { oldRefreshCount = qspRefreshCount; v = qspExprValue(eqPos + QSP_LEN(QSP_EQUAL)); if (qspRefreshCount != oldRefreshCount || qspErrorNum) { *eqPos = QSP_EQUAL[0]; return; } varName = qspDelSpcCanRetSelf(s); qspSetVarValue(varName, &v, QSP_EQUAL[0]); if (varName != s) free(varName); if (v.IsStr) free(QSP_STR(v)); *eqPos = QSP_EQUAL[0]; } }
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)); }