make regcharclass.pl use determinisitic hash ordering
authorYves Orton <demerphq@gmail.com>
Mon, 29 Oct 2012 09:18:24 +0000 (10:18 +0100)
committerYves Orton <demerphq@gmail.com>
Mon, 29 Oct 2012 09:18:24 +0000 (10:18 +0100)
ext/Hash-Util/Util.xs
regcharclass.h
regen/regcharclass.pl

index 678e64d..2df6486 100644 (file)
@@ -60,3 +60,31 @@ hv_store(hash, key, val)
            XSRETURN_YES;
        }
     }
+
+
+
+void
+hash_seed()
+    PROTOTYPE:
+    CODE:
+    assert(PERL_HASH_SEED_SET == TRUE);
+    XSRETURN_UV((PERL_HASH_SEED) & 0xFFFFFFFF);
+
+void
+hash_function_name()
+    PROTOTYPE:
+    CODE:
+    XSRETURN_PV(PERL_HASH_FUNC);
+
+void
+hash_value(string)
+       SV* string
+    PROTOTYPE: $
+    CODE:
+    STRLEN len;
+    char *pv;
+    UV uv;
+
+    pv= SvPV(string,len);
+    PERL_HASH(uv,pv,len);
+    XSRETURN_UV(uv);
index 17dee91..3b1772d 100644 (file)
     : ( 0xE1 == ((U8*)s)[0] ) ?                                             \
        ( ( 0xBC == ((U8*)s)[1] ) ?                                         \
            ( ( ( ( ( ((U8*)s)[2] & 0xD8 ) == 0x80 ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\
-       : ( ( ( ( 0xBD == ((U8*)s)[1] ) && ( ( ( ((U8*)s)[2] & 0xF8 ) == 0xA0 ) || ((U8*)s)[2] == 0xB0 || ( ( ((U8*)s)[2] & 0xF7 ) == 0xB4 ) ) ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\
+       : ( ( ( ( 0xBD == ((U8*)s)[1] ) && ( ( ( ((U8*)s)[2] & 0xF8 ) == 0xA0 ) || ( ( ((U8*)s)[2] & 0xFB ) == 0xB0 ) || ((U8*)s)[2] == 0xBC ) ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 4) ?                                                           \
     ( ( 0x61 == ((U8*)s)[0] ) ?                                             \
     : ( 0xE1 == ((U8*)s)[0] ) ?                                             \
        ( ( 0xBC == ((U8*)s)[1] ) ?                                         \
            ( ( ( ( ( ((U8*)s)[2] & 0xD8 ) == 0x80 ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\
-       : ( ( ( ( 0xBD == ((U8*)s)[1] ) && ( ( ( ((U8*)s)[2] & 0xF8 ) == 0xA0 ) || ((U8*)s)[2] == 0xB0 || ( ( ((U8*)s)[2] & 0xF7 ) == 0xB4 ) ) ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\
+       : ( ( ( ( 0xBD == ((U8*)s)[1] ) && ( ( ( ((U8*)s)[2] & 0xF8 ) == 0xA0 ) || ( ( ((U8*)s)[2] & 0xFB ) == 0xB0 ) || ((U8*)s)[2] == 0xBC ) ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\
     : 0 )                                                                   \
 : ((e)-(s) > 3) ?                                                           \
     ( ( 0x61 == ((U8*)s)[0] ) ?                                             \
index b7dddd2..021a957 100755 (executable)
@@ -758,7 +758,7 @@ sub calculate_mask(@) {
     my @final_results;
     foreach my $count (reverse sort { $a <=> $b } keys %hash) {
         my $need = 2 ** $count;     # Need 8 values for 3 differing bits, etc
-        foreach my $bits (keys $hash{$count}) {
+        foreach my $bits (sort keys $hash{$count}) {
 
             print STDERR __LINE__, ": For $count bit(s) difference ($bits), need $need; have ", scalar @{$hash{$count}{$bits}}, "\n" if DEBUG;
 
@@ -831,8 +831,8 @@ sub calculate_mask(@) {
 
                 # These values are now spoken for.  Remove them from future
                 # consideration
-                foreach my $remove_count (keys %hash) {
-                    foreach my $bits (keys %{$hash{$remove_count}}) {
+                foreach my $remove_count (sort keys %hash) {
+                    foreach my $bits (sort keys %{$hash{$remove_count}}) {
                         foreach my $to_remove (@subset) {
                             @{$hash{$remove_count}{$bits}} = grep { $_ != $to_remove } @{$hash{$remove_count}{$bits}};
                         }
@@ -846,7 +846,7 @@ sub calculate_mask(@) {
     # individually.
     my @individuals;
     foreach my $count (reverse sort { $a <=> $b } keys %hash) {
-        foreach my $bits (keys $hash{$count}) {
+        foreach my $bits (sort keys $hash{$count}) {
             foreach my $remaining (@{$hash{$count}{$bits}}) {
 
                 # If we already know about this value, just ignore it.
@@ -1216,7 +1216,7 @@ if ( !caller ) {
                                                                 # first, as
                                                                 # traditional
         if (%mods) {
-            die "Unknown modifiers: ", join ", ", map { "'$_'" } keys %mods;
+            die "Unknown modifiers: ", join ", ", map { "'$_'" } sort keys %mods;
         }
 
         foreach my $type_spec ( @types ) {