added a library table for module autoloading

updated VM plugin loader to read in this new section

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40149
This commit is contained in:
Borja Ferrer 2006-11-05 13:24:29 +00:00
parent 5c6f81cb25
commit 13775b11b6
5 changed files with 92 additions and 5 deletions

View File

@ -16,6 +16,7 @@ enum FileSections
FS_Publics,
FS_Pubvars,
FS_Natives,
FS_Libraries,
FS_Nametable, /* required */
FS_DbgFile,
FS_DbgSymbol,
@ -47,7 +48,7 @@ int main(int argc, char *argv[])
sp_file_t *spf;
memfile_t *dbgtab = NULL; //dbgcrab
unsigned char *dbgptr = NULL;
uint32_t sections[FS_Number] = {1,1,0,0,0,1,0,0,0,0,0,0};
uint32_t sections[FS_Number] = {1,1,0,0,0,0,1,0,0,0,0,0,0};
FILE *fp;
if (bin_file == NULL)
@ -87,6 +88,11 @@ int main(int argc, char *argv[])
{
spfw_add_section(spf, ".natives");
}
sections[FS_Libraries] = (hdr->pubvars - hdr->libraries) / hdr->defsize;
if (sections[FS_Libraries])
{
spfw_add_section(spf, ".libraries");
}
spfw_add_section(spf, ".names");
@ -251,6 +257,31 @@ int main(int argc, char *argv[])
spfw_next_section(spf);
}
if (sections[FS_Libraries])
{
sp_file_libraries_t *libtbl;
AMX_FUNCSTUBNT *stub;
unsigned char *stubptr;
uint32_t libraries = sections[FS_Libraries];
libtbl = (sp_file_libraries_t *)malloc(sizeof(sp_file_libraries_t) * libraries);
stubptr = (unsigned char *)hdr + hdr->libraries;
for (i=0; i<libraries; i++)
{
stub = (AMX_FUNCSTUBNT *)stubptr;
libtbl[i].name = stub->nameofs - (hdr->nametable + sizeof(uint16_t));
stubptr += hdr->defsize;
}
if (libraries)
{
sfwrite(libtbl, sizeof(sp_file_libraries_t), libraries, spf);
}
free(libtbl);
spfw_next_section(spf);
}
if (sections[FS_Nametable])
{
unsigned char *base;

View File

@ -1071,8 +1071,28 @@ static int command(void)
lptr=(unsigned char*)strchr((char*)lptr,'\0'); /* skip to end (ignore "extra characters on line") */
} else if (strcmp(str,"dynamic")==0) {
preproc_expr(&pc_stksize,NULL);
} else if (strcmp(str,"library")==0) {
char name[sNAMEMAX+1];
} else if (!strcmp(str,"library")
||!strcmp(str,"reqclass")
||!strcmp(str,"loadlib")
||!strcmp(str,"explib")
||!strcmp(str,"expclass")
||!strcmp(str,"defclasslib")) {
char name[sNAMEMAX+1],sname[sNAMEMAX+1];
const char *prefix="";
sname[0]='\0';
sname[1]='\0';
if (!strcmp(str,"library"))
prefix="??li_";
else if (!strcmp(str,"reqclass"))
prefix="??rc_";
else if (!strcmp(str,"loadlib"))
prefix="??f_";
else if (!strcmp(str,"explib"))
prefix="??el_";
else if (!strcmp(str,"expclass"))
prefix="??ec_";
else if (!strcmp(str,"defclasslib"))
prefix="??d_";
while (*lptr<=' ' && *lptr!='\0')
lptr++;
if (*lptr=='"') {
@ -1082,6 +1102,18 @@ static int command(void)
for (i=0; i<sizeof name && (alphanum(*lptr) || *lptr=='-'); i++,lptr++)
name[i]=*lptr;
name[i]='\0';
if (!strncmp(str,"exp",3) || !strncmp(str,"def",3)) {
while (*lptr && isspace(*lptr))
lptr++;
for (i=1; i<sizeof sname && alphanum(*lptr); i++,lptr++)
sname[i]=*lptr;
sname[i]='\0';
if (!sname[1]) {
error(45);
} else {
sname[0]='_';
}
}
} /* if */
if (strlen(name)==0) {
curlibrary=NULL;
@ -1089,8 +1121,19 @@ static int command(void)
pc_addlibtable=FALSE;
} else {
/* add the name if it does not yet exist in the table */
if (find_constval(&libname_tab,name,0)==NULL)
curlibrary=append_constval(&libname_tab,name,0,0);
char newname[sNAMEMAX+1];
if (strlen(name)+strlen(prefix)+strlen(sname)<=sNAMEMAX) {
strcpy(newname,prefix);
strcat(newname,name);
strcat(newname,sname);
if (find_constval(&libname_tab,newname,0)==NULL) {
if (!strcmp(str,"library") || !strcmp(str,"reqclass")) {
curlibrary=append_constval(&libname_tab,newname,1,0);
} else {
append_constval(&libname_tab,newname,1,0);
}
}
}
} /* if */
#if 0 /* more unused */
} else if (strcmp(str,"pack")==0) {

View File

@ -91,6 +91,12 @@ typedef struct sp_file_natives_s
uint32_t name; /* name of native at index */
} sp_file_natives_t;
/* section is .libraries */
typedef struct sp_file_libraries_s
{
uint32_t name; /* index into nametable */
} sp_file_libraries_t;
/* section is .pubvars */
typedef struct sp_file_pubvars_s
{

View File

@ -52,6 +52,8 @@ typedef struct sp_plugin_infotab_s
sp_file_natives_t *natives; /* native table */
uint32_t pubvars_num; /* number of pubvars */
sp_file_pubvars_t *pubvars; /* pubvars table */
uint32_t libraries_num; /* number of libraries */
sp_file_libraries_t *lib; /* library table */
} sp_plugin_infotab_t;
/**

View File

@ -107,6 +107,11 @@ sp_plugin_t *_ReadPlugin(sp_file_hdr_t *hdr, uint8_t *base, sp_plugin_t *plugin,
plugin->info.natives_num = secptr->size / sizeof(sp_file_natives_t);
plugin->info.natives = (sp_file_natives_t *)(base + secptr->dataoffs);
}
else if (!(plugin->info.lib) && !strcmp(nameptr, ".libraries"))
{
plugin->info.libraries_num = secptr->size / sizeof(sp_file_libraries_t);
plugin->info.lib = (sp_file_libraries_t *)(base + secptr->dataoffs);
}
else if (!(plugin->info.stringbase) && !strcmp(nameptr, ".names"))
{
plugin->info.stringbase = (const char *)(base + secptr->dataoffs);