dvander@371: /** ds@653: * vim: set ts=4 : dvander@371: * ================================================================ dvander@371: * SourcePawn (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@371: * ================================================================ dvander@371: * dvander@371: * This file is not open source and may not be copied without explicit dvander@371: * written permission of AlliedModders LLC. This file may not be redistributed dvander@371: * in whole or significant part. dvander@371: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@371: * dvander@371: * Version: $Id$ dvander@371: */ dvander@371: dvander@327: #ifndef _INCLUDE_SOURCEMOD_BASEFUNCTION_H_ dvander@327: #define _INCLUDE_SOURCEMOD_BASEFUNCTION_H_ dvander@327: dvander@327: #include "sm_globals.h" dvander@327: dvander@327: struct ParamInfo dvander@327: { dvander@327: int flags; /* Copy-back flags */ dvander@327: bool marked; /* Whether this is marked as being used */ dvander@327: cell_t local_addr; /* Local address to free */ dvander@327: cell_t *phys_addr; /* Physical address of our copy */ dvander@327: cell_t *orig_addr; /* Original address to copy back to */ dvander@327: ucell_t size; /* Size of array in bytes */ dvander@589: struct dvander@589: { dvander@589: bool is_sz; /* is a string */ dvander@589: int sz_flags; /* has sz flags */ dvander@589: } str; dvander@327: }; dvander@327: dvander@327: class CPlugin; dvander@327: dvander@327: class CFunction : public IPluginFunction dvander@327: { dvander@327: friend class SourcePawnEngine; dvander@327: public: dvander@348: CFunction(uint32_t code_addr, IPluginContext *pContext); dvander@327: public: dvander@327: virtual int PushCell(cell_t cell); ds@585: virtual int PushCellByRef(cell_t *cell, int flags); dvander@327: virtual int PushFloat(float number); ds@585: virtual int PushFloatByRef(float *number, int flags); dvander@589: virtual int PushArray(cell_t *inarray, unsigned int cells, int copyback); dvander@327: virtual int PushString(const char *string); dvander@327: virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags); dvander@327: virtual int Execute(cell_t *result); dvander@327: virtual void Cancel(); dvander@327: virtual int CallFunction(const cell_t *params, unsigned int num_params, cell_t *result); dvander@327: virtual IPluginContext *GetParentContext(); dvander@502: inline bool IsInvalidated() dvander@502: { dvander@502: return m_Invalid; dvander@502: } dvander@502: inline void Invalidate() dvander@502: { dvander@502: m_Invalid = true; dvander@502: } dvander@525: bool IsRunnable(); dvander@327: public: dvander@348: void Set(uint32_t code_addr, IPluginContext *plugin); dvander@327: private: dvander@327: int _PushString(const char *string, int sz_flags, int cp_flags, size_t len); dvander@327: inline int SetError(int err) dvander@327: { dvander@327: m_errorstate = err; dvander@327: return err; dvander@327: } dvander@327: private: dvander@348: uint32_t m_codeaddr; dvander@327: IPluginContext *m_pContext; dvander@525: sp_context_t *m_pCtx; dvander@327: cell_t m_params[SP_MAX_EXEC_PARAMS]; dvander@327: ParamInfo m_info[SP_MAX_EXEC_PARAMS]; dvander@327: unsigned int m_curparam; dvander@327: int m_errorstate; dvander@327: CFunction *m_pNext; dvander@502: bool m_Invalid; dvander@327: }; dvander@327: dvander@327: #endif //_INCLUDE_SOURCEMOD_BASEFUNCTION_H_