correcciones, sobrecarga, y cosillas

This commit is contained in:
Gabriel Lorenzo 2002-09-25 23:50:51 +00:00
parent f1f803404d
commit 99f81e7621
17 changed files with 135 additions and 35 deletions

View file

@ -8,6 +8,12 @@
* Añadidos los opcodes optimizados al stub. He puesto no_optimization a 0 en
el ediv.cfg. He compilado los test y parece que rulan perfectamente.
(Er_Makina)
* Corregido un pequeño fallo en el opcode ljpf. (Er_Makina)
* Se permite sobrecarga de funciones en las DLLs. Se pueden declarar varias
funciones con el mismo nombre siempre que tengan distinto número de pará-
metros. Dentro de la función se puede saber cuántos parámetros se han re-
cibido con fp->num_params. Ver doc/ExportaFuncs.txt para más detalles
(ya lo pasaré a .dok :P) (Er_Makina)
24/9/2002
---------

View file

@ -49,6 +49,39 @@ nombre_interno es el nombre que tiene la funci
Ejemplo: FUNCTION ("load_map",1,DIV_Load_Map);
(020926): Se puede sobrecargar una función declarándola varias veces con distinto
número de parámetros (da igual si se indica un puntero a una función de C distinta o
no). A cada declaración se le asignará un id distinto, como si fueran funciones dis-
tintas. Dentro de la función se puede saber cuántos parámetros se han recibido con
fp->num_params.
Ejemplo:
FUNCTION ("set_mode",1,DIV_Set_Mode);
FUNCTION ("set_mode",3,DIV_Set_Mode);
FUNCTION ("set_mode",4,DIV_Set_Mode);
...
int DIV_Set_Mode(FUNCTION_PARAMS)
{
int modo,ancho,alto,bpp,flags;
switch(fp->num_params) {
case 1:
modo=getparm();
...
case 3:
bpp=getparm();
alto=getparm();
ancho=getparm();
...
case 4:
flags=getparm();
bpp=getparm();
alto=getparm();
ancho=getparm();
...
}
return 0;
}
DECLARACIÓN DE CONSTANTES
---------------------------

View file

@ -1 +1,5 @@
:: Usa este script para limpiar el directorio de *.html y dejar sólo los *.dok
:: Por esa razón que todos conocemos, windows sólo tiene en cuenta las tres
:: primeras letras de la extensión.
del *.htm

View file

@ -1,7 +1,24 @@
'
' Este script debe ser usado en windows 95, 98 y Me para compilar la documentación.
' MakedokNT.bat no funcionará porque el MSDOS de win9x no usa nombres largos por
' defecto :P y Doku requiere nombres largos.
' Primero hay que ejecutar este script, que rastreará los .dok que haya en el
' directorio actual y creará un makedok95.bat que llama a Sion Doku usando nombres
' largos. Entonces ejecutamos makedok95.bat y Doku entrará en acción.
' Me hubiera gustado simplificar un poco más el proceso, pero no puedo llamar a
' Doku desde el windows scripting host (menuda mierda, dicho sea de paso. Es en
' estos momentos cuando más echo de menos al Bash o al AppleScript).
'
' Er_Makina
'
dim fs,f,bat,fil,c
Set fs=CreateObject("Scripting.FileSystemObject")
Set f=fs.getfolder(".").files
set bat=fs.opentextfile("makedok95.bat",2,true)
bat.write ":: makedok95.bat generado por makebat95.vbs" & vbcrlf
bat.write ":: Ejecuta este script para compilar la documentación." & vbcrlf
bat.write ":: Si añades o quitas un documento, ejecuta makebat95.vbs para actualizar el bat." & vbcrlf & vbcrlf
c=0
for each fil in f
if lcase(fs.getextensionname(fil.path))="dok" or lcase(fs.getextensionname(fil.path))="doku" then
@ -10,4 +27,4 @@ c=c+1
end if
next
bat.close
msgbox "Encontrados " & c & " fichero(s)"
msgbox "Encontrados " & c & " fichero(s)." & vbcrlf & "Ahora ejecuta makedok95.bat y la magia de Doku hará el resto... ;)"

View file

@ -1 +1,4 @@
:: Ejecuta este script para compilar la documentación
:: Sólo válido para windows NT/2000/XP. Si usas 95, 98 o Me, utiliza makebat95.vbs
for %%i in (*.dok) do ..\doku %%i

View file

@ -8,8 +8,8 @@ Dreamweaver).
Para obtener los HTML a partir de los .dok hay que usar el programa DOKU
aquí incluido. En vez de ir ejecutando Doku una vez para cada archivo,
puedes usar los scripts que hay en el directorio html.
-> Para Windows Me/NT/2000/XP: ejecuta makedokNT.bat
-> Para Windows 95/98: ejecuta primero makebat95.vbs y luego makedok95.bat
-> Para Windows NT/2000/XP: ejecuta makedokNT.bat
-> Para Windows 95/98/Me: ejecuta primero makebat95.vbs y luego makedok95.bat
-> Para Linux: ejecuta makedok.sh
Si usais antivirus, es posible que os avise de que hay riesgo de virus al

Binary file not shown.

View file

@ -246,7 +246,8 @@ struct _fun_params{
int *pila ;
int *sp ;
int *mem ;
int *varindex ;
int num_params;
varindex_t *varindex ;
struct _procs_s *procs_s ;
int *num_procs ;
int *proc_orden ;

View file

@ -70,7 +70,7 @@ int EDIV_Export(char* cadena, int nparam, void* hfuncion)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,nparam);
#ifdef DEBUG_DLL
printf("export_function:\t-- ID FUNCION: %d\n"
@ -139,7 +139,7 @@ int EDIV_Export_Const(char* cadena, int valor)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_const:\t-- ID OBJETO: %d\n"
@ -175,7 +175,7 @@ int EDIV_Export_Global(char* cadena, int valor)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_global:\t-- ID OBJETO: %d\n"
@ -213,7 +213,7 @@ int EDIV_Export_Global_Tab(char* cadena, int numregs)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_global_tab:\t-- ID OBJETO: %d\n"
@ -259,7 +259,7 @@ int EDIV_Export_Global_Struct(char* cadena, int numregs)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_global_struct:\t-- ID OBJETO: %d\n"
@ -304,7 +304,7 @@ int EDIV_Export_Member_Int(char* cadena, int valor)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_member_int:\t-- ID OBJETO: %d\n"
@ -351,7 +351,7 @@ int EDIV_Export_Member_Str(char* cadena, int tamano)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_member_str:\t-- ID OBJETO: %d\n"
@ -426,7 +426,7 @@ int EDIV_Export_Member_Tab(char* cadena, int numregs)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_member_tab:\t-- ID OBJETO: %d\n"
@ -535,7 +535,7 @@ int EDIV_Export_Local(char* cadena, int valor)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_local:\t-- ID OBJETO: %d\n"
@ -573,7 +573,7 @@ int EDIV_Export_Local_Tab(char* cadena, int numregs)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_local_tab:\t-- ID OBJETO: %d\n"
@ -619,7 +619,7 @@ int EDIV_Export_Local_Struct(char* cadena, int numregs)
return 0;
}
creaobj=crea_objeto((byte*)cadena);
creaobj=crea_objeto((byte*)cadena,-1);
#ifdef DEBUG_DLL
printf("export_local_struct:\t-- ID OBJETO: %d\n"

View file

@ -1280,7 +1280,15 @@ void factor(void) {
if (pieza!=p_coma) error(3,35); // se esperaba una coma
else { lexico(); if (pieza==p_cerrar) error(3,36); } // se esperaba otro parametro
}
} if (p!=(*ob).fext.num_par) error(1,38); // numero de parametros incorrecto
}
while(1) {
if(ob==NULL) break;
if((*ob).tipo==tfext && (*ob).fext.num_par==p) break;
ob=(*ob).anterior;
}
if(ob==NULL) error(1,38); // numero de parametros incorrecto
//if (p!=(*ob).fext.num_par) error(1,38); // numero de parametros incorrecto
(*_exp).tipo=efext; (*_exp++).objeto=ob; lexico(); break;
default:

View file

@ -33,7 +33,7 @@
#pragma warning(disable:4018) // Signed/Unsigned Mismatch :)
#endif
int crea_objeto(byte * nombre)
int crea_objeto(byte * nombre, int nparam)
{
struct objeto * * ptr_o;
byte ** ptr, * _ivnom, h;
@ -50,6 +50,7 @@ int crea_objeto(byte * nombre)
// TODO: TESTEAR!!!
if(nparam==-1) {
// busca si el id encontrado se encuentra en la misma struct
while(o!=NULL && ((*o).member!=member)) o=(*o).anterior;
if(o==NULL) { // ok, no hay problema
@ -61,6 +62,25 @@ int crea_objeto(byte * nombre)
} else {
return 2; // dos nombres iguales en el mismo nivel de struct -> "el nombre no es nuevo"
}
}
else {
// se trata de una funcion externa. buscamos si es posible la sobrecarga
while(1) {
if(o==NULL) break;
if((*o).tipo==tfext && (*o).fext.num_par==nparam) break;
o=(*o).anterior;
}
//while(o!=NULL && (((*o).tipo==tfext) ^^ ((*o).fext.num_par!=nparam))) o=(*o).anterior;
if(o==NULL) { // ok, lo añadimos a la lista
o=iobj++; (*o).anterior=*ptr_o; *ptr_o=o;
(*o).name=(byte*)(ptr_o+1);
(*o).member=member;
(*o).param=0;
if (num_obj++==max_obj) return 3; // error "demasiados objetos"
} else {
return 2; // dos funciones iguales con el mismo numero de parametros -> "el nombre no es nuevo"
}
}
} else {
*ptr=_ivnom; ptr_o=(void*)(_ivnom+4); *ptr_o=o=iobj++; // id nuevo
@ -261,7 +281,7 @@ lex_scan:
if (pieza==p_ultima) {
if (coment) error(0,1); // llegó el final dentro de un comentario
else error(0,4); // s韒bolo no reconocido ( creo!!)
else error(0,4); // símbolo no reconocido (¡¡creo!!) TODO: comprobar
}
break;
@ -385,7 +405,7 @@ void sintactico(void)
} else {
if (!free_sintax) {
if (pieza==p_program) {
error(3,9); // se esperaba ';' (<EFBFBD>reo!)
error(3,9); // se esperaba ';' (¡creo!) TODO: comprobar
//lexico();
break;
}

View file

@ -446,7 +446,7 @@ int acceso_remoto; // Para no permitir id.private
// PROTOTIPOS
//-----------------------------------------------------------------------------
int crea_objeto(byte * nombre);
int crea_objeto(byte * nombre, int nparam);
void psintactico(void);
void plexico(void);
void sintactico(void);

View file

@ -245,6 +245,7 @@ struct _fun_params{
int *pila ;
int *sp ;
int *mem ;
int num_params;
varindex_t *varindex ;
struct _procs_s (*procs_s)[4096] ;
int *num_procs ;

View file

@ -139,6 +139,7 @@ int EDIV_Export(char* cadena, int nparam, void* hfuncion)
(*ob).fext.num_par=nparam; // es necesario?*/
extfuncs[n_externs]=hfuncion;
extparms[n_externs]=nparam;
/* for(i=0;i<numdlls;i++)
for(j=0;j<dlls[i].nfuncs;j++)

View file

@ -163,9 +163,10 @@ int proceso( int num )
num_proc = num ;
imem = procs_s[num_proc].imem ;
//printf("num_proc: %d\n",num);
//assert(0);
if(num==972) assert(0);
while( retcode == 0 )
{
@ -266,6 +267,8 @@ int proceso( int num )
case ljpf://24
if (!(pila[sp]&1))
imem = mem[ imem ] ;
else
imem++;
sp--;
break ;
case lfun://25 NO USADO
@ -420,9 +423,10 @@ int proceso( int num )
break ;
case lext://57
//assert(0);
externa=extfuncs[mem[imem++]];
externa=extfuncs[mem[imem]];
// corresponder con FUNCTION_PARAMS
//temp = externa(pila,&sp,mem,varindex,&procs_s,Call_Entrypoint);
fp.num_params=extparms[mem[imem++]];
temp = externa(&fp) ;
pila[++sp]= temp ;
break ;

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <assert.h>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
@ -56,7 +58,7 @@ int main(int argc, char* argv[])
byte * ptr;
unsigned long len,len_descomp;
byte* vartemp;
const SDL_version* sdl_version;
//const SDL_version* sdl_version;
#ifdef DBG
int start_lin;
int linsize;
@ -69,7 +71,7 @@ int main(int argc, char* argv[])
eDIV_InstallParachute();
sdl_version=SDL_Linked_Version();
/*sdl_version=SDL_Linked_Version();
#ifdef _DEBUG
printf("Versión SDL del exe: %d.%d.%d\n",SDL_MAJOR_VERSION,SDL_MINOR_VERSION,SDL_PATCHLEVEL);
printf("Versión de SDL instalada: %d.%d.%d\n",sdl_version->major,sdl_version->minor,sdl_version->patch);
@ -83,7 +85,7 @@ int main(int argc, char* argv[])
critical_error(9,SDL_MAJOR_VERSION,SDL_MINOR_VERSION,SDL_PATCHLEVEL,
sdl_version->major,sdl_version->minor,sdl_version->patch);
}
*/
for ( i = 0 ; i < 100 ; i++ )
tiempo[ i ] = 0 ;
tiempo_i = 0 ;

Binary file not shown.