Crear extensiones en linux

Started by josebita, October 29, 2008, 12:18:32 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

josebita

Hola:

Pues nada, que me he puesto a convertir una librería vieja de Fenix a Bennu en Linux y estoy teniendo problemillas.
El código de la librería es el que sigue:
[code language="c"]/* ************************************************************************** */
/* *                                                                        * */
/* *             Copyright (c) 2007 - Joseba García Echebarria              * */
/* *                                                                        * */
/* *                    This is a Fenix interface to iconv                  * */
/* *                                                                        * */
/* *            Under the terms of the GNU GPL version 2 license            * */
/* *                                                                        * */
/* *                         See LICENSE for details                        * */
/* *                                                                        * */
/* ************************************************************************** */

#include <stdio.h>
#include <iconv.h>
#include <bgddl.h>
#include <errno.h>
#include <sysprocs_st.h>

//Convert the charset of the string.
//Acceptable params are:
//string fromcharset, string tocharset, string translate_string
static int bgd_iconv(INSTANCE * my, int * params) {
  size_t inbytesleft, outbytesleft, retval;
  iconv_t cd;
  const char *inchar = string_get(params[2]);
  char *outchar;
  char *incharptr, *outcharptr;
  int strid=0, close_retval=0;
 
  //Conversion descriptor
  cd = iconv_open(string_get(params[1]), string_get(params[0]));
  string_discard(params[0]);
  string_discard(params[1]);
  string_discard(params[2]);
  if(cd == (iconv_t)-1)
    return errno;
   
  /* One should reset the conversion description here, as it might be
     carrying stale info around from previous invocations. */
  iconv(cd, NULL, NULL, NULL, NULL);

  /* inbytesleft counts the bytes we have not converted yet */
  /* maybe there's a faster way in fenix to get the string length? I
     think fenix already holds this info somewhere anyway */
  inbytesleft = strlen(inchar);
  /* I am not entirely sure 8 can be reached, but just to be on the
     safe side. 4 could also be resonable here, if no crazy
     scripts/encodings are used */
  outbytesleft = inbytesleft * 8;
  outchar = malloc(outbytesleft+1);

  //Couldn't malloc, we better quit
  if (!outchar) {
    iconv_close(cd);
    gr_error("FATAL: Couldn't allocate memory for string conversion\n");
  }

  incharptr = (char*)inchar;
  outcharptr = outchar;
 
  while(1) {
    retval = iconv(cd, &incharptr, &inbytesleft, &outcharptr, &outbytesleft);
   
    //Handle an error, in case we got one
    /* perror is your friend... (but see also strerror) */
    if(retval == (size_t)-1) {
      perror("iconv");
      break;
    }

    if(inbytesleft == 0)
      break;
  }

  /* Make the string zero-ended */
  *outcharptr = 0;
 
  //Deallocate conversion descriptor
  close_retval = iconv_close(cd);
  if(close_retval == -1)
    return errno;

  //Return the converted string
  strid = string_new(outchar);
  string_use(strid);
  free(outchar);
  return strid;
}

// Stupid function to check library_creation is working as expected
static int bgd_return_two(INSTANCE * my, int * params) {
  return 2;
}

DLSYSFUNCS __bgdexport( mod_iconv, functions_exports )[] =
{
  { "ICONV"            , "SSS"  , TYPE_STRING, bgd_iconv       },
  { "ICONV_RETURN_TWO" , ""     , TYPE_DWORD , bgd_return_two  },
  { 0                  , 0      , 0          , 0}
};
[/code]
Para compilarla (dejemos de un lado la calidad del código) uso el script que me funcionaba en Fenix:
[code language="bash"]#!/bin/sh

BENNUGD=/home/joseba/cvs/Bennu/bennu

gcc -O2 -I$BENNUGD/core/include/ -D_REENTRANT -c iconv.c
ld -olibiconv.so iconv.o -L/home/joseba/cvs/bennugd/bin -L/usr/lib -lpthread -shared -lbgdrtm[/code]
En Bennu no funciona... :( Bueno, el tema es que sí que obtengo un fichero "libiconv.so" pero bennu no es capaz de cargarlo.
El error que me dan tanto moddec como bgdc es:
[code language="bash"]BGDC 0.93 (Oct 26 2008 11:11:00)
Copyright � 2006-2008 SplinterGU (Fenix/Bennugd)
Copyright � 2002-2006 Fenix Team (Fenix)
Copyright � 1999-2002 Jos� Luis Cebri�n Pag�e (Fenix)
Fenix comes with ABSOLUTELY NO WARRANTY; see COPYING for details

main.prg:4: error: Library "libiconv.so" not found ("libiconv")
[/code]
Agradecería ayuda con el script de compilación, pero si no, yo me pelearé con él. Lo que quiero hacer er es que dice que la librería no la encuentra, cuando he definido LD_LIBRARY_PATH correctamente, supongo que si el problema es que no he creado la librería correctamente, lo suyo sería que diera otro tipo de error (The libraary is not compatible with BennuGD o algo así).

¡Ah! el main.prg es como sigue:
[code language="bennu"]#ifdef __VERSION__
import "mod_say";
#endif
import "libiconv";

Process Main()
Private
  string cadena = "�";
  string convertida;
 
Begin
  set_mode(640, 480);
  say(cadena);
  convertida = iconv("ISO-8859-1", "UTF8", cadena);
  say(convertida);
  write(0, 320, 240, 4, convertida);
  while(!key(_esc))
    FRAME;
  End;
End;
[/code]

SplinterGU

1) gr_error no existe en bennu
2) DLSYSFUNCS __bgdexport( mod_iconv, functions...
debe ser DLSYSFUNCS __bgdexport( libiconv, functions...

o sea, __bgdexport espera que el primer parametro sea el nombre de la lib...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Ups, sí anduve tocando el nombre de la librería, a ver si el error venía por ahí. Conseguí hacer una librería que el moddesc aceptaba, pero no exportaba nada y no tengo claro cómo lo hice :(
De todas maneras, compilando la librería "water" de la dirección de betas, el moddesc me dice que tampoco lo encuentra.
De todas formas, voy a seguir buscando información por el foro, que seguro que es una tontería que estoy haciendo mal.

SplinterGU

fijate que no te falte ninguna dependencia y usa el moddesc que viene en el paquete de bennu... con los demas modulos el moddesc te funciona?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

#4
No, con los que viene con Bennu no funciona tampoco. Tampoco funciona el script describe_modules.sh (creo que es así, no estoy en el portátil ahora mismo). Cuando lo intento ejecutar se queda parado sin más.
Cuando pueda probarlo más a fondo te aviso, ¿ok?.

Por cierto, estoy en una Ubuntu Intrepid en 32 bits. Échale un ojo cuando puedas a ver si a tí sí te funciona.

SplinterGU

Pregunta estupida, ademas de estar todo en el PATH y LD_LIBRARY_PATH, tienen todos los archivos permisos de ejecucion?

Para setear las variables de enviroment usaste el script setvars.sh? de ser asi, tenes todo en /opt/bennu/bin ?

Se que son preguntas estupidas, pero a veces las cosas mas estupidas se nos pasan por alto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Pues no he usado el script, he hecho un "export" sin más. Y sí, son ejecutables.
Bueno, acabo de volver a compilar y a probar a ejecutar moddesc sobre mi librería, pero copiada en el directorio donde está el moddesc y ahora ¡sí que lo encuentra!. La salida es la que sigue:
joseba@Polar01:bin$ ./moddesc libiconv.so
Module Describe v1.1 (Build: Oct 18 2008 21:46:52)
Copyright (C) 2008 SplinterGU
This utility comes with ABSOLUTELY NO WARRANTY.
./moddesc -h for details

Module name: libiconv.so

Functions:

STRING ICONV(STRING, STRING, STRING)
DWORD ICONV_RETURN_TWO()



Press any key to continue...


Y el bgdc también parece encontrarla.
Perdón por el incordio, juraría que ayer exporte la variable LD_LIBRARY_PATH para que también incluyera el directorio desde donde estaba ejecutando..... Pero evidentemente la lié en algún lado... Perdón de nuevo  :-[

SplinterGU

No, no hay que disculparse, queda como antecendente por si a otro le pasa... gracias...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2