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:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user