plugins/include/functions.inc
author David Anderson <dvander@alliedmods.net>
Mon Mar 12 07:08:05 2007 +0000 (2007-03-12)
changeset 601 fe5b368fcedc
child 621 5a0f5014aac1
permissions -rw-r--r--
initial import of dynamic native code for both the JIT and plugins
note: dependency resolution is not done yet!
dvander@601
     1
/**
dvander@601
     2
 * vim: set ts=4 :
dvander@601
     3
 * ===============================================================
dvander@601
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@601
     5
 * ===============================================================
dvander@601
     6
 *
dvander@601
     7
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
dvander@601
     8
 * or modified under the Terms and Conditions of its License Agreement, which is found 
dvander@601
     9
 * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
dvander@601
    10
 * may change at any time.  To view the latest information, see:
dvander@601
    11
 *   http://www.sourcemod.net/license.php
dvander@601
    12
 *
dvander@601
    13
 * Version: $Id$
dvander@601
    14
 */
dvander@601
    15
 
dvander@601
    16
#define SP_ERROR_NONE					0	/**< No error occurred */
dvander@601
    17
#define SP_ERROR_FILE_FORMAT			1	/**< File format unrecognized */
dvander@601
    18
#define SP_ERROR_DECOMPRESSOR			2	/**< A decompressor was not found */
dvander@601
    19
#define SP_ERROR_HEAPLOW				3	/**< Not enough space left on the heap */
dvander@601
    20
#define SP_ERROR_PARAM					4	/**< Invalid parameter or parameter type */
dvander@601
    21
#define SP_ERROR_INVALID_ADDRESS		5	/**< A memory address was not valid */
dvander@601
    22
#define SP_ERROR_NOT_FOUND				6	/**< The object in question was not found */
dvander@601
    23
#define SP_ERROR_INDEX					7	/**< Invalid index parameter */
dvander@601
    24
#define SP_ERROR_STACKLOW				8	/**< Nnot enough space left on the stack */
dvander@601
    25
#define SP_ERROR_NOTDEBUGGING			9	/**< Debug mode was not on or debug section not found */
dvander@601
    26
#define SP_ERROR_INVALID_INSTRUCTION	10	/**< Invalid instruction was encountered */
dvander@601
    27
#define SP_ERROR_MEMACCESS				11	/**< Invalid memory access */
dvander@601
    28
#define SP_ERROR_STACKMIN				12	/**< Stack went beyond its minimum value */
dvander@601
    29
#define SP_ERROR_HEAPMIN				13  /**< Heap went beyond its minimum value */
dvander@601
    30
#define SP_ERROR_DIVIDE_BY_ZERO			14	/**< Division by zero */
dvander@601
    31
#define SP_ERROR_ARRAY_BOUNDS			15	/**< Array index is out of bounds */
dvander@601
    32
#define SP_ERROR_INSTRUCTION_PARAM		16	/**< Instruction had an invalid parameter */
dvander@601
    33
#define SP_ERROR_STACKLEAK				17  /**< A native leaked an item on the stack */
dvander@601
    34
#define SP_ERROR_HEAPLEAK				18  /**< A native leaked an item on the heap */
dvander@601
    35
#define SP_ERROR_ARRAY_TOO_BIG			19	/**< A dynamic array is too big */
dvander@601
    36
#define SP_ERROR_TRACKER_BOUNDS			20	/**< Tracker stack is out of bounds */
dvander@601
    37
#define SP_ERROR_INVALID_NATIVE			21	/**< Native was pending or invalid */
dvander@601
    38
#define SP_ERROR_PARAMS_MAX				22	/**< Maximum number of parameters reached */
dvander@601
    39
#define SP_ERROR_NATIVE					23	/**< Error originates from a native */
dvander@601
    40
#define SP_ERROR_NOT_RUNNABLE			24	/**< Function or plugin is not runnable */
dvander@601
    41
#define SP_ERROR_ABORTED				25	/**< Function call was aborted */
dvander@601
    42
dvander@601
    43
/**
dvander@601
    44
 * Defines a native function.
dvander@601
    45
 *
dvander@601
    46
 * It is not necessary to validate the parameter count 
dvander@601
    47
 *
dvander@601
    48
 * @param plugin			Handle of the calling plugin.
dvander@601
    49
 * @param numParams			Number of parameters passed to the native.
dvander@601
    50
 * @return 					Value for the native call to return.
dvander@601
    51
 */
dvander@601
    52
functag NativeCall public(Handle:plugin, numParams);
dvander@601
    53
dvander@601
    54
/**
dvander@601
    55
 * Creates a dynamic native.  This should only be called in AskPluginLoad(), or 
dvander@601
    56
 * else you risk not having your native shared with other plugins.
dvander@601
    57
 *
dvander@601
    58
 * @param name				Name of the dynamic native; must be unique amongst
dvander@601
    59
 *							all other registered dynamic native.s
dvander@601
    60
 * @param func				Function to use as the dynamic native.
dvander@601
    61
 * @noreturn
dvander@601
    62
 */
dvander@601
    63
native CreateNative(const String:name[], NativeCall:func);
dvander@601
    64
dvander@601
    65
/**
dvander@601
    66
 * Throws an error in the calling plugin of a native, instead of your own plugin.
dvander@601
    67
 *
dvander@601
    68
 * @param error				Error code to use.
dvander@601
    69
 * @param fmt				Error message format.
dvander@601
    70
 * @param ...				Format arguments.
dvander@601
    71
 */
dvander@601
    72
native ThrowNativeError(error, const String:fmt[], {Handle,Float,String,_}:...);
dvander@601
    73
dvander@601
    74
/**
dvander@601
    75
 * Retrieves the string length from a native parameter string.  This is useful 
dvander@601
    76
 * fetching the entire string using dynamic arrays.
dvander@601
    77
 * @note If this function succeeds, Get/SetNativeString will also succeed.
dvander@601
    78
 *
dvander@601
    79
 * @param param				Parameter number, starting from 1.
dvander@601
    80
 * @param length			Stores the length of the string.
dvander@601
    81
 * @return					SP_ERROR_NONE on sucecss, any other integer on failure.
dvander@601
    82
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
    83
 */
dvander@601
    84
native GetNativeStringLength(param, &length);
dvander@601
    85
dvander@601
    86
/**
dvander@601
    87
 * Retrieves a string from a native parameter.
dvander@601
    88
 * @note Output conditions are undefined on failure.
dvander@601
    89
 *
dvander@601
    90
 * @param param				Parameter number, starting from 1.
dvander@601
    91
 * @param buffer			Buffer to store the string in.
dvander@601
    92
 * @param maxlength			Maximum length of the buffer.
dvander@601
    93
 * @param bytes				Optionally store the number of bytes written.
dvander@601
    94
 * @return					SP_ERROR_NONE on success, any other integer on failure.
dvander@601
    95
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
    96
 */
dvander@601
    97
native GetNativeString(param, String:buffer[], maxlength, &bytes=0);
dvander@601
    98
dvander@601
    99
/**
dvander@601
   100
 * Sets a string in a native parameter.
dvander@601
   101
 * @note Output conditions are undefined on failure.
dvander@601
   102
 *
dvander@601
   103
 * @param param				Parameter number, starting from 1.
dvander@601
   104
 * @param source			Source string to use.
dvander@601
   105
 * @param maxlength			Maximum number of bytes to write.
dvander@601
   106
 * @param utf8				If false, string will not be written
dvander@601
   107
 *							with UTF8 safety.
dvander@601
   108
 * @param bytes				Optionally store the number of bytes written.
dvander@601
   109
 * @return					SP_ERROR_NONE on success, any other integer on failure.
dvander@601
   110
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
   111
 */
dvander@601
   112
native SetNativeString(param, const String:source[], maxlength, bool:utf8=true, &bytes=0);
dvander@601
   113
dvander@601
   114
/**
dvander@601
   115
 * Gets a cell from a native parameter.
dvander@601
   116
 *
dvander@601
   117
 * @param param				Parameter number, starting from 1.
dvander@601
   118
 * @return					Cell value at the parameter number.
dvander@601
   119
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
   120
 */
dvander@601
   121
native GetNativeCell(param);
dvander@601
   122
dvander@601
   123
/**
dvander@601
   124
 * Gets a cell from a native parameter, by reference.
dvander@601
   125
 *
dvander@601
   126
 * @param param				Parameter number, starting from 1.
dvander@601
   127
 * @return					Cell value at the parameter number.
dvander@601
   128
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
   129
 */
dvander@601
   130
native GetNativeCellRef(param);
dvander@601
   131
dvander@601
   132
/**
dvander@601
   133
 * Sets a cell from a native parameter, by reference.
dvander@601
   134
 *
dvander@601
   135
 * @param param				Parameter number, starting from 1.
dvander@601
   136
 * @param value				Cell value at the parameter number to set by reference.
dvander@601
   137
 * @noreturn
dvander@601
   138
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
   139
 */
dvander@601
   140
native SetNativeCellRef(param, {Float,Handle,_}:value);
dvander@601
   141
dvander@601
   142
/**
dvander@601
   143
 * Gets an array from a native parameter (always by reference).
dvander@601
   144
 *
dvander@601
   145
 * @param param				Parameter number, starting from 1.
dvander@601
   146
 * @param local				Local array to copy into.
dvander@601
   147
 * @param size				Maximum size of local array.
dvander@601
   148
 * @return					SP_ERROR_NONE on success, anything else on failure.
dvander@601
   149
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
   150
 */
dvander@601
   151
native GetNativeArray(param, {Float,Handle,_}:local[], size);
dvander@601
   152
dvander@601
   153
/**
dvander@601
   154
 * Copies a local array into a native parameter array (always by reference).
dvander@601
   155
 * 
dvander@601
   156
 * @param param				Parameter number, starting from 1.
dvander@601
   157
 * @param local				Local array to copy from.
dvander@601
   158
 * @param size				Size of the local array to copy.
dvander@601
   159
 * @return					SP_ERROR_NONE on success, anything else on failure.
dvander@601
   160
 * @error					Invalid parameter number or calling from a non-native function.
dvander@601
   161
 */
dvander@601
   162
native SetNativeArray(param, const {Float,Handle,_}:local[], size);
dvander@601
   163
dvander@601
   164
/**
dvander@601
   165
 * Formats a string using parameters from a native.
dvander@601
   166
 *
dvander@601
   167
 * @note All parameter indexes start at 1.
dvander@601
   168
 * @note If the input and output buffers overlap, the contents
dvander@601
   169
 *  of the output buffer at the end is undefined.
dvander@601
   170
 *
dvander@601
   171
 * @param out_param			Output parameter number to write to.  If 0, out_string is used.
dvander@601
   172
 * @param fmt_param			Format parameter number.  If 0, fmt_string is used.
dvander@601
   173
 * @param vararg_param		First variable parameter number.
dvander@601
   174
 * @param out_len			Output string buffer maximum length (always required).
dvander@601
   175
 * @param written			Optionally stores the number of bytes written.
dvander@601
   176
 * @param out_string		Output string buffer to use if out_param is not used.
dvander@601
   177
 * @param fmt_string		Format string to use if fmt_param is not used.
dvander@601
   178
 * @return					SP_ERROR_NONE on success, anything else on failure.
dvander@601
   179
 */
dvander@601
   180
native FormatNativeString(out_param, 
dvander@601
   181
						  fmt_param, 
dvander@601
   182
						  vararg_param, 
dvander@601
   183
						  out_len,
dvander@601
   184
						  &written=0,
dvander@601
   185
						  String:out_string[]="",
dvander@601
   186
						  const String:fmt_string[]="");
dvander@601
   187
dvander@601
   188
stock Float:GetNativeFloat(param, bool:byref)
dvander@601
   189
{
dvander@601
   190
	if (!byref)
dvander@601
   191
	{
dvander@601
   192
		return Float:GetNativeCell(param);
dvander@601
   193
	} else {
dvander@601
   194
		return Float:GetNativeCellRef(param);
dvander@601
   195
	}
dvander@601
   196
}
dvander@601
   197
stock Handle:GetNativeHandle(param, bool:byref)
dvander@601
   198
{
dvander@601
   199
	if (!byref)
dvander@601
   200
	{
dvander@601
   201
		return Handle:GetNativeCell(param);
dvander@601
   202
	} else {
dvander@601
   203
		return Handle:GetNativeCellRef(param);
dvander@601
   204
	}
dvander@601
   205
}