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; }
QSPVar *qspVarReference(const QSP_CHAR *name, QSP_BOOL isCreate) { int i; QSPVar *var; QSP_CHAR *uName; unsigned char bCode; if (*name == QSP_STRCHAR[0]) ++name; if (!(*name) || qspIsDigit(*name) || qspStrPBrk(name, QSP_DELIMS)) { qspSetError(QSP_ERR_NOTCORRECTNAME); return nullptr; } qspUpperStr(uName = qspGetNewText(name, -1)); bCode = 0; for (i = 0; uName[i]; ++i) bCode = qspRand8[bCode ^ (unsigned char)uName[i]]; var = qspVars + QSP_VARSSEEK * bCode; for (i = 0; i < QSP_VARSSEEK; ++i) { if (!var->Name) { if (isCreate) var->Name = uName; else free(uName); return var; } if (!qspStrsComp(var->Name, uName)) { free(uName); return var; } ++var; } free(uName); qspSetError(QSP_ERR_TOOMANYVARS); return nullptr; }
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); }
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; }