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: