QSP_BOOL qspStatementCopyArr(QSPVariant *args, int count, QSP_CHAR **jumpTo, int extArg) { int start, num; QSPVar *dest, *src; if (!(dest = qspVarReferenceWithType(QSP_STR(args[0]), QSP_TRUE, 0))) return QSP_FALSE; if (!(src = qspVarReferenceWithType(QSP_STR(args[1]), QSP_FALSE, 0))) return QSP_FALSE; if (dest != src) { start = (count >= 3 ? QSP_NUM(args[2]) : 0); num = (count == 4 ? QSP_NUM(args[3]) : src->ValsCount); qspEmptyVar(dest); qspCopyVar(dest, src, start, num); } return QSP_FALSE; }
static void qspRemoveArrayItem(QSP_CHAR *name, int index) { QSPVar *var; QSP_BOOL isRemoving; QSPVarIndex *ind; int origIndex; if (!(var = qspVarReferenceWithType(name, QSP_FALSE, 0))) return; if (index < 0 || index >= var->ValsCount) return; origIndex = index; if (var->Values[index].Str) free(var->Values[index].Str); var->ValsCount--; while (index < var->ValsCount) { var->Values[index] = var->Values[index + 1]; ++index; } isRemoving = QSP_FALSE; for (index = 0; index < var->IndsCount; ++index) { ind = var->Indices + index; if (ind->Index == origIndex) { free(ind->Str); var->IndsCount--; if (index == var->IndsCount) break; isRemoving = QSP_TRUE; } if (isRemoving) *ind = var->Indices[index + 1]; if (ind->Index > origIndex) ind->Index--; } }
QSP_BOOL qspStatementShowMenu(QSPVariant *args, int count, QSP_CHAR **jumpTo, int extArg) { int ind, maxItems, len; QSPVar *var; QSP_CHAR *imgPath, *str, *pos, *pos2; if (!(var = qspVarReferenceWithType(QSP_STR(args[0]), QSP_FALSE, 0))) return QSP_FALSE; qspClearMenu(QSP_FALSE); qspCallDeleteMenu(); if (count == 1) { ind = 0; maxItems = QSP_MAXMENUITEMS; } else { ind = QSP_NUM(args[1]); if (ind < 0) ind = 0; if (count == 2) maxItems = QSP_MAXMENUITEMS; else { maxItems = QSP_NUM(args[2]); if (maxItems < 0) maxItems = 0; } } while (ind < var->ValsCount) { if (qspCurMenuItems == maxItems) break; if (!((str = var->Values[ind].Str) && qspIsAnyString(str))) break; if (!(pos2 = qspInStrRChars(str, QSP_MENUDELIM, 0))) { qspSetError(QSP_ERR_COLONNOTFOUND); return QSP_FALSE; } if (qspCurMenuItems == QSP_MAXMENUITEMS) { qspSetError(QSP_ERR_CANTADDMENUITEM); return QSP_FALSE; } if (pos = qspInStrRChars(str, QSP_MENUDELIM, pos2)) { len = (int)(pos2 - pos) - 1; imgPath = (qspIsAnyString(++pos2) ? qspGetAbsFromRelPath(pos2) : 0); } else { pos = pos2; len = -1; imgPath = 0; } qspCurMenuLocs[qspCurMenuItems++] = qspGetNewText(pos + 1, len); *pos = 0; qspCallAddMenuItem(str, imgPath); *pos = QSP_MENUDELIM[0]; if (imgPath) free(imgPath); ++ind; } if (qspCurMenuItems) qspCallShowMenu(); return QSP_FALSE; }
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 qspArrayPos(QSP_CHAR *varName, QSPVariant *val, int ind, QSP_BOOL isRegExp) { int num, count; QSPVar *var; QSP_CHAR *str; regex_t *regExp; QSP_BOOL isString; if (!(var = qspVarReferenceWithType(varName, QSP_FALSE, &isString))) return -1; if (qspConvertVariantTo(val, isRegExp || isString)) { qspSetError(QSP_ERR_TYPEMISMATCH); return -1; } if (isRegExp) { regExp = qspRegExpGetCompiled(QSP_PSTR(val)); if (!regExp) return -1; } count = var->ValsCount; if (ind < 0) ind = 0; else if (ind > count) ind = count; while (ind <= count) { if (val->IsStr) { if (!(ind < count && (str = var->Values[ind].Str))) str = QSP_FMT(""); if (isRegExp) { if (qspRegExpStrMatch(regExp, str)) 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; } return -1; }
int qspArraySize(QSP_CHAR *name) { QSPVar *var; if (!(var = qspVarReferenceWithType(name, QSP_FALSE, 0))) return 0; return var->ValsCount; }
static void qspRemoveArray(QSP_CHAR *name) { QSPVar *var; if (!(var = qspVarReferenceWithType(name, QSP_FALSE, 0))) return; qspEmptyVar(var); }
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; }