Re: regexp trie fails compile on VMS
Yves Orton [Mon, 21 Mar 2005 22:29:09 +0000 (23:29 +0100)]
Message-ID: <9b18b311050321132917a4b1c7@mail.gmail.com>

p4raw-id: //depot/perl@24059

regcomp.c
regcomp.h
regexec.c

index 1f9161a..5bfcd70 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -1160,8 +1160,7 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs
                 */
                 trie->states[ state ].trans.base=base;
             }
-            Renew( trie->trans, tp + 1, reg_trie_trans );
-
+            trie->lasttrans = tp + 1;
         }
     } else {
         /*
@@ -1409,7 +1408,7 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs
                 }
             }
         }
-        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 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs
 
         } /* 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 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs
             }
         }
         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 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs
             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 ",
index 94e54e8..dbf55f5 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -463,6 +463,7 @@ struct _reg_trie_data {
     U16              wordcount;
     STRLEN           charcount;
     U32              laststate;
+    U32              lasttrans;
     U16              *charmap;
     HV               *widecharmap;
     reg_trie_state   *states;
index 9efb479..fb455a6 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -2361,7 +2361,8 @@ typedef union re_unwind_t {
             }                                                           \
         }                                                               \
         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 @@ S_regmatch(pTHX_ regnode *prog)
                            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 @@ S_regmatch(pTHX_ regnode *prog)
                            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