Example #1
0
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;
}
Example #2
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;
}
Example #3
0
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;
}