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_CHAR *qspStrPos(QSP_CHAR *txt, QSP_CHAR *str, QSP_BOOL isIsolated) { QSP_BOOL isLastDelim; int strLen, c1, c2, c3; QSP_CHAR quot, *pos = qspStrStr(txt, str); if (!pos) return 0; if (!(isIsolated || qspStrPBrk(txt, QSP_QUOTS QSP_LQUOT QSP_LRBRACK QSP_LSBRACK))) return pos; strLen = qspStrLen(str); pos = qspStrEnd(txt) - strLen + 1; c1 = c2 = c3 = 0; isLastDelim = QSP_TRUE; while (txt < pos) { if (qspIsInList(QSP_QUOTS, *txt)) { quot = *txt; while (++txt < pos) if (*txt == quot && *(++txt) != quot) break; if (txt >= pos) return 0; isLastDelim = QSP_TRUE; } if (*txt == QSP_LRBRACK[0]) ++c1; else if (*txt == QSP_RRBRACK[0]) { if (c1) --c1; } else if (*txt == QSP_LSBRACK[0]) ++c2; else if (*txt == QSP_RSBRACK[0]) { if (c2) --c2; } else if (*txt == QSP_LQUOT[0]) ++c3; else if (*txt == QSP_RQUOT[0]) { if (c3) --c3; } if (!(c1 || c2 || c3)) { if (isIsolated) { if (qspIsInList(QSP_DELIMS, *txt)) isLastDelim = QSP_TRUE; else if (isLastDelim) { if (qspIsInListEOL(QSP_DELIMS, txt[strLen]) && !qspStrsNComp(txt, str, strLen)) return txt; isLastDelim = QSP_FALSE; } } else if (!qspStrsNComp(txt, str, strLen)) return txt; } ++txt; } return 0; }