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; }
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 qspArrayPos(QSPVariant *args, int argsCount, QSP_BOOL isRegExp) { int num, count, ind; QSPVar *var; QSPVariant *val; QSP_CHAR *str; OnigUChar *tempBeg, *tempEnd; regex_t *onigExp; OnigErrorInfo onigInfo; QSP_BOOL isString; if (qspConvertVariantTo(args, argsCount == 2)) { qspSetError(QSP_ERR_TYPEMISMATCH); return -1; } if (argsCount == 2) { str = QSP_STR(args[0]); ind = 0; val = args + 1; } else { qspConvertVariantTo(args + 1, QSP_TRUE); str = QSP_STR(args[1]); ind = QSP_NUM(args[0]); val = args + 2; if (ind < 0) ind = 0; } if (!(var = qspVarReferenceWithType(str, QSP_FALSE, &isString))) return -1; if (qspConvertVariantTo(val, isRegExp || isString)) { qspSetError(QSP_ERR_TYPEMISMATCH); return -1; } if (isRegExp) { tempBeg = (OnigUChar *)QSP_PSTR(val); tempEnd = (OnigUChar *)qspStrEnd(QSP_PSTR(val)); if (onig_new(&onigExp, tempBeg, tempEnd, ONIG_OPTION_DEFAULT, QSP_ONIG_ENC, ONIG_SYNTAX_PERL_NG, &onigInfo)) { qspSetError(QSP_ERR_INCORRECTREGEXP); return -1; } } count = var->ValsCount; if (ind > count) ind = count; while (ind <= count) { if (val->IsStr) { if (!(ind < count && (str = var->Values[ind].Str))) str = QSP_FMT(""); if (isRegExp) { tempBeg = (OnigUChar *)str; tempEnd = (OnigUChar *)qspStrEnd(str); if (onig_match(onigExp, tempBeg, tempEnd, tempBeg, 0, ONIG_OPTION_NONE) == tempEnd - tempBeg) { onig_free(onigExp); return ind; } } else if (!qspStrsComp(str, QSP_PSTR(val))) return ind; } else { num = (ind < count ? var->Values[ind].Num : 0); if (num == QSP_PNUM(val)) return ind; } ++ind; } if (isRegExp) onig_free(onigExp); return -1; }