correcciones, sobrecarga, y cosillas
This commit is contained in:
parent
f1f803404d
commit
99f81e7621
|
@ -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
|
||||
---------
|
||||
|
|
|
@ -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
|
||||
---------------------------
|
||||
|
|
|
@ -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
|
|
@ -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... ;)"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
@ -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 ;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,16 +50,36 @@ int crea_objeto(byte * nombre)
|
|||
|
||||
// TODO: TESTEAR!!!
|
||||
|
||||
// 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
|
||||
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 nombres iguales en el mismo nivel de struct -> "el nombre no es nuevo"
|
||||
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
|
||||
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 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 {
|
||||
|
@ -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ímbolo 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 ';' (¡creo!)
|
||||
error(3,9); // se esperaba ';' (¡creo!) TODO: comprobar
|
||||
//lexico();
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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++)
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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.
Loading…
Reference in a new issue