Committed new auto-module registering system

require_module is now DEPRECATED
This commit is contained in:
David Anderson 2005-07-15 19:15:58 +00:00
parent 70396a2fc1
commit 3cba7811bd
7 changed files with 73 additions and 72 deletions

View File

@ -57,6 +57,7 @@ struct amxx_module_info_s
const char *author; const char *author;
const char *version; const char *version;
int reload; // reload on mapchange when nonzero int reload; // reload on mapchange when nonzero
const char *logtag; //added in version 2
}; };
@ -65,7 +66,7 @@ struct amxx_module_info_s
#define AMXX_PARAM 2 /* Invalid parameter */ #define AMXX_PARAM 2 /* Invalid parameter */
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */ #define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
#define AMXX_INTERFACE_VERSION 1 #define AMXX_INTERFACE_VERSION 2
class CModule class CModule
{ {

View File

@ -40,6 +40,7 @@
#endif #endif
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <assert.h> #include <assert.h>
#include <limits.h> #include <limits.h>
#include <stdarg.h> #include <stdarg.h>
@ -4139,3 +4140,26 @@ int AMXAPI amx_UTF8Check(const char *string)
return err; return err;
} }
#endif /* AMX_UTF8XXX */ #endif /* AMX_UTF8XXX */
int AMXAPI amx_GetLibraries(AMX *amx)
{
AMX_HEADER *hdr = (AMX_HEADER *)amx->base;
int numLibraries = NUMENTRIES(hdr, libraries, pubvars);
return numLibraries;
}
#ifdef __linux__
#define _snprintf snprintf
#endif
const char *AMXAPI amx_GetLibrary(AMX *amx, int index, char *buffer, int len)
{
AMX_HEADER *hdr = (AMX_HEADER *)amx->base;
AMX_FUNCSTUB *lib;
lib = GETENTRY(hdr, libraries, index);
_snprintf(buffer, len, "%s", GETENTRYNAME(hdr,lib));
return buffer;
}

View File

@ -403,7 +403,10 @@ int AMXAPI amx_StrLen(cell *cstring, int *length);
int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value); int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value);
int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value); int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
int AMXAPI amx_UTF8Check(const char *string); int AMXAPI amx_UTF8Check(const char *string);
void amx_NullNativeTable(AMX *amx); int AMXAPI amx_GetLibraries(AMX *amx);
const char *AMXAPI amx_GetLibrary(AMX *amx, int index, char *buffer, int len);
//no longer used! void amx_NullNativeTable(AMX *amx);
#if !defined AMX_NO_ALIGN #if !defined AMX_NO_ALIGN
#if defined __linux__ #if defined __linux__

View File

@ -2849,14 +2849,6 @@ static cell AMX_NATIVE_CALL lang_exists(AMX *amx, cell *params)
cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params) cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params)
{ {
int len = 0;
String s;
s.assign(get_amxstring(amx, params[1], 0, len));
CurModuleList.push(s);
return 1; return 1;
} }

View File

@ -278,7 +278,6 @@ enum ModuleCallReason
extern ModuleCallReason g_ModuleCallReason; // modules.cpp extern ModuleCallReason g_ModuleCallReason; // modules.cpp
extern CModule *g_CurrentlyCalledModule; // modules.cpp extern CModule *g_CurrentlyCalledModule; // modules.cpp
extern const char *g_LastRequestedFunc; // modules.cpp extern const char *g_LastRequestedFunc; // modules.cpp
extern CQueue<String> CurModuleList;
void Module_CacheFunctions(); void Module_CacheFunctions();
void *Module_ReqFnptr(const char *funcName); // modules.cpp void *Module_ReqFnptr(const char *funcName); // modules.cpp

View File

@ -58,7 +58,6 @@ void (*function)(void*);
void (*endfunction)(void*); void (*endfunction)(void*);
CLog g_log; CLog g_log;
CQueue<String> CurModuleList;
CForwardMngr g_forwards; CForwardMngr g_forwards;
CList<CPlayer*> g_auth; CList<CPlayer*> g_auth;
CList<CCVar> g_cvars; CList<CCVar> g_cvars;
@ -465,11 +464,6 @@ void C_ServerDeactivate_Post() {
g_langMngr.Save(build_pathname_r(file, sizeof(file)-1, "%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data"))); g_langMngr.Save(build_pathname_r(file, sizeof(file)-1, "%s/languages.dat", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
g_langMngr.SaveCache(build_pathname_r(file, sizeof(file)-1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data"))); g_langMngr.SaveCache(build_pathname_r(file, sizeof(file)-1, "%s/dictionary.cache", get_localinfo("amxx_datadir", "addons/amxmodx/data")));
g_langMngr.Clear(); g_langMngr.Clear();
//clear module name cache
while (!CurModuleList.empty())
{
CurModuleList.pop();
}
// last memreport // last memreport
#ifdef MEMORY_TEST #ifdef MEMORY_TEST

View File

@ -253,64 +253,64 @@ const char *StrCaseStr(const char *as, const char *bs)
return strstr(a,b); return strstr(a,b);
} }
//BAILOPAN //returns 0 for module not found, 1 for "everything's okay"
int CheckModules(AMX *amx, char error[64]) int CheckModules(AMX *amx, char error[128])
{ {
int idx = 0, flag = -1; int numLibraries = amx_GetLibraries(amx);
if (amx_FindPublic(amx, "plugin_modules", &idx) == AMX_ERR_NONE) char buffer[32];
bool found = false;
bool isdbi = false;
CList<CModule,const char *>::iterator a;
const amxx_module_info_s *info;
for (int i=0; i<numLibraries; i++)
{ {
cell retVal = 0; amx_GetLibrary(amx, i, buffer, sizeof(buffer)-1);
int err = 0; found = false;
if ( (err = amx_Exec(amx, &retVal, idx, 0)) == AMX_ERR_NONE ) if (strcmpi(buffer, "float")==0)
continue;
isdbi = false;
if (strcmpi(buffer, "dbi")==0)
isdbi = true;
for (a=g_modules.begin(); a; ++a)
{ {
unsigned int i = 0; if ( (*a).getStatusValue() == MODULE_LOADED )
while (!CurModuleList.empty())
{ {
if (!flag) info = (*a).getInfoNew();
if (info)
{ {
CurModuleList.pop(); if (isdbi)
continue;
}
//assume module is not found
flag = 0;
for (CList<CModule,const char *>::iterator pMod = g_modules.begin(); pMod; ++pMod)
{
if (strcmpi(CurModuleList.front().c_str(), "dbi") == 0)
{ {
if (StrCaseStr( (*pMod).getName(), "sql") || strstr( (*pMod).getName(), "dbi" )) if (info->logtag
&& (StrCaseStr(info->logtag, "sql")
||
StrCaseStr(info->logtag, "dbi"))
)
{ {
// the module checks in found = true;
flag = 1;
break; break;
} }
} else { } else {
if (strcmpi( (*pMod).getName(), CurModuleList.front().c_str() ) == 0) if (info->logtag && (strcmpi(info->logtag, buffer) == 0))
{ {
flag = 1; found = true;
break; break;
} }
} }
} }
//module was not found
if (!flag)
{
sprintf(error, "Module \"%s\" required for plugin. Check modules.ini.", CurModuleList.front().c_str());
}
CurModuleList.pop();
} }
} else {
AMXXLOG_Log("[AMXX] Run time error %d on line %ld during module check.", err, amx->curline);
//could not execute
return -1; //bad! very bad!
} }
} else { if (!found)
return -1; {
sprintf(error, "Module \"%s\" required for plugin. Check modules.ini.", buffer);
return 0;
}
} }
return flag; return 1;
} }
int set_amxnatives(AMX* amx,char error[64]) int set_amxnatives(AMX* amx,char error[128])
{ {
for ( CList<CModule,const char *>::iterator a = g_modules.begin(); a ; ++a ) for ( CList<CModule,const char *>::iterator a = g_modules.begin(); a ; ++a )
{ {
@ -327,29 +327,17 @@ int set_amxnatives(AMX* amx,char error[64])
amx_Register(amx, time_Natives, -1); amx_Register(amx, time_Natives, -1);
amx_Register(amx, vault_Natives, -1); amx_Register(amx, vault_Natives, -1);
if ( amx_Register(amx, core_Natives, -1) != AMX_ERR_NONE ) if (CheckModules(amx, error))
{ {
//HACKHACK - if we get here, nullify the plugin's native table if ( amx_Register(amx, core_Natives, -1) != AMX_ERR_NONE )
//then reregister the one native we need
// - BAILOPAN
String save;
save.assign(no_function);
amx_NullNativeTable(amx);
AMX_NATIVE_INFO p[] = {
{ "require_module", require_module },
{ NULL, NULL },
};
amx_Register(amx, p, -1);
if (CheckModules(amx, error) == -1 || *error == 0)
{ {
sprintf(error,"Plugin uses an unknown function (name \"%s\") - check your modules.ini.",save.c_str()); sprintf(error, "Plugin uses an unknown function (name \"%s\") - check your modules.ini.", no_function);
} }
return (amx->error = AMX_ERR_NATIVE);
return AMX_ERR_NONE;
} }
CheckModules(amx, error); return (amx->error = AMX_ERR_NATIVE);
return AMX_ERR_NONE;
} }
int unload_amxscript(AMX* amx, void** program) int unload_amxscript(AMX* amx, void** program)