#ifndef _KVI_KVS_SCRIPT_H_ #define _KVI_KVS_SCRIPT_H_ //============================================================================= // // File : kvi_kvs_script.h // Creation date : Thu 25 Sep 2003 05.12 CEST by Szymon Stefanek // // This file is part of the KVirc irc client distribution // Copyright (C) 2003 Szymon Stefanek (pragma at kvirc dot net) // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your opinion) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include "kvi_settings.h" #include "kvi_qstring.h" #include "kvi_window.h" #include "kvi_pointerlist.h" #include "kvi_kvs_variant.h" #include "kvi_kvs_variantlist.h" #include "kvi_heapobject.h" class KviKvsTreeNodeInstruction; class KviKvsExtendedRunTimeData; class KviKvsScriptData; class KviKvsReport; class KviKvsRunTimeContext; // X defines this stuff: ugly :/ #ifdef Error #undef Error #endif #ifdef Success #undef Success #endif class KVIRC_API KviKvsScript : public KviHeapObject { friend class KviKvsObject; friend class KviKvsParser; friend class KviKvsRunTimeContext; public: enum RunStatus { // the script returned an error Error = 0, // the script ran succesfully Success = 1, // the script ran succesfully and halt was encountered HaltEncountered = 2 }; enum ScriptType { // the most common script type: a sequence of instructions InstructionList, // an expression to be evaluated as in a $() call (pRetVal should be always set!) Expression, // a parameter to be evaluated (pRetVal should be always set!) Parameter }; protected: // the name parameter is the name of the script context! KviKvsScript(const TQString &szName,const TQString &szBuffer,KviKvsTreeNodeInstruction * pPreparsedTree,ScriptType eType = InstructionList); public: // shallow copy of the script data // useful when a script can be destroyed while running (like in timers) KviKvsScript(const KviKvsScript &src); KviKvsScript(const TQString &szName,const TQString &szBuffer,ScriptType eType=InstructionList); ~KviKvsScript(); private: KviKvsScriptData * m_pData; public: const TQString & name() const; const TQString & code() const; bool locked() const; void setName(const TQString &szName); enum RunFlags { // do not delete the eventual parameters passed (only execute() and run()) PreserveParams = 1, // assume that the variables are local unless explicitly declared (flag used only for parse()) AssumeLocals = 2, // FIXME: This should be a global option, eventually // be more pedantic: spit more warnings and sometimes more errors Pedantic = 4, // FIXME: This should be a global option, eventually // don't print any errors Quiet = 8 }; // returns 0 (KviKvsScript::RunFailure) on error // returns a nonzero combination of RunStatus flags on success int run(KviWindow * pWnd, // window that the command has to be bound to KviKvsVariantList * pParams = 0, // parameter list (0 if you don't pass params) ownership transferred if PreserverParams is not used KviKvsVariant * pRetVal = 0, // return value buffer (0 if you ignore it) int iRunFlags = 0, // a combination of run flags (usually default) KviKvsExtendedRunTimeData * pExtData = 0); // extended data (usually 0) (if you need to pass extended scope variables or alias switch lists...) // returns 0 (KviKvsScript::RunFailure) on error // returns a nonzero combination of RunStatus flags on success // this is probably used only in /eval int run(KviKvsRunTimeContext * pContext,int iRunFlags = 0); // same as run above, but gets a TQString parameter as return buffer // this is probably useful only for evaluating InstructionList scripts int run(KviWindow * pWnd, KviKvsVariantList * pParams, TQString &szRetVal, int iRunFlags = 0, KviKvsExtendedRunTimeData * pExtData = 0); // static helpers for quick running // returns a combination of RunStatus flags (nonzero on no error) // does NOT take params ownership static int run(const TQString &szCode,KviWindow * pWindow,KviKvsVariantList * pParams = 0,KviKvsVariant * pRetVal = 0); // static helper for quick evaluating parameters // returns a combination of RunStatus flags (nonzero on no error) // does NOT take params ownership // pRetVal CAN'T be zero here since we're evaluating stuff here static int evaluate(const TQString &szCode,KviWindow * pWindow,KviKvsVariantList * pParams,KviKvsVariant * pRetVal); static int evaluateAsString(const TQString &szCode,KviWindow * pWindow,KviKvsVariantList * pParams,TQString &szRetVal); public: void dump(const char * prefix); protected: // returns true after a succesfull parsing // pOutput is useful only for printing errors // if 0 , no errors are printed bool parse(KviWindow * pOutput = 0, int iRunFlags = 0); // returns 0 (KviKvsScript::RunFailure) on error // returns a nonzero combination of RunStatus flags on success int execute(KviWindow * pWnd, KviKvsVariantList * pParams = 0, KviKvsVariant * pRetVal = 0, int iRunFlags = 0, KviKvsExtendedRunTimeData * pExtData = 0); // returns 0 (KviKvsScript::RunFailure) on error // returns a nonzero combination of RunStatus flags on success int executeInternal(KviKvsRunTimeContext * pContext); const TQChar * buffer() const; // detaches this script from any other shallow copies void detach(); }; #endif //!_KVI_KVS_SCRIPT_H_