int qspPrepareLocalVars(QSPVar **vars) { QSPVar *var, *savedVars; int i, j, ind, varsCount = 0; for (i = qspSavedVarsGroupsCount - 1; i >= 0; --i) varsCount += qspSavedVarsGroups[i].VarsCount; if (!varsCount) { *vars = 0; return 0; } savedVars = (QSPVar *)malloc(varsCount * sizeof(QSPVar)); ind = 0; for (i = qspSavedVarsGroupsCount - 1; i >= 0; --i) { for (j = qspSavedVarsGroups[i].VarsCount - 1; j >= 0; --j) { if (!(var = qspVarReference(qspSavedVarsGroups[i].Vars[j].Name, QSP_TRUE))) { while (--ind >= 0) qspEmptyVar(savedVars + ind); free(savedVars); return 0; } qspMoveVar(savedVars + ind, var); qspMoveVar(var, &qspSavedVarsGroups[i].Vars[j]); ++ind; } } *vars = savedVars; return varsCount; }
void qspRestoreLocalVars(QSPVar *savedVars, int varsCount, QSPVarsGroup *savedGroups, int groupsCount) { QSPVar *var; int i, j, ind; if (savedVars) { ind = 0; for (i = groupsCount - 1; i >= 0; --i) { for (j = savedGroups[i].VarsCount - 1; j >= 0; --j) { if (!(var = qspVarReference(savedGroups[i].Vars[j].Name, QSP_TRUE))) { while (ind < varsCount) { qspEmptyVar(savedVars + ind); ++ind; } free(savedVars); return; } qspMoveVar(&savedGroups[i].Vars[j], var); qspMoveVar(var, savedVars + ind); ++ind; } } free(savedVars); } }
void qspRestoreVarsList(QSPVar *vars, int varsCount) { int i; QSPVar *var; if (vars) { for (i = 0; i < varsCount; ++i) { if (!(var = qspVarReference(vars[i].Name, QSP_TRUE))) { while (i < varsCount) { free(vars[i].Name); qspEmptyVar(vars + i); ++i; } free(vars); return; } free(vars[i].Name); qspEmptyVar(var); qspMoveVar(var, vars + i); } free(vars); } }
void qspPrepareGlobalVars() { int i, j; QSPVar *var; for (i = qspSavedVarsGroupsCount - 1; i >= 0; --i) { for (j = qspSavedVarsGroups[i].VarsCount - 1; j >= 0; --j) { if (!(var = qspVarReference(qspSavedVarsGroups[i].Vars[j].Name, QSP_TRUE))) return; qspEmptyVar(var); qspMoveVar(var, &qspSavedVarsGroups[i].Vars[j]); } } }
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]; } }