[C con Clase] funcion de busqueda y reemplazo de cadenas con libreria dinamica
Diego Alejandro
diegomad en gmail.com
Vie Nov 20 21:12:19 CET 2009
hola lista,
tengo una dificulta con una función de una libraría dinámica que
estoy haciendo, cuando la utilizo por solo una ocasión no hay
problema, pero cuando la utilizo por segunda vez (reenviando la
cadena recibida en la primera vez) recibo solo una parte de la cadena
(primeras 12 letras) seguida de un caracater extraño (en mi caso
flechita a la derecha).
el codigo de la libraria esta el siguiente:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void str_replace(char **buf, char *src, char *dst)
{
char *t4;
char *t5 = malloc(0);
if(strstr(*buf,src)){
while(strstr(*buf,src)){
t4=strstr(*buf,src);
strncpy(t5+strlen(t5),*buf,t4-*buf);
if (strlen(dst)>0)
strcat(t5,dst);
t4+=strlen(src);
*buf=t4;
}
*buf = strcat(t5,t4);
}
}
el programa que la utiliza es el siguiente:
#include <stdio.h>
#include <dlfcn.h>
#define RUTA_LIB "libstr.so"
int main(){
int i = 3;
void *pLib;
void (*pFunc)(char**, char*, char*);
if ((pLib = dlopen(RUTA_LIB, RTLD_LAZY)) ==NULL) {
fprintf(stderr, dlerror());
return 1;
}
if ((pFunc = dlsym(pLib, "str_replace")) == NULL) {
fprintf(stderr, dlerror());
return 1;
}
char *buf = "SELECT dr.idCONCAT(tr.dialstr, tr.prefix, '%(NUMBER)s'
WHERE '%(NUMBER)s' = TRUE AND ('%(USER)s'";
char *src = "%(USER)s";
char *dst = "mad";
char *punt = NULL;
punt = buf;
printf("buf: '%s' \n\n", buf);
pFunc(&buf, "%(NUMBER)s", "0123456789");
printf("buf: '%s' \n\n", buf);
pFunc(&buf, "%(USER)s", dst);
dlclose(pLib);
printf("buf: '%s' \n", buf);
return(0);
}
los comandos para la compilacion de la libreria que estoy utilizando son:
gcc -fPIC -c -o libstr.o libstr.c
gcc -shared -fPIC -o libstr.so libstr.o -ldl
y para el programa:
gcc -o strstr strstr.c -ldl
y porsupuesto que para compilar agrege el directorio donde esta la
libreria a LD_LIBRARY_PATH.
mi version de compilador es: gcc version 4.3.2 (Debian 4.3.2-1.1)
muchas gracias por cualquier aporte xP
--
Diego Alejandro
Más información sobre la lista de distribución Cconclase