[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bicho muy gordo. (expresiones regulares)



Bueno parece que el error que yo detecté tal como sospechaba tiene
una repercusión bastante grande pero no es facil determinar con precisión
a que afecta y a que no afecta, asi que voy a recopilar la información
que me ha llegado gracias a vosotros.

La cosa en mi opinión, es tan gorda que tenía miedo de estar equivocandome 
en alguna tontería, pero ya con lo que me habeis dicho lo que me pregunto 
es como una cosa así ha conseguido pasar desapercibida tanto tiempo.

	Afecta a Potato 2.2r3, pero también aparece en una RedHat 7.1 con 
	kernel 2.4.9, y a una Woody, pero seguro que no queda en eso la
	cosa.

	Afecta a LANG=es_ES pero no parece afectar a otras como LANG=es, 
	o LANG=es_AR, LANG=es_MX, etc.

	No parece que afecte al uso de '[[:upper:]]' y '[[:lower:]]'.
	
	No afecta por igual a todos los programas. Por ejemplo a sed
	parece que no le afecta y tengo noticias de que algunas
	pruebas con perl y python parecen funcionar sin problemas.

	Yo he realizado una prueba más con el propio bash y crei que
	no le afectaba (no había exportado LANG) pero si.
	
	$ ls ?
	A  B  Y  Z  a  b  y  z
	
	$ ls [A-Z]
	A  B  Y  Z  b  y  z

	No he probado con lex pero tiene que haber muchos programas
	afectados.

	Parece que afecta a egrep '[A-Z]', egrep '[a-z] pero no es solo
	a egrep porque tambien afecta a bash como ya he dicho y a un 
	programita que hice yo en C que usaba directamente la familia 
	funciónes GNU para expresiones regulares POSIX ( regcomp,  regexec,  
	regerror, regfree), que forman parte de la glibc. 
	
	El programa que yo hice es:

        
        ============8<-----------------------------------------------
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <locale.h>
        #include <libintl.h>
        #include <regex.h>
        char cadaux[300];
        
        int EvalRegExpReg(char *Patron, char *Cad){
        regex_t preg;
        int cod1, cod2;
        
          cod1=regcomp(&preg, Patron, REG_EXTENDED);
          if (cod1!=0){
          	cod2=regerror(cod1, &preg, cadaux, sizeof(cadaux));
        	fprintf(stderr, "Error '%s' compilando patrón '%s'\n", 
        			cadaux, Patron);	
        	return cod1;
          }
          cod1=regexec(&preg, Cad, 0, NULL,  0);
          if (cod1!=0){
          	cod2=regerror(cod1, &preg, cadaux, sizeof(cadaux));
        	fprintf(stderr, "ExpresionRegular='%s', Cadena='%s'\n",
        		Patron, Cad);	
        	fprintf(stderr, "Resultado= '%s'\n", cadaux);	
          }
          regfree(&preg);
          return cod1;
        }
        	  
        main(int argc, char **argv){
        	setlocale(LC_ALL, "");
        	if (argc!=3){
        		fprintf(stderr, "Uso:\nregexpr <patron> <cadena>\n");
        		exit (-1);
        	}
        	exit (EvalRegExpReg( argv[1], argv[2]));
        }
        
        ============8<------------------------------------------------------



	Manuel García <caronte@eresmas.net> apunta la posibilidad de
	que sea algún problema con ..
	
	LC_CTYPE Character classification and case conversion.
        
        

Un saludo

Antonio Castro

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
        /\     /\      Ciberdroide Informática (Tienda de Linux)
          \\W//            <<< http://www.ciberdroide.com >>>
	 _|0 0|_                                                    
+-oOOO--(___o___)--OOOo----------------------------------------------------+ 
|  . . . . U U . . . . Antonio Castro Snurmacher  acastro@ciberdroide.com  |  
|  . . . . . . . . . .                                                     | 
+()()()----------()()()----------------------------------------------------+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** |
| <<< http://www.ciberdroide.com/misc/donde/dondelinux.html >>>            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+




Reply to: