Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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);
}
Beispiel #6
0
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];
	}
}
Beispiel #7
0
QSP_BOOL qspIsAnyString(QSP_CHAR *s)
{
	return (*qspSkipSpaces(s) != 0);
}