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; }
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; }