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; }
QSP_CHAR *qspNumToStr(QSP_CHAR *buf, int val) { QSP_CHAR temp, *str = buf, *first = str; if (val < 0) { *str++ = QSP_FMT('-'); val = -val; ++first; } do { *str++ = (QSP_CHAR)(val % 10 + QSP_FMT('0')); val /= 10; } while (val > 0); *str-- = 0; while (first < str) { temp = *str; *str = *first; *first = temp; --str; ++first; } return buf; }
/* Дата и время компиляции */ AS3_Val QSPGetCompiledDateTime(void *param, AS3_Val args) { AS3_Val res; char *infoUTF8 = qspW2C(QSP_FMT(__DATE__) QSP_FMT(", ") QSP_FMT(__TIME__)); res = AS3_String(infoUTF8); free(infoUTF8); return res; }
void QSPCallBacks::RefreshInt(QSP_BOOL isRedraw) { int i, numVal; bool isScroll, isCanSave; QSP_CHAR *strVal, *imgPath; UpdateGamePath(); const QSP_CHAR *mainDesc = QSPGetMainDesc(); const QSP_CHAR *varsDesc = QSPGetVarsDesc(); m_isHtml = QSPGetVarValues(QSP_FMT("USEHTML"), 0, &numVal, &strVal) && numVal; m_window->GetVars()->SetIsHtml(m_isHtml); if (QSPIsVarsDescChanged()) m_window->GetVars()->SetText(QString::fromWCharArray(varsDesc)/*, isScroll */); m_window->GetDesc()->SetIsHtml(m_isHtml); if (QSPIsMainDescChanged()) m_window->GetDesc()->SetText(QString::fromWCharArray(mainDesc)); if (QSPIsActionsChanged()) { m_window->GetActions()->ClearItems(); int actionsCount = QSPGetActionsCount(); for (i = 0; i < actionsCount; i++) { QSPGetActionData(i, &imgPath, &strVal); m_window->GetActions()->AddItem(QString::fromWCharArray(imgPath), QString::fromWCharArray(strVal)); } } m_window->GetActions()->setCurrentRow(QSPGetSelActionIndex()); if (QSPIsObjectsChanged()) { int objectsCount = QSPGetObjectsCount(); m_window->GetObjects()->ClearItems(); for (i = 0; i < objectsCount; ++i) { QSPGetObjectData(i, &imgPath, &strVal); m_window->GetObjects()->AddItem(QString::fromWCharArray(imgPath), QString::fromWCharArray(strVal)); } } m_window->GetObjects()->setCurrentRow(QSPGetSelObjectIndex()); if (QSPGetVarValues(QSP_FMT("BACKIMAGE"), 0, &numVal, &strVal) && strVal && *strVal) m_window->GetDesc()->LoadBackImage(m_gamePath + QString::fromWCharArray(strVal)); else m_window->GetDesc()->LoadBackImage(""); m_window->ApplyParams(); }
QSP_CHAR *qspCallInputBox(QSP_CHAR *text) { /* Здесь вводим текст */ QSPCallState state; QSP_CHAR *buffer; AS3_Val args; char *strUTF8; char *resText; int maxLen = 511; if (qspCallBacks[QSP_CALL_INPUTBOX].IsSet) { qspSaveCallState(&state, QSP_TRUE, QSP_FALSE); if (text) { strUTF8 = qspW2C(text); args = AS3_Array("StrType", strUTF8); free(strUTF8); } else args = AS3_Array("StrType", 0); AS3_Call(qspCallBacks[QSP_CALL_INPUTBOX].FuncVal, qspCallBacks[QSP_CALL_INPUTBOX].ThisVal, args); AS3_Release(args); flyield(); resText = AS3_StringValue(result); AS3_Release(result); buffer = qspC2W(resText); free(resText); qspRestoreCallState(&state); } else buffer = qspGetNewText(QSP_FMT(""), 0); return buffer; }
/* Установить индекс выбранного объекта */ void QSPSetSelObjectIndex(QSP_BOOL *res, int ind, QSP_BOOL isRefresh) { if (ind >= 0 && ind < qspCurObjectsCount && ind != qspCurSelObject) { if (qspIsExitOnError && qspErrorNum) { *res = QSP_FALSE; return; } qspPrepareExecution(); if (qspIsDisableCodeExec) { *res = QSP_FALSE; return; } qspCurSelObject = ind; qspExecLocByVarNameWithArgs(QSP_FMT("ONOBJSEL"), 0, 0); if (qspErrorNum) { *res = QSP_FALSE; return; } if (isRefresh) qspCallRefreshInt(QSP_FALSE); } *res = QSP_TRUE; }
QSP_CHAR *qspFormatText(QSP_CHAR *txt, QSP_BOOL canReturnSelf) { QSPVariant val; QSP_CHAR *newTxt, *lPos, *rPos; int oldRefreshCount, len, txtLen, oldTxtLen, bufSize; if (qspGetVarNumValue(QSP_FMT("DISABLESUBEX"))) { if (canReturnSelf) return txt; return qspGetNewText(txt, -1); } lPos = qspStrStr(txt, QSP_LSUBEX); if (!lPos) { if (canReturnSelf) return txt; return qspGetNewText(txt, -1); } bufSize = 256; newTxt = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR)); txtLen = oldTxtLen = 0; oldRefreshCount = qspRefreshCount; do { len = (int)(lPos - txt); if ((txtLen += len) >= bufSize) { bufSize = txtLen + 128; newTxt = (QSP_CHAR *)realloc(newTxt, bufSize * sizeof(QSP_CHAR)); } qspStrNCopy(newTxt + oldTxtLen, txt, len); oldTxtLen = txtLen; txt = lPos + QSP_LEN(QSP_LSUBEX); rPos = qspStrPos(txt, QSP_RSUBEX, QSP_FALSE); if (!rPos) { qspSetError(QSP_ERR_BRACKNOTFOUND); free(newTxt); return 0; } *rPos = 0; val = qspExprValue(txt); *rPos = QSP_RSUBEX[0]; if (qspRefreshCount != oldRefreshCount || qspErrorNum) { free(newTxt); return 0; } qspConvertVariantTo(&val, QSP_TRUE); if ((txtLen += qspStrLen(QSP_STR(val))) >= bufSize) { bufSize = txtLen + 128; newTxt = (QSP_CHAR *)realloc(newTxt, bufSize * sizeof(QSP_CHAR)); } qspStrCopy(newTxt + oldTxtLen, QSP_STR(val)); free(QSP_STR(val)); oldTxtLen = txtLen; txt = rPos + QSP_LEN(QSP_RSUBEX); lPos = qspStrStr(txt, QSP_LSUBEX); } while (lPos); return qspGetAddText(newTxt, txt, txtLen, -1); }
QSP_BOOL qspStatementAddObject(QSPVariant *args, int count, QSP_CHAR **jumpTo, int extArg) { QSPObj *obj; int i, objInd; QSP_CHAR *imgPath; if (count == 3) { objInd = QSP_NUM(args[2]) - 1; if (objInd < 0 || objInd > qspCurObjectsCount) return QSP_FALSE; } else objInd = qspCurObjectsCount; if (qspCurObjectsCount == QSP_MAXOBJECTS) { qspSetError(QSP_ERR_CANTADDOBJECT); return QSP_FALSE; } if (qspCurSelObject >= objInd) qspCurSelObject = -1; if (count >= 2 && qspIsAnyString(QSP_STR(args[1]))) imgPath = qspGetAbsFromRelPath(QSP_STR(args[1])); else imgPath = 0; for (i = qspCurObjectsCount; i > objInd; --i) qspCurObjects[i] = qspCurObjects[i - 1]; ++qspCurObjectsCount; obj = qspCurObjects + objInd; obj->Image = imgPath; obj->Desc = qspGetNewText(QSP_STR(args[0]), -1); qspIsObjectsChanged = QSP_TRUE; qspExecLocByVarNameWithArgs(QSP_FMT("ONOBJADD"), args, (count < 3 ? count : 2)); return QSP_FALSE; }
QSPVariant qspGetEmptyVariant(QSP_BOOL isStringType) { QSPVariant ret; if (ret.IsStr = isStringType) QSP_STR(ret) = qspGetNewText(QSP_FMT(""), 0); else QSP_NUM(ret) = 0; return ret; }
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); }
/* Выполнение кода локации-обработчика строки ввода */ QSP_BOOL QSPExecUserInput(QSP_BOOL isRefresh) { if (qspIsExitOnError && qspErrorNum) return QSP_FALSE; qspPrepareExecution(); if (qspIsDisableCodeExec) return QSP_FALSE; qspExecLocByVarNameWithArgs(QSP_FMT("USERCOM"), 0, 0); if (qspErrorNum) return QSP_FALSE; if (isRefresh) qspCallRefreshInt(QSP_FALSE); return QSP_TRUE; }
/* Выполнение кода локации-счетчика */ QSP_BOOL QSPExecCounter(QSP_BOOL isRefresh) { if (!qspIsInCallBack) { qspPrepareExecution(); qspExecLocByVarNameWithArgs(QSP_FMT("COUNTER"), 0, 0); if (qspErrorNum) return QSP_FALSE; if (isRefresh) qspCallRefreshInt(QSP_FALSE); } return QSP_TRUE; }
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; }
/* Выполнение кода локации-обработчика строки ввода */ AS3_Val QSPExecUserInput(void *param, AS3_Val args) { QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType", &isRefresh); if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); qspExecLocByVarNameWithArgs(QSP_FMT("USERCOM"), 0, 0); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); return AS3_True(); }
/* Выполнение кода локации-счетчика */ AS3_Val QSPExecCounter(void *param, AS3_Val args) { QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType", &isRefresh); if (!qspIsInCallBack) { qspPrepareExecution(); qspExecLocByVarNameWithArgs(QSP_FMT("COUNTER"), 0, 0); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); } return AS3_True(); }
const QSP_CHAR *qspGetVarStrValue(QSP_CHAR *name) { QSP_CHAR *text; QSPVar *var; if (var = qspVarReference(name, QSP_FALSE)) { if (var->ValsCount) { text = var->Values->Str; if (text) return text; } } else qspResetError(); return QSP_FMT(""); }
/* Установить индекс выбранного действия */ QSP_BOOL QSPSetSelActionIndex(int ind, QSP_BOOL isRefresh) { if (ind >= 0 && ind < qspCurActionsCount && ind != qspCurSelAction) { if (qspIsExitOnError && qspErrorNum) return QSP_FALSE; qspPrepareExecution(); if (qspIsDisableCodeExec) return QSP_FALSE; qspCurSelAction = ind; qspExecLocByVarNameWithArgs(QSP_FMT("ONACTSEL"), 0, 0); if (qspErrorNum) return QSP_FALSE; if (isRefresh) qspCallRefreshInt(QSP_FALSE); } return QSP_TRUE; }
void qspApplyResult(QSPVar *varRes, QSPVariant *res) { QSP_CHAR *text; if (varRes->ValsCount) { if (text = varRes->Values[0].Str) { res->IsStr = QSP_TRUE; QSP_PSTR(res) = qspGetNewText(text, -1); } else { res->IsStr = QSP_FALSE; QSP_PNUM(res) = varRes->Values[0].Num; } } else { res->IsStr = QSP_TRUE; QSP_PSTR(res) = qspGetNewText(QSP_FMT(""), 0); } }
QSPVariant qspGetVarValueByReference(QSPVar *var, int ind, QSP_BOOL isStringType) { QSPVariant ret; QSP_CHAR *text; if (ind >= 0 && ind < var->ValsCount) { if (ret.IsStr = isStringType) { text = var->Values[ind].Str; QSP_STR(ret) = (text ? qspGetNewText(text, -1) : qspGetNewText(QSP_FMT(""), 0)); } else QSP_NUM(ret) = var->Values[ind].Num; return ret; } return qspGetEmptyVariant(isStringType); }
/* Установить индекс выбранного объекта */ AS3_Val QSPSetSelObjectIndex(void *param, AS3_Val args) { int ind; QSP_BOOL isRefresh; AS3_ArrayValue(args, "IntType, IntType", &ind, &isRefresh); if (ind >= 0 && ind < qspCurObjectsCount && ind != qspCurSelObject) { if (qspIsExitOnError && qspErrorNum) return AS3_False(); qspPrepareExecution(); if (qspIsDisableCodeExec) return AS3_False(); qspCurSelObject = ind; qspExecLocByVarNameWithArgs(QSP_FMT("ONOBJSEL"), 0, 0); if (qspErrorNum) return AS3_False(); if (isRefresh) qspCallRefreshInt(QSP_FALSE); } return AS3_True(); }
QSP_CHAR *qspGetAllActionsAsCode() { int len = 0, count, i; QSP_CHAR *res, *temp; res = qspGetNewText(QSP_FMT(""), 0); for (i = 0; i < qspCurActionsCount; ++i) { len = qspAddText(&res, QSP_FMT("ACT '"), len, 5, QSP_FALSE); temp = qspReplaceText(qspCurActions[i].Desc, QSP_FMT("'"), QSP_FMT("''")); len = qspAddText(&res, temp, len, -1, QSP_FALSE); free(temp); if (qspCurActions[i].Image) { len = qspAddText(&res, QSP_FMT("','"), len, 3, QSP_FALSE); temp = qspReplaceText(qspCurActions[i].Image + qspQstPathLen, QSP_FMT("'"), QSP_FMT("''")); len = qspAddText(&res, temp, len, -1, QSP_FALSE); free(temp); } len = qspAddText(&res, QSP_FMT("':"), len, 2, QSP_FALSE); count = qspCurActions[i].OnPressLinesCount; if (count == 1 && qspIsAnyString(qspCurActions[i].OnPressLines->Str)) len = qspAddText(&res, qspCurActions[i].OnPressLines->Str, len, -1, QSP_FALSE); else { if (count >= 2) { len = qspAddText(&res, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE); temp = qspJoinPrepLines(qspCurActions[i].OnPressLines, count, QSP_STRSDELIM); len = qspAddText(&res, temp, len, -1, QSP_FALSE); free(temp); } len = qspAddText(&res, QSP_STRSDELIM QSP_FMT("END"), len, QSP_LEN(QSP_STRSDELIM) + 3, QSP_FALSE); } len = qspAddText(&res, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE); } return res; }
static void qspRemoveObject(int index) { QSPVariant name; if (index < 0 || index >= qspCurObjectsCount) return; if (qspCurSelObject >= index) qspCurSelObject = -1; name.IsStr = QSP_TRUE; QSP_STR(name) = qspCurObjects[index].Desc; if (qspCurObjects[index].Image) free(qspCurObjects[index].Image); --qspCurObjectsCount; while (index < qspCurObjectsCount) { qspCurObjects[index] = qspCurObjects[index + 1]; ++index; } qspIsObjectsChanged = QSP_TRUE; qspExecLocByVarNameWithArgs(QSP_FMT("ONOBJDEL"), &name, 1); free(QSP_STR(name)); }
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; }
QSP_CHAR *qspCallInputBox(QSP_CHAR *text) { /* «десь вводим текст */ QSPCallState state; QSP_CHAR *buffer; int maxLen = 511; if (qspCallBacks[QSP_CALL_INPUTBOX]) { qspSaveCallState(&state, QSP_TRUE, QSP_FALSE); buffer = (QSP_CHAR *)malloc((maxLen + 1) * sizeof(QSP_CHAR)); *buffer = 0; qspCallBacks[QSP_CALL_INPUTBOX](text, buffer, maxLen); buffer[maxLen] = 0; qspRestoreCallState(&state); } else buffer = qspGetNewText(QSP_FMT(""), 0); return buffer; }
QSP_CHAR *qspCallPlayerInfo(QSP_CHAR *text) { /* «десь получаем строку по заданному параметру */ QSPCallState state; QSP_CHAR *buffer; int maxLen = 511; if (qspCallBacks[QSP_CALL_PLAYERINFO]) { qspSaveCallState(&state, QSP_TRUE, QSP_FALSE); buffer = (QSP_CHAR *)malloc((maxLen + 1) * sizeof(QSP_CHAR)); *buffer = 0; qspCallBacks[QSP_CALL_PLAYERINFO](text, buffer, maxLen); buffer[maxLen] = 0; qspRestoreCallState(&state); } else buffer = qspGetNewText(QSP_FMT(""), 0); return buffer; }
void qspClearObjectsWithNotify() { QSPVariant v; QSP_CHAR **objs; int i, oldRefreshCount, oldCount = qspCurObjectsCount; if (oldCount) { objs = (QSP_CHAR **)malloc(oldCount * sizeof(QSP_CHAR *)); for (i = 0; i < oldCount; ++i) qspAddText(objs + i, qspCurObjects[i].Desc, 0, -1, QSP_TRUE); qspClearObjects(QSP_FALSE); v.IsStr = QSP_TRUE; oldRefreshCount = qspRefreshCount; for (i = 0; i < oldCount; ++i) { QSP_STR(v) = objs[i]; qspExecLocByVarNameWithArgs(QSP_FMT("ONOBJDEL"), &v, 1); if (qspRefreshCount != oldRefreshCount || qspErrorNum) break; } qspFreeStrs(objs, oldCount); } }
QSPString qspGetAllActionsAsCode() { int count, i; QSPString res, temp; res = qspNewEmptyString(); for (i = 0; i < qspCurActionsCount; ++i) { qspAddText(&res, QSP_STATIC_STR(QSP_FMT("ACT '")), QSP_FALSE); temp = qspReplaceText(qspCurActions[i].Desc, QSP_STATIC_STR(QSP_FMT("'")), QSP_STATIC_STR(QSP_FMT("''"))); qspAddText(&res, temp, QSP_FALSE); qspFreeString(temp); if (qspCurActions[i].Image.Str) { qspAddText(&res, QSP_STATIC_STR(QSP_FMT("','")), QSP_FALSE); temp = qspReplaceText( qspStringFromPair(qspCurActions[i].Image.Str + qspStrLen(qspQstPath), qspCurActions[i].Image.End), QSP_STATIC_STR(QSP_FMT("'")), QSP_STATIC_STR(QSP_FMT("''"))); qspAddText(&res, temp, QSP_FALSE); qspFreeString(temp); } qspAddText(&res, QSP_STATIC_STR(QSP_FMT("':")), QSP_FALSE); count = qspCurActions[i].OnPressLinesCount; if (count == 1 && qspIsAnyString(qspCurActions[i].OnPressLines->Str)) qspAddText(&res, qspCurActions[i].OnPressLines->Str, QSP_FALSE); else { if (count >= 2) { qspAddText(&res, QSP_STATIC_STR(QSP_STRSDELIM), QSP_FALSE); temp = qspJoinPrepLines(qspCurActions[i].OnPressLines, count, QSP_STATIC_STR(QSP_STRSDELIM)); qspAddText(&res, temp, QSP_FALSE); qspFreeString(temp); } qspAddText(&res, QSP_STATIC_STR(QSP_STRSDELIM QSP_FMT("END")), QSP_FALSE); } qspAddText(&res, QSP_STATIC_STR(QSP_STRSDELIM), QSP_FALSE); } return res; }
QSPString qspGetErrorDesc(int errorNum) { QSPString str; switch (errorNum) { case QSP_ERR_DIVBYZERO: str = QSP_STATIC_STR(QSP_FMT("Division by zero!")); break; case QSP_ERR_TYPEMISMATCH: str = QSP_STATIC_STR(QSP_FMT("Type mismatch!")); break; case QSP_ERR_STACKOVERFLOW: str = QSP_STATIC_STR(QSP_FMT("Stack overflow!")); break; case QSP_ERR_TOOMANYITEMS: str = QSP_STATIC_STR(QSP_FMT("Too many items in expression!")); break; case QSP_ERR_FILENOTFOUND: str = QSP_STATIC_STR(QSP_FMT("File not found!")); break; case QSP_ERR_CANTLOADFILE: str = QSP_STATIC_STR(QSP_FMT("Can't load file!")); break; case QSP_ERR_GAMENOTLOADED: str = QSP_STATIC_STR(QSP_FMT("Game not loaded!")); break; case QSP_ERR_COLONNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Sign [:] not found!")); break; case QSP_ERR_CANTINCFILE: str = QSP_STATIC_STR(QSP_FMT("Can't add file!")); break; case QSP_ERR_CANTADDACTION: str = QSP_STATIC_STR(QSP_FMT("Can't add action!")); break; case QSP_ERR_EQNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Sign [=] not found!")); break; case QSP_ERR_LOCNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Location not found!")); break; case QSP_ERR_ENDNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("[end] not found!")); break; case QSP_ERR_LABELNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Label not found!")); break; case QSP_ERR_NOTCORRECTNAME: str = QSP_STATIC_STR(QSP_FMT("Incorrect variable's name!")); break; case QSP_ERR_QUOTNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Quote not found!")); break; case QSP_ERR_BRACKNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Bracket not found!")); break; case QSP_ERR_BRACKSNOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Brackets not found!")); break; case QSP_ERR_SYNTAX: str = QSP_STATIC_STR(QSP_FMT("Syntax error!")); break; case QSP_ERR_UNKNOWNACTION: str = QSP_STATIC_STR(QSP_FMT("Unknown action!")); break; case QSP_ERR_ARGSCOUNT: str = QSP_STATIC_STR(QSP_FMT("Incorrect arguments' count!")); break; case QSP_ERR_CANTADDOBJECT: str = QSP_STATIC_STR(QSP_FMT("Can't add object!")); break; case QSP_ERR_CANTADDMENUITEM: str = QSP_STATIC_STR(QSP_FMT("Can't add menu's item!")); break; case QSP_ERR_TOOMANYVARS: str = QSP_STATIC_STR(QSP_FMT("Too many variables!")); break; case QSP_ERR_INCORRECTREGEXP: str = QSP_STATIC_STR(QSP_FMT("Regular expression's error!")); break; case QSP_ERR_CODENOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Code not found!")); break; case QSP_ERR_LOOPWHILENOTFOUND: str = QSP_STATIC_STR(QSP_FMT("Loop condition not found!")); break; default: str = QSP_STATIC_STR(QSP_FMT("Unknown error!")); break; } return str; }
QSP_BOOL qspIsDigit(QSP_CHAR ch) { return (ch >= QSP_FMT('0') && ch <= QSP_FMT('9')); }
/* Дата и время компиляции */ void QSPGetCompiledDateTime(const QSP_CHAR* *res) { *res = QSP_FMT(__DATE__) QSP_FMT(", ") QSP_FMT(__TIME__); }