From 99f81e7621d9fe3ff7915829f26b277f7ebbf8a0c93852a4e8471afc82298d3a Mon Sep 17 00:00:00 2001 From: Gabriel Lorenzo Date: Wed, 25 Sep 2002 23:50:51 +0000 Subject: [PATCH] correcciones, sobrecarga, y cosillas --- ediv/CHANGE_LOG.txt | 6 +++++ ediv/doc/ExportaFuncs.txt | 33 ++++++++++++++++++++++++ ediv/doc/html/clean.bat | 4 +++ ediv/doc/html/makebat95.vbs | 19 +++++++++++++- ediv/doc/html/makedokNT.bat | 3 +++ ediv/doc/leeme-doc.txt | 4 +-- ediv/src/dlls/dlls.suo | Bin 18944 -> 19968 bytes ediv/src/dlls/export.h | 3 ++- ediv/src/ediv/ediv_export.c | 22 ++++++++-------- ediv/src/ediv/expresion.c | 10 +++++++- ediv/src/ediv/parser.c | 46 ++++++++++++++++++++++++---------- ediv/src/ediv/parser.h | 2 +- ediv/src/shared/extern.h | 1 + ediv/src/stub/ediv_export.c | 1 + ediv/src/stub/inte.c | 8 ++++-- ediv/src/stub/stub.c | 8 +++--- ediv/src/visual c/ediv_ws.suo | Bin 23040 -> 25088 bytes 17 files changed, 135 insertions(+), 35 deletions(-) diff --git a/ediv/CHANGE_LOG.txt b/ediv/CHANGE_LOG.txt index 702f698..51267da 100644 --- a/ediv/CHANGE_LOG.txt +++ b/ediv/CHANGE_LOG.txt @@ -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 --------- diff --git a/ediv/doc/ExportaFuncs.txt b/ediv/doc/ExportaFuncs.txt index 5c5367e..e397263 100644 --- a/ediv/doc/ExportaFuncs.txt +++ b/ediv/doc/ExportaFuncs.txt @@ -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 --------------------------- diff --git a/ediv/doc/html/clean.bat b/ediv/doc/html/clean.bat index 25ac21e..d183cbf 100644 --- a/ediv/doc/html/clean.bat +++ b/ediv/doc/html/clean.bat @@ -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 \ No newline at end of file diff --git a/ediv/doc/html/makebat95.vbs b/ediv/doc/html/makebat95.vbs index cbe7535..4bd608f 100644 --- a/ediv/doc/html/makebat95.vbs +++ b/ediv/doc/html/makebat95.vbs @@ -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... ;)" diff --git a/ediv/doc/html/makedokNT.bat b/ediv/doc/html/makedokNT.bat index ac4e830..87c7f4b 100644 --- a/ediv/doc/html/makedokNT.bat +++ b/ediv/doc/html/makedokNT.bat @@ -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 diff --git a/ediv/doc/leeme-doc.txt b/ediv/doc/leeme-doc.txt index 64e54e6..58cc8b1 100644 --- a/ediv/doc/leeme-doc.txt +++ b/ediv/doc/leeme-doc.txt @@ -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 diff --git a/ediv/src/dlls/dlls.suo b/ediv/src/dlls/dlls.suo index f2460e437b71990ccda21035537264fb1869530375c50fa4a2a7655107317696..2d1cfce8a2efb1e16d95bc43c5e047db1dae73eb1f8c77e5d07114db6c51514e 100644 GIT binary patch delta 761 zcmb7?O=uHQ5XWaW+cc)T+s&7))QcF~f>x5YsTN8V)Iv~5ax8v;m`bHlOS^|qqXxY8 zVy1|oXV2;$yoz3gDkipm;laBgD(s;uRR3>VWqT2Pk3T!}n|bqQmRDcm`dz-isL5hD z!s`!8Gu+TCmi^;P^K?A`5!nBpbF4{lb!1q+izb6}|l0_eO1)-BF8ruP40qAWH^FS2ZkE(2BIeQ+n!pE~?DolMi{0g6L^M{}~zc~1-E6|@4aLa(7W z&|Byo^d4HjS-SIZ_(*i4)OgY8095z=DJ96Kin7_kq2Vp>pzmMr0B?-tRL_Ym jckk+)qAJbe56$84?x$(Fo$nv`uO5WW>tdU;n>zCwC`-!D delta 528 zcmY+A&o2W}5XWb>Tdj6?(JB?-oM{y0WM2 zAy}uZ>O&@1Bh}%bFsbpk%BwzXa!rX8>8&1ZW#zdjS}<2j?KXNp8(>Weiyg?ori_mDhYEtJVhV z@@8Ea5p>jplnEZ?xK(M*qy}KK)KXaNP+HD{330zq#|~%M2tg4nSGlzrBMJ~Mhjt`m z)R(~Dn#hC6?{e4DHr}Cr*9zIRO!Krzv&e~F@a42XlfZMxMl6JEvA;mmXb>GM#SBmm z04tSZg{ClN2`GnZ*BOgF1x;2<8&Ur(7dw6<=fSvRCoXw=^yH{>AYgJW6m|bpsf?ik TsKLKi-PE-VcoUA>X9T_g)l;Nr diff --git a/ediv/src/dlls/export.h b/ediv/src/dlls/export.h index 6dbf0be..0b0ba12 100644 --- a/ediv/src/dlls/export.h +++ b/ediv/src/dlls/export.h @@ -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 ; diff --git a/ediv/src/ediv/ediv_export.c b/ediv/src/ediv/ediv_export.c index 6976daf..411f7ea 100644 --- a/ediv/src/ediv/ediv_export.c +++ b/ediv/src/ediv/ediv_export.c @@ -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" diff --git a/ediv/src/ediv/expresion.c b/ediv/src/ediv/expresion.c index 80ea6df..38dbab4 100644 --- a/ediv/src/ediv/expresion.c +++ b/ediv/src/ediv/expresion.c @@ -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: diff --git a/ediv/src/ediv/parser.c b/ediv/src/ediv/parser.c index d8984e2..6c6fd8a 100644 --- a/ediv/src/ediv/parser.c +++ b/ediv/src/ediv/parser.c @@ -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; } diff --git a/ediv/src/ediv/parser.h b/ediv/src/ediv/parser.h index 6c2d515..48bbdcb 100644 --- a/ediv/src/ediv/parser.h +++ b/ediv/src/ediv/parser.h @@ -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); diff --git a/ediv/src/shared/extern.h b/ediv/src/shared/extern.h index 8cd75df..57b2ab8 100644 --- a/ediv/src/shared/extern.h +++ b/ediv/src/shared/extern.h @@ -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 ; diff --git a/ediv/src/stub/ediv_export.c b/ediv/src/stub/ediv_export.c index a7d4c52..ec43465 100644 --- a/ediv/src/stub/ediv_export.c +++ b/ediv/src/stub/ediv_export.c @@ -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 + #include #include #include @@ -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 ; diff --git a/ediv/src/visual c/ediv_ws.suo b/ediv/src/visual c/ediv_ws.suo index e1131bea3384652c82efc7acbb07437966275cd4b22e81ab0518a8d84533ad3f..77b309acc219e430523a514620e729e5fa402a55940cac3648703000acbaa032 100644 GIT binary patch delta 1431 zcma)++fNfw5Qpb%w+Kz?1%$R1rAPsZqODYvRt;54jF$wSj1lj}*l2;2dP5@^?|1F- zf_FvZiyFl>@r^Xb2YoP6AC(yY0i#iZXkzhqTGqCSCZ5f=J9Ey??97}w+w+9=JZFzO zB=bZfngmLL10>Ei+vO<`_|2RW*#e=zxq-#xtp?MJ-nXBE&zJ^t4b@7QyoBjTG0f1# zlfRLjd`Rn%4+v{(j!QlWL0OhFBKd@k3AEBqisBxjHd+te3c}FCw2DGwQVqFjHRi{s z)|BqN0Mpx`2q)@?v|1=F$`9RP4L9i<%v#DL#)xKOdNHWxZw!Tbb0IANB(#`ug;~)- z2~s<4p>2@9S^2Lz`?URHwiWXs+79V>E^Zs(YLj?HtaT#jZJ0tj%0uHz#_sZ6=5A?+ zPWfrxD@(+9S8 z2j{?fZ~@I? zsRp$caxEk`u0`a6K zeHFY(@8ylttwnQ@W(N{(qxrBC{Yd2JZlBGRnQyro?MPO>CHBq9EJe(se(Cd z&oRnQ)xmIv@rC`yX91MYa4QEVUsNJ<8X4*NUpo zOa6h%lYf@C644+qB(-6gXdDi^HmU8yyW$|02+ev0U2q?Wzk?XB?s*D64?Oq~^Tn0; TvOygmC@ogL&NHyS#Rb0sN)ld# delta 628 zcmYk3Ur5tY6vxl~{aM?XTXVWi7NofRw?S*J9}^2U_(fzrY!n!1p|Ta4Xe^Uj(DoMe z5V-@rXO9tTw`Y;`p&kT%>9Gf)=b-kGMO)u%79RNA`#s-#xSV@#bxTy=iPgKBXe{L; z(I^p}0zIG?^nrdb0Ae5n*77+~GiJT3r>ifl!h4~^qb^xCMuf);=>ts!?;26Ao1I2O zC1FS6K*%eOAKI{n8Usv&Fj%BXDj}Pr0u|{2jX~dle>7B%`(?#-LGV^EVVW?~a^L+# zS1oXV%Xz;^Itf8E1mhy;;9YOPWkb1uuCkhM)c@U$tU&X0hwelD3iEF(5|1gj2!9&= z5WR9@nW7}!!oI1_?$HA3r=T9m72ii841VaZXcb-l^glMV>%`??+3d!7ocDv5JsnW0 z$^X+>2<1HfL*t(*>!F>1N4?OvK2?y_#R2+p*(ad-L}e>oR0dNmTfGaM1$cq7ZliWql^<~cJo z78p#ak9FwV0*`Dq`~Fs*h2y-Ndf#xA+JWRLT+i6qb1pO$m2e*htPueSgI