2 package CharClass::Matcher;
6 use warnings FATAL => 'all';
7 use Text::Wrap qw(wrap);
9 $Data::Dumper::Useqq= 1;
10 our $hex_fmt= "0x%02X";
15 sub ASCII_PLATFORM { (ord('A') == 65) }
17 require 'regen/regen_lib.pl';
21 CharClass::Matcher -- Generate C macros that match character classes efficiently
25 perl Porting/regcharclass.pl
29 Dynamically generates macros for detecting special charclasses
30 in latin-1, utf8, and codepoint forms. Macros can be set to return
31 the length (in bytes) of the matched codepoint, and/or the codepoint itself.
33 To regenerate F<regcharclass.h>, run this script from perl-root. No arguments
36 Using WHATEVER as an example the following macros can be produced, depending
37 on the input parameters (how to get each is described by internal comments at
38 the C<__DATA__> line):
42 =item C<is_WHATEVER(s,is_utf8)>
44 =item C<is_WHATEVER_safe(s,e,is_utf8)>
46 Do a lookup as appropriate based on the C<is_utf8> flag. When possible
47 comparisons involving octect<128 are done before checking the C<is_utf8>
48 flag, hopefully saving time.
50 The version without the C<_safe> suffix should be used only when the input is
51 known to be well-formed.
53 =item C<is_WHATEVER_utf8(s)>
55 =item C<is_WHATEVER_utf8_safe(s,e)>
57 Do a lookup assuming the string is encoded in (normalized) UTF8.
59 The version without the C<_safe> suffix should be used only when the input is
60 known to be well-formed.
62 =item C<is_WHATEVER_latin1(s)>
64 =item C<is_WHATEVER_latin1_safe(s,e)>
66 Do a lookup assuming the string is encoded in latin-1 (aka plan octets).
68 The version without the C<_safe> suffix should be used only when it is known
69 that C<s> contains at least one character.
71 =item C<is_WHATEVER_cp(cp)>
73 Check to see if the string matches a given codepoint (hypothetically a
74 U32). The condition is constructed as to "break out" as early as
75 possible if the codepoint is out of range of the condition.
79 (cp==X || (cp>X && (cp==Y || (cp>Y && ...))))
81 Thus if the character is X+1 only two comparisons will be done. Making
82 matching lookups slower, but non-matching faster.
84 =item C<what_len_WHATEVER_FOO(arg1, ..., len)>
86 A variant form of each of the macro types described above can be generated, in
87 which the code point is returned by the macro, and an extra parameter (in the
88 final position) is added, which is a pointer for the macro to set the byte
89 length of the returned code point.
91 These forms all have a C<what_len> prefix instead of the C<is_>, for example
92 C<what_len_WHATEVER_safe(s,e,is_utf8,len)> and
93 C<what_len_WHATEVER_utf8(s,len)>.
95 These forms should not be used I<except> on small sets of mostly widely
96 separated code points; otherwise the code generated is inefficient. For these
97 cases, it is best to use the C<is_> forms, and then find the code point with
98 C<utf8_to_uvchr_buf>(). This program can fail with a "deep recursion"
99 message on the worst of the inappropriate sets. Examine the generated macro
100 to see if it is acceptable.
102 =item C<what_WHATEVER_FOO(arg1, ...)>
104 A variant form of each of the C<is_> macro types described above can be generated, in
105 which the code point and not the length is returned by the macro. These have
106 the same caveat as L</what_len_WHATEVER_FOO(arg1, ..., len)>, plus they should
107 not be used where the set contains a NULL, as 0 is returned for two different
108 cases: a) the set doesn't include the input code point; b) the set does
109 include it, and it is a NULL.
115 perltidy -st -bt=1 -bbt=0 -pt=0 -sbt=1 -ce -nwls== "%f"
120 Author: Yves Orton (demerphq) 2007. Maintained by Perl5 Porters.
124 No tests directly here (although the regex engine will fail tests
125 if this code is broken). Insufficient documentation and no Getopts
126 handler for using the module as a script.
130 You may distribute under the terms of either the GNU General Public
131 License or the Artistic License, as specified in the README file.
135 # Sub naming convention:
136 # __func : private subroutine, can not be called as a method
137 # _func : private method, not meant for external use
138 # func : public method.
141 #-------------------------------------------------------------------------------
143 # ($cp,$n,$l,$u)=__uni_latin($str);
145 # Return a list of arrays, each of which when interpreted correctly
146 # represent the string in some given encoding with specific conditions.
148 # $cp - list of codepoints that make up the string.
149 # $n - list of octets that make up the string if all codepoints are invariant
150 # regardless of if the string is in UTF-8 or not.
151 # $l - list of octets that make up the string in latin1 encoding if all
152 # codepoints < 256, and at least one codepoint is UTF-8 variant.
153 # $u - list of octets that make up the string in utf8 if any codepoint is
157 #-----------+----------
158 # 0 - 127 : $n (127/128 are the values for ASCII platforms)
168 my $only_has_invariants = 1;
169 for my $ch ( split //, $str ) {
172 push @cp_high, $cp if $cp > 255;
173 $max= $cp if $max < $cp;
174 if (! ASCII_PLATFORM && $only_has_invariants) {
176 $only_has_invariants = 0;
180 utf8::upgrade($temp);
181 my @utf8 = unpack "U0C*", $temp;
182 $only_has_invariants = (@utf8 == 1 && $utf8[0] == $cp);
187 $only_has_invariants = $max < 128 if ASCII_PLATFORM;
188 if ($only_has_invariants) {
191 $l= [@cp] if $max && $max < 256;
195 $u= [ unpack "U0C*", $u ] if defined $u;
197 return ( \@cp, \@cp_high, $n, $l, $u );
201 # $clean= __clean($expr);
203 # Cleanup a ternary expression, removing unnecessary parens and apply some
204 # simplifications using regexes.
213 $parens= qr/ (?> \( (?> (?: (?> [^()]+ ) | (??{ $parens }) )* ) \) ) /x;
215 ## remove redundant parens
216 1 while $expr =~ s/ \( \s* ( $parens ) \s* \) /$1/gx;
219 # repeatedly simplify conditions like
220 # ( (cond1) ? ( (cond2) ? X : Y ) : Y )
222 # ( ( (cond1) && (cond2) ) ? X : Y )
223 # Also similarly handles expressions like:
224 # : (cond1) ? ( (cond2) ? X : Y ) : Y )
225 # Note the inclusion of the close paren in ([:()]) and the open paren in ([()]) is
226 # purely to ensure we have a balanced set of parens in the expression which makes
227 # it easier to understand the pattern in an editor that understands paren's, we do
228 # not expect either of these cases to actually fire. - Yves
234 \? \s* ($parens|[^()?:\s]+?) \s*
235 : \s* ($parens|[^()?:\s]+?) \s*
239 /$1 ( $2 && $3 ) ? $4 : $5 $6/gx;
240 #$expr=~s/\(\(U8\*\)s\)\[(\d+)\]/S$1/g if length $expr > 8000;
241 #$expr=~s/\s+//g if length $expr > 8000;
243 die "Expression too long" if length $expr > 8000;
249 # $text= __macro(@args);
250 # Join args together by newlines, and then neatly add backslashes to the end
251 # of every line as expected by the C pre-processor for #define's.
255 my $str= join "\n", @_;
257 my @lines= map { s/\s+$//; s/\t/ /g; $_ } split /\n/, $str;
258 my $last= pop @lines;
259 $str= join "\n", ( map { sprintf "%-76s\\", $_ } @lines ), $last;
260 1 while $str =~ s/^(\t*) {8}/$1\t/gm;
265 # my $op=__incrdepth($op);
267 # take an 'op' hashref and add one to it and all its childrens depths.
272 return unless ref $op;
274 __incrdepth( $op->{yes} );
275 __incrdepth( $op->{no} );
279 # join two branches of an opcode together with a condition, incrementing
280 # the depth on the yes branch when we do so.
281 # returns the new root opcode of the tree.
283 my ( $cond, $yes, $no )= @_;
286 yes => __incrdepth( $yes ),
296 # my $obj=CLASS->new(op=>'SOMENAME',title=>'blah',txt=>[..]);
298 # Create a new CharClass::Matcher object by parsing the text in
299 # the txt array. Currently applies the following rules:
301 # Element starts with C<0x>, line is evaled the result treated as
302 # a number which is passed to chr().
304 # Element starts with C<">, line is evaled and the result treated
307 # Each string is then stored in the 'strs' subhash as a hash record
308 # made up of the results of __uni_latin1, using the keynames
309 # 'low','latin1','utf8', as well as the synthesized 'LATIN1', 'high', and
310 # 'UTF8' which hold a merge of 'low' and their lowercase equivalents.
312 # Size data is tracked per type in the 'size' subhash.
320 die "in " . __PACKAGE__ . " constructor '$_;' is a mandatory field"
326 title => $opt{title} || '',
328 foreach my $txt ( @{ $opt{txt} } ) {
330 if ( $str =~ /^[""]/ ) {
332 } elsif ($str =~ / - /x ) { # A range: Replace this element on the
333 # list with its expansion
334 my ($lower, $upper) = $str =~ / 0x (.+?) \s* - \s* 0x (.+) /x;
335 die "Format must be like '0xDEAD - 0xBEAF'; instead was '$str'" if ! defined $lower || ! defined $upper;
336 foreach my $cp (hex $lower .. hex $upper) {
337 push @{$opt{txt}}, sprintf "0x%X", $cp;
340 } elsif ($str =~ s/ ^ N (?= 0x ) //x ) {
341 # Otherwise undocumented, a leading N means is already in the
342 # native character set; don't convert.
344 } elsif ( $str =~ /^0x/ ) {
347 # Convert from Unicode/ASCII to native, if necessary
348 $str = utf8::unicode_to_native($str) if ! ASCII_PLATFORM
351 } elsif ( $str =~ / \s* \\p \{ ( .*? ) \} /x) {
353 use Unicode::UCD qw(prop_invlist);
355 my @invlist = prop_invlist($property, '_perl_core_internal_ok');
358 # An empty return could mean an unknown property, or merely
359 # that it is empty. Call in scalar context to differentiate
360 my $count = prop_invlist($property, '_perl_core_internal_ok');
361 die "$property not found" unless defined $count;
364 # Replace this element on the list with the property's expansion
365 for (my $i = 0; $i < @invlist; $i += 2) {
366 foreach my $cp ($invlist[$i] .. $invlist[$i+1] - 1) {
368 # prop_invlist() returns native values; add leading 'N'
370 push @{$opt{txt}}, sprintf "N0x%X", $cp;
374 } elsif ($str =~ / ^ do \s+ ( .* ) /x) {
375 die "do '$1' failed: $!$@" if ! do $1 or $@;
377 } elsif ($str =~ / ^ & \s* ( .* ) /x) { # user-furnished sub() call
378 my @results = eval "$1";
379 die "eval '$1' failed: $@" if $@;
380 push @{$opt{txt}}, @results;
383 die "Unparsable line: $txt\n";
385 my ( $cp, $cp_high, $low, $latin1, $utf8 )= __uni_latin1( $str );
386 my $UTF8= $low || $utf8;
387 my $LATIN1= $low || $latin1;
388 my $high = (scalar grep { $_ < 256 } @$cp) ? 0 : $utf8;
389 #die Dumper($txt,$cp,$low,$latin1,$utf8)
390 # if $txt=~/NEL/ or $utf8 and @$utf8>3;
392 @{ $self->{strs}{$str} }{qw( str txt low utf8 latin1 high cp cp_high UTF8 LATIN1 )}=
393 ( $str, $txt, $low, $utf8, $latin1, $high, $cp, $cp_high, $UTF8, $LATIN1 );
394 my $rec= $self->{strs}{$str};
395 foreach my $key ( qw(low utf8 latin1 high cp cp_high UTF8 LATIN1) ) {
396 $self->{size}{$key}{ 0 + @{ $self->{strs}{$str}{$key} } }++
397 if $self->{strs}{$str}{$key};
399 $self->{has_multi} ||= @$cp > 1;
400 $self->{has_ascii} ||= $latin1 && @$latin1;
401 $self->{has_low} ||= $low && @$low;
402 $self->{has_high} ||= !$low && !$latin1;
404 $self->{val_fmt}= $hex_fmt;
405 $self->{count}= 0 + keys %{ $self->{strs} };
409 # my $trie = make_trie($type,$maxlen);
411 # using the data stored in the object build a trie of a specific type,
412 # and with specific maximum depth. The trie is made up the elements of
413 # the given types array for each string in the object (assuming it is
416 # returns the trie, or undef if there was no relevant data in the object.
420 my ( $self, $type, $maxlen )= @_;
422 my $strs= $self->{strs};
424 foreach my $rec ( values %$strs ) {
425 die "panic: unknown type '$type'"
426 if !exists $rec->{$type};
427 my $dat= $rec->{$type};
429 next if $maxlen && @$dat > $maxlen;
431 foreach my $elem ( @$dat ) {
432 $node->{$elem} ||= {};
433 $node= $node->{$elem};
435 $node->{''}= $rec->{str};
437 return 0 + keys( %trie ) ? \%trie : undef;
443 # This returns a list of the positions of the bits in the input word that
449 push @positions, $position if $word & 1;
456 # my $optree= _optree()
458 # recursively convert a trie to an optree where every node represents
464 my ( $self, $trie, $test_type, $ret_type, $else, $depth )= @_;
465 return unless defined $trie;
466 if ( $self->{has_multi} and $ret_type =~ /cp|both/ ) {
467 die "Can't do 'cp' optree from multi-codepoint strings";
470 $else= 0 unless defined $else;
471 $depth= 0 unless defined $depth;
473 # if we have an empty string as a key it means we are in an
474 # accepting state and unless we can match further on should
475 # return the value of the '' key.
476 if (exists $trie->{''} ) {
477 # we can now update the "else" value, anything failing to match
478 # after this point should return the value from this.
479 if ( $ret_type eq 'cp' ) {
480 $else= $self->{strs}{ $trie->{''} }{cp}[0];
481 $else= sprintf "$self->{val_fmt}", $else if $else > 9;
482 } elsif ( $ret_type eq 'len' ) {
484 } elsif ( $ret_type eq 'both') {
485 $else= $self->{strs}{ $trie->{''} }{cp}[0];
486 $else= sprintf "$self->{val_fmt}", $else if $else > 9;
487 $else= "len=$depth, $else";
490 # extract the meaningful keys from the trie, filter out '' as
491 # it means we are an accepting state (end of sequence).
492 my @conds= sort { $a <=> $b } grep { length $_ } keys %$trie;
494 # if we haven't any keys there is no further we can match and we
495 # can return the "else" value.
496 return $else if !@conds;
499 my $test= $test_type =~ /^cp/ ? "cp" : "((U8*)s)[$depth]";
500 # first we loop over the possible keys/conditions and find out what they look like
501 # we group conditions with the same optree together.
504 local $Data::Dumper::Sortkeys=1;
505 foreach my $cond ( @conds ) {
507 # get the optree for this child/condition
508 my $res= $self->_optree( $trie->{$cond}, $test_type, $ret_type, $else, $depth + 1 );
509 # convert it to a string with Dumper
510 my $res_code= Dumper( $res );
512 push @{$dmp_res{$res_code}{vals}}, $cond;
513 if (!$dmp_res{$res_code}{optree}) {
514 $dmp_res{$res_code}{optree}= $res;
515 push @res_order, $res_code;
519 # now that we have deduped the optrees we construct a new optree containing the merged
523 foreach my $res_code_idx (0 .. $#res_order) {
524 my $res_code= $res_order[$res_code_idx];
525 $node->{vals}= $dmp_res{$res_code}{vals};
526 $node->{test}= $test;
527 $node->{yes}= $dmp_res{$res_code}{optree};
528 $node->{depth}= $depth;
529 if ($res_code_idx < $#res_order) {
530 $node= $node->{no}= {};
540 # my $optree= optree(%opts);
542 # Convert a trie to an optree, wrapper for _optree
547 my $trie= $self->make_trie( $opt{type}, $opt{max_depth} );
548 $opt{ret_type} ||= 'len';
549 my $test_type= $opt{type} =~ /^cp/ ? 'cp' : 'depth';
550 return $self->_optree( $trie, $test_type, $opt{ret_type}, $opt{else}, 0 );
553 # my $optree= generic_optree(%opts);
555 # build a "generic" optree out of the three 'low', 'latin1', 'utf8'
556 # sets of strings, including a branch for handling the string type check.
563 $opt{ret_type} ||= 'len';
564 my $test_type= 'depth';
565 my $else= $opt{else} || 0;
567 my $latin1= $self->make_trie( 'latin1', $opt{max_depth} );
568 my $utf8= $self->make_trie( 'utf8', $opt{max_depth} );
570 $_= $self->_optree( $_, $test_type, $opt{ret_type}, $else, 0 )
574 $else= __cond_join( "( is_utf8 )", $utf8, $latin1 || $else );
575 } elsif ( $latin1 ) {
576 $else= __cond_join( "!( is_utf8 )", $latin1, $else );
578 if ($opt{type} eq 'generic') {
579 my $low= $self->make_trie( 'low', $opt{max_depth} );
581 $else= $self->_optree( $low, $test_type, $opt{ret_type}, $else, 0 );
590 # create a string length guarded optree.
596 my $type= $opt{type};
598 die "Can't do a length_optree on type 'cp', makes no sense."
601 my ( @size, $method );
603 if ( $type =~ /generic/ ) {
604 $method= 'generic_optree';
606 %{ $self->{size}{low} || {} },
607 %{ $self->{size}{latin1} || {} },
608 %{ $self->{size}{utf8} || {} }
610 @size= sort { $a <=> $b } keys %sizes;
613 @size= sort { $a <=> $b } keys %{ $self->{size}{$type} };
616 my $else= ( $opt{else} ||= 0 );
617 for my $size ( @size ) {
618 my $optree= $self->$method( %opt, type => $type, max_depth => $size );
619 my $cond= "((e)-(s) > " . ( $size - 1 ).")";
620 $else= __cond_join( $cond, $optree, $else );
625 sub calculate_mask(@) {
626 # Look at the input list of byte values. This routine returns an array of
627 # mask/base pairs to generate that list.
630 my $list_count = @list;
632 # Consider a set of byte values, A, B, C .... If we want to determine if
633 # <c> is one of them, we can write c==A || c==B || c==C .... If the
634 # values are consecutive, we can shorten that to A<=c && c<=Z, which uses
635 # far fewer branches. If only some of them are consecutive we can still
636 # save some branches by creating range tests for just those that are
637 # consecutive. _cond_as_str() does this work for looking for ranges.
639 # Another approach is to look at the bit patterns for A, B, C .... and see
640 # if they have some commonalities. That's what this function does. For
641 # example, consider a set consisting of the bytes
642 # 0xF0, 0xF1, 0xF2, and 0xF3. We could write:
643 # 0xF0 <= c && c <= 0xF4
644 # But the following mask/compare also works, and has just one test:
646 # The reason it works is that the set consists of exactly those bytes
647 # whose first 4 bits are 1, and the next two are 0. (The value of the
648 # other 2 bits is immaterial in determining if a byte is in the set or
649 # not.) The mask masks out those 2 irrelevant bits, and the comparison
650 # makes sure that the result matches all bytes which match those 6
651 # material bits exactly. In other words, the set of bytes contains
652 # exactly those whose bottom two bit positions are either 0 or 1. The
653 # same principle applies to bit positions that are not necessarily
654 # adjacent. And it can be applied to bytes that differ in 1 through all 8
655 # bit positions. In order to be a candidate for this optimization, the
656 # number of bytes in the set must be a power of 2.
658 # Consider a different example, the set 0x53, 0x54, 0x73, and 0x74. That
659 # requires 4 tests using either ranges or individual values, and even
660 # though the number in the set is a power of 2, it doesn't qualify for the
661 # mask optimization described above because the number of bits that are
662 # different is too large for that. However, the set can be expressed as
663 # two branches with masks thusly:
664 # (c & 0xDF) == 0x53 || (c & 0xDF) == 0x54
665 # a branch savings of 50%. This is done by splitting the set into two
666 # subsets each of which has 2 elements, and within each set the values
669 # This function attempts to find some way to save some branches using the
670 # mask technique. If not, it returns an empty list; if so, it
671 # returns a list consisting of
672 # [ [compare1, mask1], [compare2, mask2], ...
673 # [compare_n, undef], [compare_m, undef], ...
675 # The <mask> is undef in the above for those bytes that must be tested
678 # This function does not attempt to find the optimal set. To do so would
679 # probably require testing all possible combinations, and keeping track of
680 # the current best one.
682 # There are probably much better algorithms, but this is the one I (khw)
683 # came up with. We start with doing a bit-wise compare of every byte in
684 # the set with every other byte. The results are sorted into arrays of
685 # all those that differ by the same bit positions. These are stored in a
686 # hash with the each key being the bits they differ in. Here is the hash
687 # for the 0x53, 0x54, 0x73, 0x74 set:
715 # The set consisting of values which differ in the 4 bit positions 0, 1,
716 # 2, and 5 from some other value in the set consists of all 4 values.
717 # Likewise all 4 values differ from some other value in the 3 bit
718 # positions 0, 1, and 2; and all 4 values differ from some other value in
719 # the single bit position 5. The keys at the uppermost level in the above
720 # hash, 1, 3, and 4, give the number of bit positions that each sub-key
721 # below it has. For example, the 4 key could have as its value an array
722 # consisting of "0,1,2,5", "0,1,2,6", and "3,4,6,7", if the inputs were
723 # such. The best optimization will group the most values into a single
724 # mask. The most values will be the ones that differ in the most
725 # positions, the ones with the largest value for the topmost key. These
726 # keys, are thus just for convenience of sorting by that number, and do
727 # not have any bearing on the core of the algorithm.
729 # We start with an element from largest number of differing bits. The
730 # largest in this case is 4 bits, and there is only one situation in this
731 # set which has 4 differing bits, "0,1,2,5". We look for any subset of
732 # this set which has 16 values that differ in these 4 bits. There aren't
733 # any, because there are only 4 values in the entire set. We then look at
734 # the next possible thing, which is 3 bits differing in positions "0,1,2".
735 # We look for a subset that has 8 values that differ in these 3 bits.
736 # Again there are none. So we go to look for the next possible thing,
737 # which is a subset of 2**1 values that differ only in bit position 5. 83
738 # and 115 do, so we calculate a mask and base for those and remove them
739 # from every set. Since there is only the one set remaining, we remove
740 # them from just this one. We then look to see if there is another set of
741 # 2 values that differ in bit position 5. 84 and 116 do, so we calculate
742 # a mask and base for those and remove them from every set (again only
743 # this set remains in this example). The set is now empty, and there are
744 # no more sets to look at, so we are done.
746 if ($list_count == 256) { # All 256 is trivially masked
752 # Generate bits-differing lists for each element compared against each
754 for my $i (0 .. $list_count - 2) {
755 for my $j ($i + 1 .. $list_count - 1) {
756 my @bits_that_differ = pop_count($list[$i] ^ $list[$j]);
757 my $differ_count = @bits_that_differ;
758 my $key = join ",", @bits_that_differ;
759 push @{$hash{$differ_count}{$key}}, $list[$i] unless grep { $_ == $list[$i] } @{$hash{$differ_count}{$key}};
760 push @{$hash{$differ_count}{$key}}, $list[$j];
764 print STDERR __LINE__, ": calculate_mask() called: List of values grouped by differing bits: ", Dumper \%hash if DEBUG;
767 foreach my $count (reverse sort { $a <=> $b } keys %hash) {
768 my $need = 2 ** $count; # Need 8 values for 3 differing bits, etc
769 foreach my $bits (sort keys $hash{$count}) {
771 print STDERR __LINE__, ": For $count bit(s) difference ($bits), need $need; have ", scalar @{$hash{$count}{$bits}}, "\n" if DEBUG;
773 # Look only as long as there are at least as many elements in the
774 # subset as are needed
775 while ((my $cur_count = @{$hash{$count}{$bits}}) >= $need) {
777 print STDERR __LINE__, ": Looking at bit positions ($bits): ", Dumper $hash{$count}{$bits} if DEBUG;
779 # Start with the first element in it
780 my $try_base = $hash{$count}{$bits}[0];
781 my @subset = $try_base;
783 # If it succeeds, we return a mask and a base to compare
784 # against the masked value. That base will be the AND of
785 # every element in the subset. Initialize to the one element
787 my $compare = $try_base;
789 # We are trying to find a subset of this that has <need>
790 # elements that differ in the bit positions given by the
791 # string $bits, which is comma separated.
792 my @bits = split ",", $bits;
794 TRY: # Look through the remainder of the list for other
795 # elements that differ only by these bit positions.
797 for (my $i = 1; $i < $cur_count; $i++) {
798 my $try_this = $hash{$count}{$bits}[$i];
799 my @positions = pop_count($try_base ^ $try_this);
801 print STDERR __LINE__, ": $try_base vs $try_this: is (", join(',', @positions), ") a subset of ($bits)?" if DEBUG;;
803 foreach my $pos (@positions) {
804 unless (grep { $pos == $_ } @bits) {
805 print STDERR " No\n" if DEBUG;
806 my $remaining = $cur_count - $i - 1;
807 if ($remaining && @subset + $remaining < $need) {
808 print STDERR __LINE__, ": Can stop trying $try_base, because even if all the remaining $remaining values work, they wouldn't add up to the needed $need when combined with the existing ", scalar @subset, " ones\n" if DEBUG;
815 print STDERR " Yes\n" if DEBUG;
816 push @subset, $try_this;
818 # Add this to the mask base, in case it ultimately
820 $compare &= $try_this;
823 print STDERR __LINE__, ": subset (", join(", ", @subset), ") has ", scalar @subset, " elements; needs $need\n" if DEBUG;
825 if (@subset < $need) {
826 shift @{$hash{$count}{$bits}};
827 next; # Try with next value
832 foreach my $position (@bits) {
833 $mask |= 1 << $position;
835 $mask = ~$mask & 0xFF;
836 push @final_results, [$compare, $mask];
838 printf STDERR "%d: Got it: compare=%d=0x%X; mask=%X\n", __LINE__, $compare, $compare, $mask if DEBUG;
840 # These values are now spoken for. Remove them from future
842 foreach my $remove_count (sort keys %hash) {
843 foreach my $bits (sort keys %{$hash{$remove_count}}) {
844 foreach my $to_remove (@subset) {
845 @{$hash{$remove_count}{$bits}} = grep { $_ != $to_remove } @{$hash{$remove_count}{$bits}};
853 # Any values that remain in the list are ones that have to be tested for
856 foreach my $count (reverse sort { $a <=> $b } keys %hash) {
857 foreach my $bits (sort keys $hash{$count}) {
858 foreach my $remaining (@{$hash{$count}{$bits}}) {
860 # If we already know about this value, just ignore it.
861 next if grep { $remaining == $_ } @individuals;
863 # Otherwise it needs to be returned as something to match
865 push @final_results, [$remaining, undef];
866 push @individuals, $remaining;
871 # Sort by increasing numeric value
872 @final_results = sort { $a->[0] <=> $b->[0] } @final_results;
874 print STDERR __LINE__, ": Final return: ", Dumper \@final_results if DEBUG;
876 return @final_results;
880 # turn a list of conditions into a text expression
881 # - merges ranges of conditions, and joins the result with ||
883 my ( $self, $op, $combine, $opts_ref )= @_;
884 my $cond= $op->{vals};
885 my $test= $op->{test};
886 my $is_cp_ret = $opts_ref->{ret_type} eq "cp";
887 return "( $test )" if !defined $cond;
892 # We skip this if there are optimizations that
893 # we can apply (below) to the individual ranges
894 if ( ($is_cp_ret || $combine) && @ranges && ref $ranges[-1]) {
895 if ( $ranges[-1][0] == $ranges[-1][1] ) {
896 $ranges[-1]= $ranges[-1][0];
897 } elsif ( $ranges[-1][0] + 1 == $ranges[-1][1] ) {
898 $ranges[-1]= $ranges[-1][0];
899 push @ranges, $ranges[-1] + 1;
903 for my $condition ( @$cond ) {
904 if ( !@ranges || $condition != $ranges[-1][1] + 1 ) {
906 push @ranges, [ $condition, $condition ];
913 return $self->_combine( $test, @ranges )
920 "( $self->{val_fmt} <= $test && $test <= $self->{val_fmt} )",
922 : sprintf( "$self->{val_fmt} == $test", $_ );
925 return "( " . join( " || ", @ranges ) . " )";
928 # If the input set has certain characteristics, we can optimize tests
929 # for it. This doesn't apply if returning the code point, as we want
930 # each element of the set individually. The code above is for this
933 return 1 if @$cond == 256; # If all bytes match, is trivially true
938 # See if the entire set shares optimizable characteristics, and if so,
939 # return the optimization. We delay checking for this on sets with
940 # just a single range, as there may be better optimizations available
942 @masks = calculate_mask(@$cond);
944 # Stringify the output of calculate_mask()
947 foreach my $mask_ref (@masks) {
948 if (defined $mask_ref->[1]) {
949 push @return, sprintf "( ( $test & $self->{val_fmt} ) == $self->{val_fmt} )", $mask_ref->[1], $mask_ref->[0];
951 else { # An undefined mask means to use the value as-is
952 push @return, sprintf "$test == $self->{val_fmt}", $mask_ref->[0];
956 # The best possible case below for specifying this set of values via
957 # ranges is 1 branch per range. If our mask method yielded better
958 # results, there is no sense trying something that is bound to be
960 if (@return < @ranges) {
961 return "( " . join( " || ", @return ) . " )";
968 # Here, there was no entire-class optimization that was clearly better
969 # than doing things by ranges. Look at each range.
970 my $range_count_extra = 0;
971 for (my $i = 0; $i < @ranges; $i++) {
972 if (! ref $ranges[$i]) { # Trivial case: no range
973 $ranges[$i] = sprintf "$self->{val_fmt} == $test", $ranges[$i];
975 elsif ($ranges[$i]->[0] == $ranges[$i]->[1]) {
976 $ranges[$i] = # Trivial case: single element range
977 sprintf "$self->{val_fmt} == $test", $ranges[$i]->[0];
982 # Well-formed UTF-8 continuation bytes on ascii platforms must be
983 # in the range 0x80 .. 0xBF. If we know that the input is
984 # well-formed (indicated by not trying to be 'safe'), we can omit
985 # tests that verify that the input is within either of these
986 # bounds. (No legal UTF-8 character can begin with anything in
987 # this range, so we don't have to worry about this being a
988 # continuation byte or not.)
990 && ! $opts_ref->{safe}
991 && $opts_ref->{type} =~ / ^ (?: utf8 | high ) $ /xi)
993 my $lower_limit_is_80 = ($ranges[$i]->[0] == 0x80);
994 my $upper_limit_is_BF = ($ranges[$i]->[1] == 0xBF);
996 # If the range is the entire legal range, it matches any legal
997 # byte, so we can omit both tests. (This should happen only
998 # if the number of ranges is 1.)
999 if ($lower_limit_is_80 && $upper_limit_is_BF) {
1002 elsif ($lower_limit_is_80) { # Just use the upper limit test
1003 $output = sprintf("( $test <= $self->{val_fmt} )",
1006 elsif ($upper_limit_is_BF) { # Just use the lower limit test
1007 $output = sprintf("( $test >= $self->{val_fmt} )",
1012 # If we didn't change to omit a test above, see if the number of
1013 # elements is a power of 2 (only a single bit in the
1014 # representation of its count will be set) and if so, it may be
1015 # that a mask/compare optimization is possible.
1017 && pop_count($ranges[$i]->[1] - $ranges[$i]->[0] + 1) == 1)
1020 push @list, $_ for ($ranges[$i]->[0] .. $ranges[$i]->[1]);
1021 my @this_masks = calculate_mask(@list);
1023 # Use the mask if there is just one for the whole range.
1024 # Otherwise there is no savings over the two branches that can
1026 if (@this_masks == 1 && defined $this_masks[0][1]) {
1027 $output = sprintf "( $test & $self->{val_fmt} ) == $self->{val_fmt}", $this_masks[0][1], $this_masks[0][0];
1031 if ($output ne "") { # Prefer any optimization
1032 $ranges[$i] = $output;
1035 # No optimization happened. We need a test that the code
1036 # point is within both bounds. But, if the bounds are
1037 # adjacent code points, it is cleaner to say
1038 # 'first == test || second == test'
1040 # 'first <= test && test <= second'
1042 $range_count_extra++; # This range requires 2 branches to
1044 if ($ranges[$i]->[0] + 1 == $ranges[$i]->[1]) {
1046 . join( " || ", ( map
1047 { sprintf "$self->{val_fmt} == $test", $_ }
1051 else { # Full bounds checking
1052 $ranges[$i] = sprintf("( $self->{val_fmt} <= $test && $test <= $self->{val_fmt} )", $ranges[$i]->[0], $ranges[$i]->[1]);
1058 # We have generated the list of bytes in two ways; one trying to use masks
1059 # to cut the number of branches down, and the other to look at individual
1060 # ranges (some of which could be cut down by using a mask for just it).
1061 # We return whichever method uses the fewest branches.
1063 . join( " || ", (@masks && @masks < @ranges + $range_count_extra)
1070 # recursively turn a list of conditions into a fast break-out condition
1071 # used by _cond_as_str() for 'cp' type macros.
1073 my ( $self, $test, @cond )= @_;
1075 my $item= shift @cond;
1079 sprintf( "( $self->{val_fmt} <= $test && $test <= $self->{val_fmt} )",
1081 $gtv= sprintf "$self->{val_fmt}", $item->[1];
1083 $cstr= sprintf( "$self->{val_fmt} == $test", $item );
1084 $gtv= sprintf "$self->{val_fmt}", $item;
1087 my $combine= $self->_combine( $test, @cond );
1089 return "( $cstr || ( $gtv < $test &&\n"
1090 . $combine . " ) )";
1092 return "( $cstr || $combine )";
1100 # recursively convert an optree to text with reasonably neat formatting
1102 my ( $self, $op, $combine, $brace, $opts_ref, $def, $submacros )= @_;
1103 return 0 if ! defined $op; # The set is empty
1107 my $cond= $self->_cond_as_str( $op, $combine, $opts_ref );
1108 #no warnings 'recursion'; # This would allow really really inefficient
1109 # code to be generated. See pod
1110 my $yes= $self->_render( $op->{yes}, $combine, 1, $opts_ref, $def, $submacros );
1111 return $yes if $cond eq '1';
1113 my $no= $self->_render( $op->{no}, $combine, 0, $opts_ref, $def, $submacros );
1114 return "( $cond )" if $yes eq '1' and $no eq '0';
1115 my ( $lb, $rb )= $brace ? ( "( ", " )" ) : ( "", "" );
1116 return "$lb$cond ? $yes : $no$rb"
1117 if !ref( $op->{yes} ) && !ref( $op->{no} );
1119 my $ind= "\n" . ( $ind1 x $op->{depth} );
1121 if ( ref $op->{yes} ) {
1122 $yes= $ind . $ind1 . $yes;
1127 my $str= "$lb$cond ?$yes$ind: $no$rb";
1128 if (length $str > 6000) {
1129 push @$submacros, sprintf "#define $def\n( %s )", "_part" . (my $yes_idx= 0+@$submacros), $yes;
1130 push @$submacros, sprintf "#define $def\n( %s )", "_part" . (my $no_idx= 0+@$submacros), $no;
1131 return sprintf "%s%s ? $def : $def%s", $lb, $cond, "_part$yes_idx", "_part$no_idx", $rb;
1136 # $expr=render($op,$combine)
1138 # convert an optree to text with reasonably neat formatting. If $combine
1139 # is true then the condition is created using "fast breakouts" which
1140 # produce uglier expressions that are more efficient for common case,
1141 # longer lists such as that resulting from type 'cp' output.
1142 # Currently only used for type 'cp' macros.
1144 my ( $self, $op, $combine, $opts_ref, $def_fmt )= @_;
1147 my $macro= sprintf "#define $def_fmt\n( %s )", "", $self->_render( $op, $combine, 0, $opts_ref, $def_fmt, \@submacros );
1149 return join "\n\n", map { "/*** GENERATED CODE ***/\n" . __macro( __clean( $_ ) ) } @submacros, $macro;
1153 # make a macro of a given type.
1154 # calls into make_trie and (generic_|length_)optree as needed
1156 # type : 'cp','cp_high', 'generic','high','low','latin1','utf8','LATIN1','UTF8'
1157 # ret_type : 'cp' or 'len'
1158 # safe : add length guards to macro
1160 # type defaults to 'generic', and ret_type to 'len' unless type is 'cp'
1161 # in which case it defaults to 'cp' as well.
1163 # it is illegal to do a type 'cp' macro on a pattern with multi-codepoint
1164 # sequences in it, as the generated macro will accept only a single codepoint
1167 # returns the macro.
1173 my $type= $opts{type} || 'generic';
1174 die "Can't do a 'cp' on multi-codepoint character class '$self->{op}'"
1176 and $self->{has_multi};
1177 my $ret_type= $opts{ret_type} || ( $opts{type} =~ /^cp/ ? 'cp' : 'len' );
1179 if ( $opts{safe} ) {
1180 $method= 'length_optree';
1181 } elsif ( $type =~ /generic/ ) {
1182 $method= 'generic_optree';
1186 my @args= $type =~ /^cp/ ? 'cp' : 's';
1187 push @args, "e" if $opts{safe};
1188 push @args, "is_utf8" if $type =~ /generic/;
1189 push @args, "len" if $ret_type eq 'both';
1190 my $pfx= $ret_type eq 'both' ? 'what_len_' :
1191 $ret_type eq 'cp' ? 'what_' : 'is_';
1192 my $ext= $type =~ /generic/ ? '' : '_' . lc( $type );
1193 $ext .= '_non_low' if $type eq 'generic_non_low';
1194 $ext .= "_safe" if $opts{safe};
1195 my $argstr= join ",", @args;
1196 my $def_fmt="$pfx$self->{op}$ext%s($argstr)";
1197 my $optree= $self->$method( %opts, type => $type, ret_type => $ret_type );
1198 return $self->render( $optree, ($type =~ /^cp/) ? 1 : 0, \%opts, $def_fmt );
1201 # if we aren't being used as a module (highly likely) then process
1202 # the __DATA__ below and produce macros in regcharclass.h
1203 # if an argument is provided to the script then it is assumed to
1204 # be the path of the file to output to, if the arg is '-' outputs
1208 my $path= shift @ARGV || "regcharclass.h";
1210 if ( $path eq '-' ) {
1213 $out_fh = open_new( $path );
1215 print $out_fh read_only_top( lang => 'C', by => $0,
1216 file => 'regcharclass.h', style => '*',
1217 copyright => [2007, 2011] );
1218 print $out_fh "\n#ifndef H_REGCHARCLASS /* Guard against nested #includes */\n#define H_REGCHARCLASS 1\n\n";
1220 my ( $op, $title, @txt, @types, %mods );
1224 # Skip if to compile on a different platform.
1225 return if delete $mods{only_ascii_platform} && ! ASCII_PLATFORM;
1226 return if delete $mods{only_ebcdic_platform} && ord 'A' != 193;
1228 print $out_fh "/*\n\t$op: $title\n\n";
1229 print $out_fh join "\n", ( map { "\t$_" } @txt ), "*/", "";
1230 my $obj= __PACKAGE__->new( op => $op, title => $title, txt => \@txt );
1232 #die Dumper(\@types,\%mods);
1235 push @mods, 'safe' if delete $mods{safe};
1236 unshift @mods, 'fast' if delete $mods{fast} || ! @mods; # Default to 'fast'
1241 die "Unknown modifiers: ", join ", ", map { "'$_'" } sort keys %mods;
1244 foreach my $type_spec ( @types ) {
1245 my ( $type, $ret )= split /-/, $type_spec;
1247 foreach my $mod ( @mods ) {
1248 next if $mod eq 'safe' and $type =~ /^cp/;
1250 my $macro= $obj->make_macro(
1253 safe => $mod eq 'safe'
1255 print $out_fh $macro, "\n";
1261 s/^ \s* (?: \# .* ) ? $ //x; # squeeze out comment and blanks
1265 $doit->(); # This starts a new definition; do the previous one
1266 ( $op, $title )= split /\s*:\s*/, $_, 2;
1268 } elsif ( s/^=>// ) {
1269 my ( $type, $modifier )= split /:/, $_;
1270 @types= split ' ', $type;
1272 map { $mods{$_} = 1 } split ' ', $modifier;
1279 print $out_fh "\n#endif /* H_REGCHARCLASS */\n";
1282 print $out_fh "/* ex: set ro: */\n";
1284 read_only_bottom_close_and_rename($out_fh)
1288 # The form of the input is a series of definitions to make macros for.
1289 # The first line gives the base name of the macro, followed by a colon, and
1290 # then text to be used in comments associated with the macro that are its
1291 # title or description. In all cases the first (perhaps only) parameter to
1292 # the macro is a pointer to the first byte of the code point it is to test to
1293 # see if it is in the class determined by the macro. In the case of non-UTF8,
1294 # the code point consists only of a single byte.
1296 # The second line must begin with a '=>' and be followed by the types of
1297 # macro(s) to be generated; these are specified below. A colon follows the
1298 # types, followed by the modifiers, also specified below. At least one
1299 # modifier is required.
1301 # The subsequent lines give what code points go into the class defined by the
1302 # macro. Multiple characters may be specified via a string like "\x0D\x0A",
1303 # enclosed in quotes. Otherwise the lines consist of one of:
1304 # 1) a single Unicode code point, prefaced by 0x
1305 # 2) a single range of Unicode code points separated by a minus (and
1307 # 3) a single Unicode property specified in the standard Perl form
1309 # 4) a line like 'do path'. This will do a 'do' on the file given by
1310 # 'path'. It is assumed that this does nothing but load subroutines
1311 # (See item 5 below). The reason 'require path' is not used instead is
1312 # because 'do' doesn't assume that path is in @INC.
1313 # 5) a subroutine call
1314 # &pkg::foo(arg1, ...)
1315 # where pkg::foo was loaded by a 'do' line (item 4). The subroutine
1316 # returns an array of entries of forms like items 1-3 above. This
1317 # allows more complex inputs than achievable from the other input types.
1319 # A blank line or one whose first non-blank character is '#' is a comment.
1320 # The definition of the macro is terminated by a line unlike those described.
1323 # low generate a macro whose name is 'is_BASE_low' and defines a
1324 # class that includes only ASCII-range chars. (BASE is the
1325 # input macro base name.)
1326 # latin1 generate a macro whose name is 'is_BASE_latin1' and defines a
1327 # class that includes only upper-Latin1-range chars. It is not
1328 # designed to take a UTF-8 input parameter.
1329 # high generate a macro whose name is 'is_BASE_high' and defines a
1330 # class that includes all relevant code points that are above
1331 # the Latin1 range. This is for very specialized uses only.
1332 # It is designed to take only an input UTF-8 parameter.
1333 # utf8 generate a macro whose name is 'is_BASE_utf8' and defines a
1334 # class that includes all relevant characters that aren't ASCII.
1335 # It is designed to take only an input UTF-8 parameter.
1336 # LATIN1 generate a macro whose name is 'is_BASE_latin1' and defines a
1337 # class that includes both ASCII and upper-Latin1-range chars.
1338 # It is not designed to take a UTF-8 input parameter.
1339 # UTF8 generate a macro whose name is 'is_BASE_utf8' and defines a
1340 # class that can include any code point, adding the 'low' ones
1341 # to what 'utf8' works on. It is designed to take only an input
1343 # generic generate a macro whose name is 'is_BASE". It has a 2nd,
1344 # boolean, parameter which indicates if the first one points to
1345 # a UTF-8 string or not. Thus it works in all circumstances.
1346 # generic_non_low generate a macro whose name is 'is_BASE_non_low". It has
1347 # a 2nd, boolean, parameter which indicates if the first one
1348 # points to a UTF-8 string or not. It excludes any ASCII-range
1349 # matches, but otherwise it works in all circumstances.
1350 # cp generate a macro whose name is 'is_BASE_cp' and defines a
1351 # class that returns true if the UV parameter is a member of the
1352 # class; false if not.
1353 # cp_high like cp, but it is assumed that it is known that the UV
1354 # parameter is above Latin1. The name of the generated macro is
1355 # 'is_BASE_cp_high'. This is different from high-cp, derived
1357 # A macro of the given type is generated for each type listed in the input.
1358 # The default return value is the number of octets read to generate the match.
1359 # Append "-cp" to the type to have it instead return the matched codepoint.
1360 # The macro name is changed to 'what_BASE...'. See pod for
1362 # Appending '-both" instead adds an extra parameter to the end of the argument
1363 # list, which is a pointer as to where to store the number of
1364 # bytes matched, while also returning the code point. The macro
1365 # name is changed to 'what_len_BASE...'. See pod for caveats
1368 # safe The input string is not necessarily valid UTF-8. In
1369 # particular an extra parameter (always the 2nd) to the macro is
1370 # required, which points to one beyond the end of the string.
1371 # The macro will make sure not to read off the end of the
1372 # string. In the case of non-UTF8, it makes sure that the
1373 # string has at least one byte in it. The macro name has
1374 # '_safe' appended to it.
1375 # fast The input string is valid UTF-8. No bounds checking is done,
1376 # and the macro can make assumptions that lead to faster
1378 # only_ascii_platform Skip this definition if this program is being run on
1379 # a non-ASCII platform.
1380 # only_ebcdic_platform Skip this definition if this program is being run on
1381 # a non-EBCDIC platform.
1382 # No modifier need be specified; fast is assumed for this case. If both
1383 # 'fast', and 'safe' are specified, two macros will be created for each
1386 # If run on a non-ASCII platform will automatically convert the Unicode input
1387 # to native. The documentation above is slightly wrong in this case. 'low'
1388 # actually refers to code points whose UTF-8 representation is the same as the
1389 # non-UTF-8 version (invariants); and 'latin1' refers to all the rest of the
1390 # code points less than 256.
1392 1; # in the unlikely case we are being used as a module
1395 # This is no longer used, but retained in case it is needed some day.
1396 # TRICKYFOLD: Problematic fold case letters. When adding to this list, also should add them to regcomp.c and fold_grind.t
1397 # => generic cp generic-cp generic-both :fast safe
1398 # 0x00DF # LATIN SMALL LETTER SHARP S
1399 # 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
1400 # 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
1401 # 0x1E9E # LATIN CAPITAL LETTER SHARP S, because maps to same as 00DF
1402 # 0x1FD3 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA; maps same as 0390
1403 # 0x1FE3 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA; maps same as 03B0
1405 LNBREAK: Line Break: \R
1406 => generic UTF8 LATIN1 :fast safe
1407 "\x0D\x0A" # CRLF - Network (Windows) line ending
1410 HORIZWS: Horizontal Whitespace: \h \H
1411 => generic UTF8 LATIN1 high cp cp_high :fast safe
1414 VERTWS: Vertical Whitespace: \v \V
1415 => generic UTF8 high LATIN1 cp cp_high :fast safe
1418 XDIGIT: Hexadecimal digits
1419 => UTF8 high cp_high :fast
1422 XPERLSPACE: \p{XPerlSpace}
1423 => generic UTF8 high cp_high :fast
1426 REPLACEMENT: Unicode REPLACEMENT CHARACTER
1430 NONCHAR: Non character code points
1434 SURROGATE: Surrogate characters
1438 GCB_L: Grapheme_Cluster_Break=L
1442 GCB_LV_LVT_V: Grapheme_Cluster_Break=(LV or LVT or V)
1446 GCB_Prepend: Grapheme_Cluster_Break=Prepend
1450 GCB_RI: Grapheme_Cluster_Break=RI
1454 GCB_SPECIAL_BEGIN_START: Grapheme_Cluster_Break=special_begin_starts
1456 \p{_X_Special_Begin_Start}
1458 GCB_T: Grapheme_Cluster_Break=T
1462 GCB_V: Grapheme_Cluster_Break=V
1466 # This program was run with this enabled, and the results copied to utf8.h;
1467 # then this was commented out because it takes so long to figure out these 2
1468 # million code points. The results would not change unless utf8.h decides it
1469 # wants a maximum other than 4 bytes, or this program creates better
1471 #UTF8_CHAR: Matches utf8 from 1 to 4 bytes
1472 #=> UTF8 :safe only_ascii_platform
1475 # This hasn't been commented out, because we haven't an EBCDIC platform to run
1476 # it on, and the 3 types of EBCDIC allegedly supported by Perl would have
1478 UTF8_CHAR: Matches utf8 from 1 to 5 bytes
1479 => UTF8 :safe only_ebcdic_platform
1482 QUOTEMETA: Meta-characters that \Q should quote
1486 MULTI_CHAR_FOLD: multi-char strings that are folded to by a single character
1488 do regen/regcharclass_multi_char_folds.pl
1491 ®charclass_multi_char_folds::multi_char_folds(1)
1493 MULTI_CHAR_FOLD: multi-char strings that are folded to by a single character
1496 ®charclass_multi_char_folds::multi_char_folds(0)
1499 PATWS: pattern white space
1500 => generic generic_non_low cp : fast safe