Пример #1
0
QSPVariant qspArrayMinMaxItem(QSP_CHAR *name, QSP_BOOL isMin)
{
	QSPVar *var;
	QSP_CHAR *str;
	QSP_BOOL isString;
	int curInd, count;
	QSPVariant res;
	if (!(var = qspVarReferenceWithType(name, QSP_FALSE, &isString)))
		return qspGetEmptyVariant(QSP_FALSE);
	curInd = -1;
	count = var->ValsCount;
	while (--count >= 0)
	{
		if (isString)
		{
			str = var->Values[count].Str;
			if (str && *str)
			{
				if (curInd >= 0)
				{
					if (isMin)
					{
						if (QSP_STRCOLL(str, var->Values[curInd].Str) < 0)
							curInd = count;
					}
					else if (QSP_STRCOLL(str, var->Values[curInd].Str) > 0)
						curInd = count;
				}
				else
					curInd = count;
			}
		}
		else if (curInd >= 0)
		{
			if (isMin)
			{
				if (var->Values[count].Num < var->Values[curInd].Num)
					curInd = count;
			}
			else if (var->Values[count].Num > var->Values[curInd].Num)
				curInd = count;
		}
		else
			curInd = count;
	}
	if (curInd < 0) return qspGetEmptyVariant(isString);
	if (res.IsStr = isString)
		QSP_STR(res) = qspGetNewText(var->Values[curInd].Str, -1);
	else
		QSP_NUM(res) = var->Values[curInd].Num;
	return res;
}
Пример #2
0
int qspAutoConvertCompare(QSPVariant *v1, QSPVariant *v2)
{
	int res;
	if (v1->IsStr != v2->IsStr)
	{
		if (v2->IsStr)
		{
			if (qspIsCanConvertToNum(v2))
				qspConvertVariantTo(v2, QSP_FALSE);
			else
				qspConvertVariantTo(v1, QSP_TRUE);
		}
		else
		{
			if (qspIsCanConvertToNum(v1))
				qspConvertVariantTo(v1, QSP_FALSE);
			else
				qspConvertVariantTo(v2, QSP_TRUE);
		}
	}
	if (v1->IsStr)
		res = QSP_STRCOLL(QSP_PSTR(v1), QSP_PSTR(v2));
	else
		res = (QSP_PNUM(v1) > QSP_PNUM(v2) ? 1 : (QSP_PNUM(v1) < QSP_PNUM(v2) ? -1 : 0));
	return res;
}