On Mon, 21 Mar 2005 11:57:23 +0000, Nicholas Clark <[EMAIL PROTECTED]> wrote: > The regexp trie code issues some interesting looking warnings on VMS, and > also fails due to some char/unsigned char pointer issues. I think I could > fix the latter without understanding the code logic (although I'm keener > on checking MakeMaker on something first, so I'll try maint), but I'm not > confident on whether the warnings are valid problems.
Attached patch should I hope fix these problems. Also I forgot to bound check the upper bound so this fixes that too. Cheers, Yves -- perl -Mre=debug -e "/just|another|perl|hacker/"
--- regcomp.c 2005-03-21 11:06:39.000000000 +0100 +++ /blead/regcomp.c 2005-03-21 21:59:55.565392000 +0100 @@ -1160,8 +1160,7 @@ */ trie->states[ state ].trans.base=base; } - Renew( trie->trans, tp + 1, reg_trie_trans ); - + trie->lasttrans = tp + 1; } } else { /* @@ -1409,7 +1408,7 @@ } } } - Renew( trie->trans, pos + 1, reg_trie_trans); + trie->lasttrans = pos + 1; Renew( trie->states, laststate + 1, reg_trie_state); DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log, " Alloc: %d Orig: %d elements, Final:%d. Savings of %%%5.2f\n", @@ -1419,6 +1418,8 @@ } /* end table compress */ } + /* resize the trans array to remove unused space */ + Renew( trie->trans, trie->lasttrans, reg_trie_trans); DEBUG_TRIE_COMPILE_r({ U32 state; @@ -1436,9 +1437,11 @@ } } PerlIO_printf( Perl_debug_log, "\n-----:-----------------------"); + for( state = 0 ; state < trie->uniquecharcount ; state++ ) PerlIO_printf( Perl_debug_log, "-----"); PerlIO_printf( Perl_debug_log, "\n"); + for( state = 1 ; state < trie->laststate ; state++ ) { U32 base = trie->states[ state ].trans.base; @@ -1455,14 +1458,16 @@ if ( base ) { U32 ofs = 0; - while( ( base + ofs - trie->uniquecharcount ) >=0 && - trie->trans[ base + ofs - trie->uniquecharcount ].check != state ) + while( ( base + ofs < trie->uniquecharcount ) || + ( base + ofs - trie->uniquecharcount < trie->lasttrans + && trie->trans[ base + ofs - trie->uniquecharcount ].check != state)) ofs++; PerlIO_printf( Perl_debug_log, "+%02X[ ", ofs); for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) { - if ( ( base + ofs - trie->uniquecharcount>=0) && + if ( ( base + ofs >= trie->uniquecharcount ) && + ( base + ofs - trie->uniquecharcount < trie->lasttrans ) && trie->trans[ base + ofs - trie->uniquecharcount ].check == state ) { PerlIO_printf( Perl_debug_log, "%04X ", --- regcomp.h 2005-03-18 16:34:52.000000000 +0100 +++ /blead/regcomp.h 2005-03-21 21:59:55.565392000 +0100 @@ -463,6 +463,7 @@ U16 wordcount; STRLEN charcount; U32 laststate; + U32 lasttrans; U16 *charmap; HV *widecharmap; reg_trie_state *states; --- regexec.c 2005-03-21 16:27:37.000000000 +0100 +++ /blead/regexec.c 2005-03-21 21:59:55.575406400 +0100 @@ -2361,7 +2361,8 @@ } \ } \ if ( charid && \ - ( base + charid - 1 - trie->uniquecharcount ) >=0 && \ + ( base + charid > trie->uniquecharcount ) && \ + ( base + charid - 1 - trie->uniquecharcount < trie->lasttrans) && \ trie->trans[ base + charid - 1 - trie->uniquecharcount ].check == state ) \ { \ state = trie->trans[ base + charid - 1 - trie->uniquecharcount ].next; \ @@ -2731,7 +2732,7 @@ tmp ? SvPV_nolen( *tmp ) : "not compiled under -Dr", PL_colors[5] ); }); - PL_reginput = accept_buff[ 0 ].endpos; + PL_reginput = (char *)accept_buff[ 0 ].endpos; /* in this case we free tmps/leave before we call regmatch as we wont be using accept_buff again. */ FREETMPS; @@ -2772,7 +2773,7 @@ accept_buff[ accepted ] = tmp; best = accepted; } - PL_reginput = accept_buff[ best ].endpos; + PL_reginput = (char *)accept_buff[ best ].endpos; /* as far as I can tell we only need the SAVETMPS/FREETMPS