From: Christian P. <cpo...@ya...> - 2004-11-19 15:37:31
|
Hello, this time I searched many available clisp resources like the FAQ or the impnotes. Anyway, there seems to be a problem with your regexp module in version 2.33.2: I compiled it from scratch on my FreeBSD 5.3 box, ran it with regexp support and just tried out the example you mention in the impnotes. This is what I get for the first one: [1]> (regexp:match "quick" "The quick brown fox jumps quickly.") #S(REGEXP:MATCH :START 4 :END 0) [2]> (regexp:match "quick" "The quick brown fox jumps quickly." :start 8) #S(REGEXP:MATCH :START 26 :END 8) [3]> maybe this information is helpful: cp@kamino$ clisp -K full --version GNU CLISP 2.33.2 (2004-06-02) (built 3309862150) (memory 3309862414) Software: GNU C 3.4.2 [FreeBSD] 20040728 ANSI C program Features: (REGEXP CLOS LOOP COMPILER CLISP ANSI-CL COMMON-LISP LISP=CL INTERPRETER SOCKETS GENERIC-STREAMS LOGICAL-PATHNAMES SCREEN UNICODE BASE-CHAR=CHARACTER UNIX) Installation directory: /usr/home/cp/usr/lib/clisp/ User language: ENGLISH Machine: I386 (I386) kamino.hom [192.168.0.2] I started using Edi Weitz's regexp package, but actually I want to use yours. |
From: Hoehle, Joerg-C. <Joe...@t-...> - 2004-11-26 12:47:36
|
Hi, St=E9phane Legrand wrote: >> int i; >> printf("match %2d: %2d %2d\n",i, >> matches[i].rm_so,matches[i].rm_eo); }}} >And indeed, if you replace:=20 > printf("match %2d: %2d %2d\n",i, >with > printf("match %2d: %lld %lld\n",i, >you get a right answer This code is as broken as the original one. C does AFAIK not provide = for printf() to infer a %d form that matches the variant of int passed = as argument. Therefore, explicit casting is your only choice. rm_so/eo is of type regoff_t, itself of type int on my Suse Linux 8.1 = x86 box. Your example reveals that your machine uses another type. Use printf %ld (long) rm_so or printf %d (int) rm_so or printf %lld (what's that?) rm_so according to your taste and expectations. IIRC, the value is signed, because -1 is returned for nonmatches. Regards, J=F6rg H=F6hle |
From: Pascal J.B. <pj...@in...> - 2004-11-19 16:05:19
|
Christian Pohlmann writes: > Hello, > > this time I searched many available clisp resources like the FAQ or the > impnotes. Anyway, there seems to be a problem with your regexp module in > version 2.33.2: I compiled it from scratch on my FreeBSD 5.3 box, ran it > with regexp support and just tried out the example you mention in the > impnotes. This is what I get for the first one: > > [1]> (regexp:match "quick" "The quick brown fox jumps quickly.") > #S(REGEXP:MATCH :START 4 :END 0) > [2]> (regexp:match "quick" "The quick brown fox jumps quickly." :start 8) > #S(REGEXP:MATCH :START 26 :END 8) > [3]> > > > maybe this information is helpful: > cp@kamino$ clisp -K full --version > GNU CLISP 2.33.2 (2004-06-02) (built 3309862150) (memory 3309862414) > Software: GNU C 3.4.2 [FreeBSD] 20040728 ANSI C program > Features: > (REGEXP CLOS LOOP COMPILER CLISP ANSI-CL COMMON-LISP LISP=CL INTERPRETER > SOCKETS GENERIC-STREAMS LOGICAL-PATHNAMES SCREEN UNICODE BASE-CHAR=CHARACTER > UNIX) > Installation directory: /usr/home/cp/usr/lib/clisp/ > User language: ENGLISH > Machine: I386 (I386) kamino.hom [192.168.0.2] > > > I started using Edi Weitz's regexp package, but actually I want to use > yours. There are bugged implementations of regex! Fetch gnu regex (from glibc) and compile it with clisp. See: http://sourceforge.net/mailarchive/message.php?msg_id=9272757 Use this c program to check your implementation of regex: #include <sys/types.h> #include <regex.h> #include <stdio.h> int main(int argc,char** argv){ printf("%d\n",argc); if(argc==3){ regex_t* re=(regex_t*)malloc(sizeof(regex_t)); int status=regcomp(re,argv[1],0); if(status!=0){ char buf[128]; regerror(status,re,buf,sizeof(buf)); printf("regcomp error %s\n",buf); return(1); } { int i; regmatch_t* matches=(regmatch_t*)malloc((re->re_nsub+1) *sizeof(regmatch_t)); status=regexec(re,argv[2],re->re_nsub+1,matches,0); if(status!=0){ char buf[128]; regerror(status,re,buf,sizeof(buf)); printf("regexec error %s\n",buf); return(1); } for(i=0;i<=re->re_nsub;i++){ if((0<=matches[i].rm_so)&&(0<=matches[i].rm_eo)){ printf("match %2d: %2d %2d\n",i, matches[i].rm_so,matches[i].rm_eo); }}} }else{ printf("usage: %s pattern string\n",argv[0]); } return(0); } -- __Pascal Bourguignon__ http://www.informatimago.com/ The world will now reboot; don't bother saving your artefacts. |
From: Stephane L. <ste...@fr...> - 2004-11-22 14:36:17
|
On Fri, Nov 19, 2004 at 05:05:07PM +0100, Pascal J.Bourguignon wrote: > Christian Pohlmann writes: > > Hello, > >=20 > > this time I searched many available clisp resources like the FAQ or t= he > > impnotes. Anyway, there seems to be a problem with your regexp module= in > > version 2.33.2: I compiled it from scratch on my FreeBSD 5.3 box, ran= it > > with regexp support and just tried out the example you mention in the > > impnotes. This is what I get for the first one: > >=20 > > [1]> (regexp:match "quick" "The quick brown fox jumps quickly.") > > #S(REGEXP:MATCH :START 4 :END 0) > > [2]> (regexp:match "quick" "The quick brown fox jumps quickly." :star= t 8) > > #S(REGEXP:MATCH :START 26 :END 8) > > [3]>=20 > >=20 > > ... >=20 > There are bugged implementations of regex! > Fetch gnu regex (from glibc) and compile it with clisp. >=20 > See: http://sourceforge.net/mailarchive/message.php?msg_id=3D9272757 >=20 >=20 > Use this c program to check your implementation of regex: >=20 > #include <sys/types.h> > #include <regex.h> > #include <stdio.h> >=20 > int main(int argc,char** argv){ > printf("%d\n",argc); > if(argc=3D=3D3){ > regex_t* re=3D(regex_t*)malloc(sizeof(regex_t)); > int status=3Dregcomp(re,argv[1],0); > if(status!=3D0){ > char buf[128]; > regerror(status,re,buf,sizeof(buf)); > printf("regcomp error %s\n",buf); > return(1); } > { > int i; > regmatch_t* matches=3D(regmatch_t*)malloc((re->re_nsub+= 1) > *sizeof(regmatc= h_t)); > status=3Dregexec(re,argv[2],re->re_nsub+1,matches,0); > if(status!=3D0){ > char buf[128]; > regerror(status,re,buf,sizeof(buf)); > printf("regexec error %s\n",buf); > return(1); } > for(i=3D0;i<=3Dre->re_nsub;i++){ > if((0<=3Dmatches[i].rm_so)&&(0<=3Dmatches[i].rm_eo)= ){ > printf("match %2d: %2d %2d\n",i, > matches[i].rm_so,matches[i].rm_eo); }}} > }else{ > printf("usage: %s pattern string\n",argv[0]); } > return(0); } >=20 Hello, As i use myself FreeBSD, i did a search on Google about this problem. Well, it seems it's not a bug in the regexp library but a typing mistake (please see http://www.omnigroup.com/mailman/archive/macosx-dev/2000-November/006871.= html). And indeed, if you replace:=20 printf("match %2d: %2d %2d\n",i, with printf("match %2d: %lld %lld\n",i, =20 you get a right answer (tested on a FreeBSD 5.3-STABLE, Intel Pentium II processor): % ./a.out "quick" "The quick brown fox jumps quickly." 3 match 0: 4 9 % ./a.out "." "a" 3 match 0: 0 1 Regards, Stephane Legrand. --=20 Je recherche un emploi de d=E9veloppeur/admin. sys. (FreeBSD,Linux,PHP,Perl,MySQL,OCaml,Tcl/Tk...) =3D=3D> http://stephleg.free.fr/cv.pdf <=3D=3D |
From: Sam S. <sd...@gn...> - 2004-11-19 16:29:27
|
> * Christian Pohlmann <pcbuyznaa01@lnubb.pbz> [2004-11-19 16:38:19 +0100]: > > Hello, > > this time I searched many available clisp resources like the FAQ or the > impnotes. Anyway, there seems to be a problem with your regexp module in > version 2.33.2: I compiled it from scratch on my FreeBSD 5.3 box, ran it > with regexp support and just tried out the example you mention in the > impnotes. This is what I get for the first one: > > [1]> (regexp:match "quick" "The quick brown fox jumps quickly.") > #S(REGEXP:MATCH :START 4 :END 0) > [2]> (regexp:match "quick" "The quick brown fox jumps quickly." :start 8) > #S(REGEXP:MATCH :START 26 :END 8) > [3]> WFM (cygwin, linux): [1]> (regexp:match "quick" "The quick brown fox jumps quickly." :start 8) #S(REGEXP:MATCH :START 26 :END 31) [2]> (regexp:match "quick" "The quick brown fox jumps quickly.") #S(REGEXP:MATCH :START 4 :END 9) [3]> could you please debug this? $ ./configure --with-debug --with-module regexp --build build-g $ cd build-g $ gdb full/lisp.run (gdb) full (gdb) break C_subr_regexp_regexp_exec (gdb) run > (regexp:match "quick" "The quick brown fox jumps quickly.") (gdb) then step through the end and see whether ret[0].rm_eo is 0 and not 9 as it should be. if it is 0, file a bug report with your OS vendor. if it is 9, try to figure out why 0 is used. Thanks. -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> Do not tell me what to do and I will not tell you where to go. |
From: Pascal J.B. <pj...@in...> - 2004-11-19 16:58:46
|
Sam Steingold writes: > > * Christian Pohlmann <pcbuyznaa01@lnubb.pbz> [2004-11-19 16:38:19 +0100]: > > > > Hello, > > > > this time I searched many available clisp resources like the FAQ or the > > impnotes. Anyway, there seems to be a problem with your regexp module in > > version 2.33.2: I compiled it from scratch on my FreeBSD 5.3 box, ran it > > with regexp support and just tried out the example you mention in the > > impnotes. This is what I get for the first one: > > > > [1]> (regexp:match "quick" "The quick brown fox jumps quickly.") > > #S(REGEXP:MATCH :START 4 :END 0) > > [2]> (regexp:match "quick" "The quick brown fox jumps quickly." :start 8) > > #S(REGEXP:MATCH :START 26 :END 8) > > [3]> > > WFM (cygwin, linux): Yes, gnu regex has not this bug, but FreeBSD and MacOSX have it. I'm still believing that the regexp module of clisp should include the source of gnu regex.c and if some sanity tests don't succeed at configure time, it should use the shipped regex.c instead of that provided by the system. -- __Pascal Bourguignon__ http://www.informatimago.com/ The world will now reboot; don't bother saving your artefacts. |
From: Sam S. <sd...@gn...> - 2004-11-21 01:31:21
|
> * Pascal J.Bourguignon <cwo@vasbezngvzntb.pbz> [2004-11-19 17:58:31 +0100]: > > I'm still believing that the regexp module of clisp should include the > source of gnu regex.c and if some sanity tests don't succeed at > configure time, it should use the shipped regex.c instead of that > provided by the system. done. please check out CVS HEAD. -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> MS: Brain off-line, please wait. |
From: Christian P. <cpo...@ya...> - 2004-11-19 16:37:58
|
On Fri, 19 Nov 2004 17:05:07 +0100, Pascal J. Bourguignon wrote: > > There are bugged implementations of regex! > Fetch gnu regex (from glibc) and compile it with clisp. > > See: http://sourceforge.net/mailarchive/message.php?msg_id=9272757 > > > Use this c program to check your implementation of regex: > thanks for your quick reply. I compiled your c source to test my regex lib and it's indeed buggy. So I chose to recompile clisp with the --without-sysre switch, but I still get the same buggy output. |
From: Sam S. <sd...@gn...> - 2004-11-19 16:51:26
|
> * Christian Pohlmann <pcbuyznaa01@lnubb.pbz> [2004-11-19 17:38:41 +0100]: > > On Fri, 19 Nov 2004 17:05:07 +0100, Pascal J. Bourguignon wrote: > >> >> There are bugged implementations of regex! >> Fetch gnu regex (from glibc) and compile it with clisp. >> >> See: http://sourceforge.net/mailarchive/message.php?msg_id=9272757 >> >> Use this c program to check your implementation of regex: > > thanks for your quick reply. I compiled your c source to test my regex > lib and it's indeed buggy. So I chose to recompile clisp with the > --without-sysre switch, but I still get the same buggy output. is it possible that you might still be using the system implementation of regexp? if regexec() et al are in libc and not in libregexp or something, they are always linked to CLISP. you might need to rename all the regexp functions from things like regexec() to clisp_regexec() in regex.c, regex.h, regexi.c and then rebuild everything. -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> My inferiority complex is not as good as yours. |
From: Pascal J.B. <pj...@in...> - 2004-11-19 17:57:28
|
(Oops, Sam, sorry, I just saw now that regexp module do provide now a regex.c; I was echoing an old message). Christian Pohlmann writes: > On Fri, 19 Nov 2004 17:05:07 +0100, Pascal J. Bourguignon wrote: > > > > > There are bugged implementations of regex! > > Fetch gnu regex (from glibc) and compile it with clisp. > > > > See: http://sourceforge.net/mailarchive/message.php?msg_id=9272757 > > > > > > Use this c program to check your implementation of regex: > > > > thanks for your quick reply. I compiled your c source to test my regex lib > and it's indeed buggy. So I chose to recompile clisp with the > --without-sysre switch, but I still get the same buggy output. --without-sysre will work in the _next_ version, that is, 2.33.3. (perhaps it works with the current CVS version?) You can check with: #1# cd clisp-2.33.2 ./configure --with-module=regexp --without-sysre cd src ./makemake --with-dynamic-ffi --with-module=regexp \ --without-sysre > Makefile make grep NEW_LIBS src/regexp/link.sh if you get: NEW_LIBS="$file_list regex.o" then it's using the regex.c provided with the regexp module. If you get: NEW_LIBS="$file_list " then it's not. (That's what I get with clisp-2.33.2). The only way I can imagine for now is to edit regexp/link.sh.in and substitute @REGEX_O@ with regex.o before starting over from #1#. -- __Pascal Bourguignon__ http://www.informatimago.com/ The world will now reboot; don't bother saving your artefacts. |