added ability to use NULL_STRING in KeyValues natives

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401006
This commit is contained in:
David Anderson 2007-06-22 14:59:26 +00:00
parent 102fa64a77
commit 3e88c91ad2
6 changed files with 59 additions and 21 deletions

View File

@ -92,7 +92,7 @@ static cell_t smn_KvSetString(IPluginContext *pCtx, const cell_t *params)
} }
char *key, *value; char *key, *value;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
pCtx->LocalToString(params[3], &value); pCtx->LocalToString(params[3], &value);
pStk->pCurRoot.front()->SetString(key, value); pStk->pCurRoot.front()->SetString(key, value);
@ -117,7 +117,7 @@ static cell_t smn_KvSetNum(IPluginContext *pCtx, const cell_t *params)
} }
char *key; char *key;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
pStk->pCurRoot.front()->SetInt(key, params[3]); pStk->pCurRoot.front()->SetInt(key, params[3]);
@ -143,7 +143,7 @@ static cell_t smn_KvSetUInt64(IPluginContext *pCtx, const cell_t *params)
char *key; char *key;
cell_t *addr; cell_t *addr;
uint64 value; uint64 value;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
pCtx->LocalToPhysAddr(params[3], &addr); pCtx->LocalToPhysAddr(params[3], &addr);
value = static_cast<uint64>(*addr); value = static_cast<uint64>(*addr);
@ -169,7 +169,7 @@ static cell_t smn_KvSetFloat(IPluginContext *pCtx, const cell_t *params)
} }
char *key; char *key;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
pStk->pCurRoot.front()->SetFloat(key, sp_ctof(params[3])); pStk->pCurRoot.front()->SetFloat(key, sp_ctof(params[3]));
@ -193,7 +193,7 @@ static cell_t smn_KvSetColor(IPluginContext *pCtx, const cell_t *params)
} }
char *key; char *key;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
Color color(params[3], params[4], params[5], params[6]); Color color(params[3], params[4], params[5], params[6]);
pStk->pCurRoot.front()->SetColor(key, color); pStk->pCurRoot.front()->SetColor(key, color);
@ -219,7 +219,7 @@ static cell_t smn_KvGetString(IPluginContext *pCtx, const cell_t *params)
const char *value; const char *value;
char *key, *defvalue; char *key, *defvalue;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
pCtx->LocalToString(params[5], &defvalue); pCtx->LocalToString(params[5], &defvalue);
value = pStk->pCurRoot.front()->GetString(key, defvalue); value = pStk->pCurRoot.front()->GetString(key, defvalue);
@ -246,7 +246,7 @@ static cell_t smn_KvGetNum(IPluginContext *pCtx, const cell_t *params)
int value; int value;
char *key; char *key;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
value = pStk->pCurRoot.front()->GetInt(key, params[3]); value = pStk->pCurRoot.front()->GetInt(key, params[3]);
@ -271,7 +271,7 @@ static cell_t smn_KvGetFloat(IPluginContext *pCtx, const cell_t *params)
float value; float value;
char *key; char *key;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
value = pStk->pCurRoot.front()->GetFloat(key, sp_ctof(params[3])); value = pStk->pCurRoot.front()->GetFloat(key, sp_ctof(params[3]));
@ -297,7 +297,7 @@ static cell_t smn_KvGetColor(IPluginContext *pCtx, const cell_t *params)
Color color; Color color;
char *key; char *key;
cell_t *r, *g, *b, *a; cell_t *r, *g, *b, *a;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
pCtx->LocalToPhysAddr(params[3], &r); pCtx->LocalToPhysAddr(params[3], &r);
pCtx->LocalToPhysAddr(params[4], &g); pCtx->LocalToPhysAddr(params[4], &g);
pCtx->LocalToPhysAddr(params[5], &b); pCtx->LocalToPhysAddr(params[5], &b);
@ -331,7 +331,7 @@ static cell_t smn_KvGetUInt64(IPluginContext *pCtx, const cell_t *params)
char *key; char *key;
cell_t *addr, *defvalue; cell_t *addr, *defvalue;
uint64 value; uint64 value;
pCtx->LocalToString(params[2], &key); pCtx->LocalToStringNULL(params[2], &key);
pCtx->LocalToPhysAddr(params[3], &addr); pCtx->LocalToPhysAddr(params[3], &addr);
pCtx->LocalToPhysAddr(params[4], &defvalue); pCtx->LocalToPhysAddr(params[4], &defvalue);

View File

@ -83,6 +83,15 @@ BaseContext::BaseContext(sp_context_t *_ctx)
} else { } else {
m_pNullVec = NULL; m_pNullVec = NULL;
} }
if (FindPubvarByName("NULL_STRING", &index) == SP_ERROR_NONE)
{
sp_pubvar_t *pubvar;
GetPubvarByIndex(index, &pubvar);
m_pNullString = pubvar->offs;
} else {
m_pNullString = NULL;
}
} }
void BaseContext::FlushFunctionCache() void BaseContext::FlushFunctionCache()
@ -992,6 +1001,22 @@ IPluginFunction *BaseContext::GetFunctionByName(const char *public_name)
return pFunc; return pFunc;
} }
int BaseContext::LocalToStringNULL(cell_t local_addr, char **addr)
{
int err;
if ((err = LocalToString(local_addr, addr)) != SP_ERROR_NONE)
{
return err;
}
if ((cell_t *)*addr == m_pNullString)
{
*addr = NULL;
}
return SP_ERROR_NONE;
}
#if defined SOURCEMOD_BUILD #if defined SOURCEMOD_BUILD
SourceMod::IdentityToken_t *BaseContext::GetIdentity() SourceMod::IdentityToken_t *BaseContext::GetIdentity()
{ {

View File

@ -70,6 +70,7 @@ namespace SourcePawn
SourceMod::IdentityToken_t *GetIdentity(); SourceMod::IdentityToken_t *GetIdentity();
void SetIdentity(SourceMod::IdentityToken_t *token); void SetIdentity(SourceMod::IdentityToken_t *token);
cell_t *GetNullRef(SP_NULL_TYPE type); cell_t *GetNullRef(SP_NULL_TYPE type);
int LocalToStringNULL(cell_t local_addr, char **addr);
#endif #endif
public: //IPluginDebugInfo public: //IPluginDebugInfo
int LookupFile(ucell_t addr, const char **filename); int LookupFile(ucell_t addr, const char **filename);
@ -86,6 +87,7 @@ namespace SourcePawn
#if defined SOURCEMOD_BUILD #if defined SOURCEMOD_BUILD
SourceMod::IdentityToken_t *m_pToken; SourceMod::IdentityToken_t *m_pToken;
cell_t *m_pNullVec; cell_t *m_pNullVec;
cell_t *m_pNullString;
#endif #endif
char m_MsgCache[1024]; char m_MsgCache[1024];
bool m_CustomMsg; bool m_CustomMsg;

View File

@ -91,7 +91,8 @@ struct Extension
bool:required, /**< Whether or not to require */ bool:required, /**< Whether or not to require */
}; };
public Float:NULL_VECTOR[3]; /**< Pass this into certain functions to act as a C++ NULL */ public Float:NULL_VECTOR[3]; /**< Pass this into certain functions to act as a C++ NULL */
public const String:NULL_STRING[1]; /**< pass this into certain functions to act as a C++ NULL */
#define AUTOLOAD_EXTENSIONS #define AUTOLOAD_EXTENSIONS
#define REQUIRE_EXTENSIONS #define REQUIRE_EXTENSIONS

View File

@ -49,7 +49,7 @@ native Handle:CreateKeyValues(const String:name[], const String:firstkey[]="", c
* Sets a string value of a KeyValues key. * Sets a string value of a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param value String value. * @param value String value.
* @noreturn * @noreturn
* @error Invalid Handle. * @error Invalid Handle.
@ -60,7 +60,7 @@ native KvSetString(Handle:kv, const String:key[], const String:value[]);
* Sets an integer value of a KeyValues key. * Sets an integer value of a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param value Value number. * @param value Value number.
* @noreturn * @noreturn
* @error Invalid Handle. * @error Invalid Handle.
@ -71,7 +71,7 @@ native KvSetNum(Handle:kv, const String:key[], value);
* Sets a large integer value of a KeyValues key. * Sets a large integer value of a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param value Large integer value (0=High bits, 1=Low bits) * @param value Large integer value (0=High bits, 1=Low bits)
* @noreturn * @noreturn
* @error Invalid Handle. * @error Invalid Handle.
@ -82,7 +82,7 @@ native KvSetUInt64(Handle:kv, const String:key[], const value[2]);
* Sets a floating point value of a KeyValues key. * Sets a floating point value of a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param value Floating point value. * @param value Floating point value.
* @noreturn * @noreturn
* @error Invalid Handle. * @error Invalid Handle.
@ -93,7 +93,7 @@ native KvSetFloat(Handle:kv, const String:key[], Float:value);
* Sets a set of color values of a KeyValues key. * Sets a set of color values of a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param r Red value. * @param r Red value.
* @param g Green value. * @param g Green value.
* @param b Blue value. * @param b Blue value.
@ -107,7 +107,7 @@ native KvSetColor(Handle:kv, const String:key[], r, g, b, a=0);
* Retrieves a string value from a KeyValues key. * Retrieves a string value from a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param value Buffer to store key value in. * @param value Buffer to store key value in.
* @param maxlength Maximum length of the value buffer. * @param maxlength Maximum length of the value buffer.
* @param defvalue Optional default value to use if the key is not found. * @param defvalue Optional default value to use if the key is not found.
@ -120,7 +120,7 @@ native KvGetString(Handle:kv, const String:key[], String:value[], maxlength, con
* Retrieves an integer value from a KeyValues key. * Retrieves an integer value from a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param defvalue Optional default value to use if the key is not found. * @param defvalue Optional default value to use if the key is not found.
* @return Integer value of the key. * @return Integer value of the key.
* @error Invalid Handle. * @error Invalid Handle.
@ -131,7 +131,7 @@ native KvGetNum(Handle:kv, const String:key[], defvalue=0);
* Retrieves a floating point value from a KeyValues key. * Retrieves a floating point value from a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param defvalue Optional default value to use if the key is not found. * @param defvalue Optional default value to use if the key is not found.
* @return Floating point value of the key. * @return Floating point value of the key.
* @error Invalid Handle. * @error Invalid Handle.
@ -142,7 +142,7 @@ native Float:KvGetFloat(Handle:kv, const String:key[], Float:defvalue=0.0);
* Retrieves a set of color values from a KeyValues key. * Retrieves a set of color values from a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param r Red value, set by reference. * @param r Red value, set by reference.
* @param g Green value, set by reference. * @param g Green value, set by reference.
* @param b Blue value, set by reference. * @param b Blue value, set by reference.
@ -156,7 +156,7 @@ native KvGetColor(Handle:kv, const String:key[], &r, &g, &b, &a);
* Retrieves a large integer value from a KeyValues key. * Retrieves a large integer value from a KeyValues key.
* *
* @param kv KeyValues Handle. * @param kv KeyValues Handle.
* @param key Name of the key. * @param key Name of the key, or NULL_STRING.
* @param value Array to represent the large integer. * @param value Array to represent the large integer.
* @param defvalue Optional default value to use if the key is not found. * @param defvalue Optional default value to use if the key is not found.
* @noreturn * @noreturn

View File

@ -56,6 +56,7 @@ namespace SourcePawn
enum SP_NULL_TYPE enum SP_NULL_TYPE
{ {
SP_NULL_VECTOR = 0, /**< Float[3] reference */ SP_NULL_VECTOR = 0, /**< Float[3] reference */
SP_NULL_STRING = 1, /**< const String[1] reference */
}; };
#endif #endif
@ -555,6 +556,15 @@ namespace SourcePawn
* @return cell_t address to compare to. * @return cell_t address to compare to.
*/ */
virtual cell_t *GetNullRef(SP_NULL_TYPE type) =0; virtual cell_t *GetNullRef(SP_NULL_TYPE type) =0;
/**
* @brief Converts a local address to a physical string, and allows
* for NULL_STRING to be set.
*
* @param local_addr Local address in plugin.
* @param addr Destination output pointer.
*/
virtual int LocalToStringNULL(cell_t local_addr, char **addr) =0;
#endif #endif
}; };