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 

Reply via email to