core/systems/ForwardSys.h
author Borja Ferrer <faluco@alliedmods.net>
Wed Dec 06 14:52:11 2006 +0000 (2006-12-06)
changeset 192 dee91851dcd4
parent 186 eebc5de63141
child 211 4c77142eaf36
permissions -rw-r--r--
rewritten PushStringEx in Forward and Function systems
fixed PushCellByRef and PushFloatByRef in the varargs case where it wouldn't set the pushed type
fixed the BindNatives functions not setting the BOUND flag thus making the JIT not exec the natives
done the rest of tests with forwards, only left to do string varargs
dvander@180
     1
#ifndef _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
     2
#define _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
     3
dvander@180
     4
#include <IForwardSys.h>
dvander@180
     5
#include <IPluginSys.h>
dvander@180
     6
#include "sm_globals.h"
dvander@180
     7
#include <sh_list.h>
dvander@180
     8
#include <sh_stack.h>
dvander@180
     9
dvander@180
    10
using namespace SourceHook;
dvander@180
    11
dvander@180
    12
typedef List<IPluginFunction *>::iterator FuncIter;
dvander@180
    13
dvander@180
    14
//:TODO: a global name max define for sourcepawn, should mirror compiler's sNAMEMAX
dvander@180
    15
#define FORWARDS_NAME_MAX		64
dvander@180
    16
dvander@183
    17
struct ByrefInfo
dvander@180
    18
{
dvander@183
    19
	unsigned int cells;
dvander@183
    20
	cell_t *orig_addr;
dvander@183
    21
	int flags;
faluco@192
    22
	int sz_flags;
dvander@180
    23
};
dvander@180
    24
dvander@183
    25
struct FwdParamInfo
dvander@183
    26
{
dvander@183
    27
	cell_t val;
dvander@183
    28
	ByrefInfo byref;
dvander@183
    29
	ParamType pushedas;
dvander@183
    30
};
dvander@183
    31
dvander@183
    32
class CForward : public IChangeableForward
dvander@180
    33
{
dvander@180
    34
public: //ICallable
dvander@180
    35
	virtual int PushCell(cell_t cell);
dvander@180
    36
	virtual int PushCellByRef(cell_t *cell, int flags);
dvander@180
    37
	virtual int PushFloat(float number);
dvander@180
    38
	virtual int PushFloatByRef(float *number, int flags);
dvander@180
    39
	virtual int PushArray(cell_t *inarray, unsigned int cells, cell_t **phys_addr, int flags);
dvander@180
    40
	virtual int PushString(const char *string);
faluco@192
    41
	virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags);
dvander@180
    42
	virtual void Cancel();
dvander@180
    43
public: //IForward
dvander@180
    44
	virtual const char *GetForwardName();
dvander@180
    45
	virtual unsigned int GetFunctionCount();
dvander@180
    46
	virtual ExecType GetExecType();
dvander@180
    47
	virtual int Execute(cell_t *result, IForwardFilter *filter);
dvander@180
    48
public: //IChangeableForward
dvander@180
    49
	virtual bool RemoveFunction(IPluginFunction *func);
dvander@180
    50
	virtual unsigned int RemoveFunctionsOfPlugin(IPlugin *plugin);
dvander@180
    51
	virtual bool AddFunction(IPluginFunction *func);
dvander@180
    52
	virtual bool AddFunction(sp_context_t *ctx, funcid_t index);
dvander@180
    53
public:
dvander@180
    54
	static CForward *CreateForward(const char *name, 
dvander@180
    55
								   ExecType et, 
dvander@180
    56
								   unsigned int num_params, 
dvander@180
    57
								   ParamType *types, 
dvander@180
    58
								   va_list ap);
dvander@180
    59
private:
dvander@180
    60
	void _Int_PushArray(cell_t *inarray, unsigned int cells, int flags);
faluco@192
    61
	void _Int_PushString(cell_t *inarray, unsigned int cells, int sz_flags, int cp_flags);
dvander@180
    62
	inline int SetError(int err)
dvander@180
    63
	{
dvander@180
    64
		m_errstate = err;
dvander@180
    65
		return err;
dvander@180
    66
	}
dvander@180
    67
protected:
dvander@180
    68
	/* :TODO: I want a caching list type here.
dvander@180
    69
	 * Destroying these things and using new/delete for their members feels bad.
dvander@180
    70
	 */
dvander@180
    71
	List<IPluginFunction *> m_functions;
dvander@180
    72
dvander@180
    73
	/* Type and name information */
dvander@183
    74
	FwdParamInfo m_params[SP_MAX_EXEC_PARAMS];
dvander@180
    75
	ParamType m_types[SP_MAX_EXEC_PARAMS];
dvander@180
    76
	char m_name[FORWARDS_NAME_MAX+1];
dvander@180
    77
	unsigned int m_numparams;
dvander@183
    78
	unsigned int m_varargs;
dvander@180
    79
	ExecType m_ExecType;
dvander@180
    80
dvander@180
    81
	/* State information */
dvander@180
    82
	unsigned int m_curparam;
dvander@180
    83
	int m_errstate;
dvander@180
    84
};
dvander@180
    85
dvander@186
    86
class CForwardManager : public IForwardManager
dvander@186
    87
{
dvander@186
    88
	friend class CForward;
dvander@186
    89
public:
dvander@186
    90
	virtual IForward *CreateForward(const char *name, 
dvander@186
    91
		ExecType et, 
dvander@186
    92
		unsigned int num_params, 
dvander@186
    93
		ParamType *types, 
dvander@186
    94
		...);
dvander@186
    95
	virtual IChangeableForward *CreateForwardEx(const char *name, 
dvander@186
    96
		ExecType et, 
dvander@186
    97
		int num_params, 
dvander@186
    98
		ParamType *types, 
dvander@186
    99
		...);
dvander@186
   100
	virtual IForward *FindForward(const char *name, IChangeableForward **ifchng);
dvander@186
   101
	virtual void ReleaseForward(IForward *forward);
dvander@186
   102
protected:
dvander@186
   103
	CForward *ForwardMake();
dvander@186
   104
	void ForwardFree(CForward *fwd);
dvander@186
   105
private:
dvander@186
   106
	CStack<CForward *> m_FreeForwards;
dvander@186
   107
	List<CForward *> m_managed;
dvander@186
   108
	List<CForward *> m_unmanaged;
dvander@186
   109
};
dvander@186
   110
dvander@186
   111
extern CForwardManager g_Forwards;
dvander@186
   112
dvander@180
   113
#endif //_INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_