Generador de módulos "wrappers"

Started by DCelso, March 04, 2010, 12:09:22 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

Hola a todos,
aqui va la madre de todas las madres :) ,
¿quieres crearte un módulo Bennu de una librería que usas mucho o que quisieras usar y te da mucha pereza ponerte a crearlo?
Ahora no tienes escusa, te traigo un programa que hace el trabajo pesado por ti.
Lo único que necesitas es crear un archivo .properties donde especificas el nombre del módulo, las funciones y el tipo de parámetros de cada función y este programa te genera el código fuente de tu módulo.
Dentro del zip viene un ejemplo de mod_dctools.
Para probar el ejemplo lo único que tienes que hacer es escribir en la consola de comandos mod_dctools.bat, esto creará un archivo mod_dctools.c en la carpeta src.

http://depositfiles.com/files/c9q7um8rl

También puede servir para crearte un código fuente esqueleto de un módulo propio, defines el nombre de tus funciones, los tipos de parámetros el nombre que le quieres dar, escribes el .properties con esa información, pasas este "vtl_parser" y tendrás tu código fuente c esqueleto para rellenar con tus funciones de tu módulo.

Nueva descarga:
http://code.google.com/p/fpg-editor/downloads/list
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

osk

OH DIOS MIO, NO PUEDE SER VERDAD!!!!!

Instant karmakarmakarmakarma!!!

Aaaagggghhhhh!!!!!!!

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Drumpi

Pero ¿pero esto qué es? ¡¿ESTO QUÉ ES?!

Juer, mola, ahora se puede hacer un módulo para usar las funciones OPEN, CLOSE, READ y WRITE de linux, y así tener acceso a todo el hardware O.O
Karma up.

Un momento ¿un .bat? :S
;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

#5
Quote from: SplinterGU on March 04, 2010, 03:13:10 AM
fantastico, me suena conocido...
¿A qué?, si se puede saber :D.

Es una aplicación JAVA casera que usa apache velocity para procesar las plantillas y que abre el .properties y lo convierte en variables velocity para que éste las pueda procesar en la plantilla.
Por cierto, se puede usar para casi cualquier cosa, es un generador de archivos a través de plantillas como cualquier otro, así que si sabeis velocity podeis entrar en el directorio "parser" y ahí modificar template.vtl a gusto, por ejemplo para hacer una plantilla para modulos cpp, o para hacer una plantilla para documentación html, o cualquier cosa que se os ocurra mientras useis las variables que definisteis en el .properties.

Llevaba mucho tiempo detrás de hacerla debido a que tenía en mente hacer varios módulos y quería automatizarme la tarea pero soy tan tonto que la he hecho después de hacer los módulos y no me ha servido :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Hombre, para hacer varios modulos tienes la opcion cut/paste heheheheheheh. Esta interesante la aplicación, pero no leo veo mucha utilidad, ya que tendrás que editar despues manualmente tu modulo tal como si lo hicieras con tu aplicación.

Windgate

#7
Karma up y a ver a ver a ver :o

Yo había pensado en hacer un programita que a partir de un determinado TYPE generase automáticamente las operaciones observadoras y modificadoras de cada uno de sus campos, para evitar el problema de anidamiento de TYPES que supone tener que andar haciendo cosas como:

( * ( * ( * lista) . vertices ) . x ) = 4;

Y cosas peores, analizaré tu módulo DCelso, suena realmente sexy.

EDIT: "Y ahora sólo queda compilarlo con tu compilador favorito"

Ahí es donde creo que la mayoría tenemos el problema, que nos ponemos a añadir cosas al CodeBlocks y la cosa no compila ni pa dios. Si algún día te da por subir un video a Youtube en el que se vea qué es lo que añades exactamente para que te compile la cosa nos harías un hijo de madera, ya sea con Eclipse o con lo que tú uses :D

Por cierto, estaría bien que el foro soportase video de Youtube embebido :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

Para hacer wrappers no.
Creo que no entendiste lo que hace, no es solo un copy/paste, hace algo más.
Lo suyo es probarlo y trastear con él, pero.
A ver si me explico mejor.
Imagínate una librería, llamemosla libmates.dll que tiene las siguiente funciones:

float real_entero(int parte_real, int parte_milesimial); // crea un real dando una parte entera y una parte milesimal.
float suma_divide(int valor_inicial,int valor_a_sumar, float valor_por_el_que_dividir) // suma un valor y divide por otro
int contrario(int valor); // devuelve el valor multiplicado por -1.


pues tu, para crear el módulo que llamase a estas funciones de la libmates.dll qué tendrías que hacer?
Primero ponerle un nombre como mod_mates, por ejemplo, luego inventarte un prefico como por ejemplo "MAT_"
luego crear tres entradas en __bgdexport( nombe_modulo, functions_exports), del tipo:
{"MAT_SUMA_DIVIDE", "IIF", TYPE_INT, puntero_a_funcion},
En este caso tres, pero ¿qué libreria te encuentras con solo tres funciones? Imagínate que tiene 15 o 20, no veas tu que rollo una a una, a ver que nombre vas poniendo a cada puntero, funcion bennu, que no se te olvide ningún parámetro, mete bien los tipos, etc.
Bueno ahora queda lo peor, tienes que crearte las funciones a las que estás apuntando siguiendo un esquema tipo

static int f_createFloat (INSTANCE * my, int * params) {
int result = -1;
int param_0 =params[0];
int param_1 =params[1];

float flt_ret = createFloat (param_0,param_1);
result =  *((int*) &flt_ret);

return result;
}

y son 15 o 20 veces digimos, luego a ver, tienes que extraer los parámetros y ponerlos en su verdadero tipo.
Osea no haces lo mismo con un entero que con un float o que con un string, recuerda hacer los
 const char * param_0 = string_get(params[0]); y los string_discard(params[0]);

Son muchas cosas que son repetitivas, que son como dices "copy, paste and repace" pero que llevan su tiempo y que la puedes cargar sin querer, que c es muy puñetero y puedes hacer perrerias como intentar pintar un string en una direccion de memoria de un entero.
En nuestro caso, para Bennu, todos los parámetros de entrada son enteros, así que puedes compilar perfectamente un módulo que usa strings como entrada e intentar usarlos como enteros en código (no digo a posta) y luego tener un módulo que hace cosas raras como colgar el programa :D.
Pues esta plantilla intenta evitar todo eso, simplemente creas un .properties con la información, sería este el del ejemplo

anio_creacion = 2010
autor = DCelso
nombre_modulo = mod_mates
prefijo = MAT

real_entero = F,I,I
suma_divide = F,I,I,F
contrario = I,I

Ya ves tu,
pones los datos de tu módulo y tuyos. (puse anio, porque la ñ no la trabajan bien algunos tipos de condificacion y ano queda como de muy culo :D)
luego pones el nombre de tu funcion, un igual, el tipo de valor de retorno, luego los tipos de los parámetros de entrada.
repites para todas tus funciones.
Este fichero lo pasas por el "vtl_parser" tal y como pongo en el ".bat" (Sí Drumpi, un .bat pero que llama a java para ejecutar un bytcode hecho en java eh)
Y te genera el .c correspondiente rellenando toda la información que puse, si son 20 funciones pues 20 funciones que te creó al canto.
Ya no necesitas editar el código del módulo como dices Free, solo necesitas compilarlo para sacar el mod_mates.dll que usará a libmates.dll para ejecutar las funciones.
Recuerda que esto es una encapsulación, no hemos creado ninguna lógica, simplemente son llamadas, ¿por qué no automatizarlo?

Además si quieres hacer alguna lógica, nadie te lo impide, accedes al código fuente que ya te ha quitado pues unas cuantas horas de trabajo (y copy paste como bien dices) y modificas a gusto lo que no te convenza demasiado.
Incluso para crearte tus propios módulos te quita una tarea bastante importante, aunque si eres un tanto en cuanto avispado y quieres crearte un módulo, lo lógico sería que te hicieras una librería normal, y luego le hiceras un "wrapper" (anda si para esto sirve esta aplicacion :D)

Está claro que no es la panacea, ni mucho menos, tampoco quiero defender el uso de éste, cada cual que haga módulos como quiera :D, pero ayudar ayuda, o eso creo.


PD: Quero karmasss, que ma costao lo mio.


PPD: es bromita, eh.



Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Te doy un Karma, pero atención, con tu nueva versión quiero la opción crear modulo con multithead, y cuando eso ocurra te doy 10 karmas de golpe  ;D

DCelso

#10
Cuando termines tu módulo con multitreads y compartas el código, miro a ver qué tendría que hacer para crear una plantilla multihilo :D.

Edit: Yujuuu, 90 ya,  :o que viejo soy :(.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Hhahahahaha, me temo que si no me haces la plantilla para que pueda hacerlo no verá nunca la luz del dia (almenos sacado por mi).

Vete mirando las funciones de salida declaradas 2 veces, una con parametro "S" y otra "SP" (mod_map), ya es un principio para que puedas empezar a soñar con el pack '10 karmas' :)

DCelso

No me lo digas dos veces que me pono eh :D.
Pero no entendí que quieres que mire, ¿el código fuente de mod_map?
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Según Splinter es como se define el multithead en los modulos que lo tienen, como es el caso, y tambien dice que sólo debe tener uno al principio.

Yo estaba creando cada beep con multithead (uno en cada), y como puedes ver en las pruebas del respectivo hilo, las theads seguian bloqueando la ejecución del resto en el programa.

Habrá que adaptar correctamente ese ejemplo a los beeps (o a lo que sea si haces otro ejemplo distinto).
Y usar una pila, tu tambien la utilizas en el tuyo.

Tienes el código de la actual version publicada, para ti hacer el cambio será pan comido, yo prefiero dedicarme a mi juego que llevo tiempo sin tocarlo y en eso estoy más a gusto, ni que sea para hacer algunos gráficos, por lo menos no me estancaré en el tiempo :)

Despues de ver como se hace en el modulo beep, que es super sencillo y lo conozco de sobra, ya me seria más facil hacerlo en otro modulo por ejemplo :)

Windgate

Por favor FreeYourMind, no llames multithead a los multithreads que alguno se va a pensar que estás hablando de otra cosa más rara xD

La idea es muy buena DCelso, la verdad, lo poco que he visto de módulos ya me había fijado que el sistema de paso de parámetros basado en ese array era muy automatizable, buena iniciativa has tenido.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es