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); }
/* Получить значение указанного выражения */ void QSPGetExprValue(QSP_BOOL *res, const QSP_CHAR *expr, QSP_BOOL *isString, int *numVal, QSP_CHAR *strVal, int strValBufSize) { QSPVariant v; if (qspIsExitOnError && qspErrorNum) { *res = QSP_FALSE; return; } qspResetError(); if (qspIsDisableCodeExec) { *res = QSP_FALSE; return; } v = qspExprValue((QSP_CHAR *)expr); if (qspErrorNum) { *res = QSP_FALSE; return; } *isString = v.IsStr; if (v.IsStr) { qspStrNCopy(strVal, QSP_STR(v), strValBufSize - 1); free(QSP_STR(v)); strVal[strValBufSize - 1] = 0; } else *numVal = QSP_NUM(v); *res = QSP_TRUE; }
/* Получить значение указанного выражения */ AS3_Val QSPGetExprValue(void *param, AS3_Val args) { char *expr; QSP_CHAR *exprWC; char *strUTF8; QSPVariant v; AS3_Val res; AS3_ArrayValue(args, "StrType", &expr); if (qspIsExitOnError && qspErrorNum) return AS3_Null(); qspResetError(); if (qspIsDisableCodeExec) return AS3_Null(); exprWC = qspC2W(expr); v = qspExprValue(exprWC); free(exprWC); if (qspErrorNum) return AS3_Null(); if (v.IsStr) { strUTF8 = qspW2C(QSP_STR(v)); free(QSP_STR(v)); res = AS3_Object("isString:IntType, numVal:IntType, strVal:StrType", QSP_TRUE, 0, strUTF8); free(strUTF8); } else res = AS3_Object("isString:IntType, numVal:IntType, strVal:StrType", QSP_FALSE, QSP_NUM(v), 0); return res; }
static QSPVar *qspGetVarData(QSP_CHAR *s, QSP_BOOL isSet, int *index) { QSPVar *var; QSPVariant ind; int oldRefreshCount; QSP_CHAR *temp, *rPos, *lPos = qspStrChar(s, QSP_LSBRACK[0]); if (lPos) { rPos = qspStrPos(lPos, QSP_RSBRACK, QSP_FALSE); if (!rPos) { qspSetError(QSP_ERR_BRACKNOTFOUND); return 0; } *lPos = 0; var = qspVarReference(s, isSet); *lPos = QSP_LSBRACK[0]; if (!var) return 0; temp = qspSkipSpaces(lPos + 1); if (temp == rPos) { if (isSet) *index = var->ValsCount; else *index = (var->ValsCount ? var->ValsCount - 1 : 0); } else { oldRefreshCount = qspRefreshCount; *rPos = 0; ind = qspExprValue(temp); *rPos = QSP_RSBRACK[0]; if (qspRefreshCount != oldRefreshCount || qspErrorNum) return 0; if (ind.IsStr) { *index = qspGetVarTextIndex(var, QSP_STR(ind), isSet); free(QSP_STR(ind)); } else *index = QSP_NUM(ind); } return var; } *index = 0; return qspVarReference(s, isSet); }
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]; } }