int qspStrToNum(QSP_CHAR *s, QSP_CHAR **endChar) { int num = 0; QSP_BOOL isNeg = QSP_FALSE; s = qspSkipSpaces(s); if (*s == QSP_FMT('-')) { isNeg = QSP_TRUE; ++s; } else if (*s == QSP_FMT('+')) ++s; while (qspIsDigit(*s)) { num = num * 10 + (*s - QSP_FMT('0')); ++s; } if (endChar) { *endChar = qspSkipSpaces(s); if (**endChar) return 0; } if (isNeg) return -num; return num; }
QSP_BOOL qspIsNumber(QSP_CHAR *s) { s = qspSkipSpaces(s); if (*s == QSP_FMT('-')) ++s; else if (*s == QSP_FMT('+')) ++s; if (qspIsDigit(*s)) { do { ++s; } while (qspIsDigit(*s)); } else return QSP_FALSE; s = qspSkipSpaces(s); return !(*s); }
QSP_CHAR *qspDelSpc(QSP_CHAR *s) { int len; QSP_CHAR *str, *begin = qspSkipSpaces(s), *end = qspStrEnd(begin); while (begin < end && qspIsInList(QSP_SPACES, *(end - 1))) --end; len = (int)(end - begin); str = (QSP_CHAR *)malloc((len + 1) * sizeof(QSP_CHAR)); qspStrNCopy(str, begin, len); str[len] = 0; return str; }
int qspStrToNum(QSP_CHAR *s, QSP_BOOL *isValid) { int num; QSP_BOOL isNeg = QSP_FALSE; s = qspSkipSpaces(s); if (*s == QSP_FMT('-')) { isNeg = QSP_TRUE; ++s; } else if (*s == QSP_FMT('+')) ++s; else if (!(*s)) /* special case, i.e. empty string must be convertible to 0 */ { if (isValid) *isValid = QSP_TRUE; return 0; } if (qspIsDigit(*s)) { num = 0; do { num = num * 10 + (*s - QSP_FMT('0')); ++s; } while (qspIsDigit(*s)); } else { if (isValid) *isValid = QSP_FALSE; return 0; } s = qspSkipSpaces(s); if (*s) { if (isValid) *isValid = QSP_FALSE; return 0; } if (isValid) *isValid = QSP_TRUE; if (isNeg) return -num; return num; }
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 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]; } }
QSP_BOOL qspIsAnyString(QSP_CHAR *s) { return (*qspSkipSpaces(s) != 0); }