X-Git-Url: https://git.hcoop.net/hcoop/debian/courier-authlib.git/blobdiff_plain/6b9221b9fe5c2b44c301ca08a987d99b4add7a06..5459351437f2b7b2a08457e5397f8a8381986ffe:/libs/unicode/mkcommon.pm diff --git a/libs/unicode/mkcommon.pm b/libs/unicode/mkcommon.pm deleted file mode 100644 index 2969f32..0000000 --- a/libs/unicode/mkcommon.pm +++ /dev/null @@ -1,192 +0,0 @@ -package mkcommon; - -use 5.012002; -use strict; -use warnings; - -require Exporter; - -our @ISA = qw(Exporter); - -# Items to export into callers namespace by default. Note: do not export -# names by default without a very good reason. Use EXPORT_OK instead. -# Do not simply export all your public functions/methods/constants. - -# This allows declaration use mkcommon ':all'; -# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK -# will save memory. -our %EXPORT_TAGS = ( 'all' => [ qw( - -) ] ); - -our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); - -our @EXPORT = qw( - -); - -our $VERSION = '0.01'; - -my $BLOCK_SIZE=256; - -# Preloaded methods go here. - -sub new { - - my $this=shift; - - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - - $$self{'char_array'}=[]; - $$self{'char_class'}=[]; - $$self{'char_start'}=[0]; - - $$self{'last_block'}=-1; - $$self{'last'}=""; - $$self{'last_f'}=0; - $$self{'last_l'}=0; - - return $self; -} - -sub _doemit_block { - my $this=shift; - - my $f=shift; - my $l=shift; - - push @{$$this{'char_array'}}, [$f, $l]; - push @{$$this{'char_class'}}, $$this{'last'}; -} - -sub _doemit_endblock { - - my $this=shift; - - push @{$$this{'char_start'}}, $#{$$this{'char_array'}}+1; -} - -# _doemit invokes _doemit_block() for each unicode char range with a given -# linebreaking class. However, once a unicode char range starts in a different -# $BLOCK_SIZE character class, call _doemit_endblock() before calling _doemit_block(). -# -# If a single unicode char range crosses a $BLOCK_SIZE character class boundary, -# split it at the boundary; call _doemit_endblock() to finish the current $BLOCK_SIZE -# char boundary, call _doemit_endblock(), then call _doemit_block() for the -# rest of the char range. - - -sub _doemit { - - my $this=shift; - - $this->_doemit_endblock() - if int($$this{'last_f'} / $BLOCK_SIZE) - != $$this{'last_block'} && $$this{'last_block'} != -1; - - if (int($$this{'last_f'} / $BLOCK_SIZE) != int($$this{'last_l'} / $BLOCK_SIZE)) - { - while (int($$this{'last_f'} / $BLOCK_SIZE) != int($$this{'last_l'} / $BLOCK_SIZE)) - { - my $n=int($$this{'last_f'} / $BLOCK_SIZE) * $BLOCK_SIZE + ($BLOCK_SIZE-1); - - $this->_doemit_block($$this{'last_f'}, $n); - $this->_doemit_endblock(); - $$this{'last_f'}=$n+1; - } - } - $this->_doemit_block($$this{'last_f'}, $$this{'last_l'}); - - $$this{'last_block'}=int($$this{'last_l'} / $BLOCK_SIZE); -} - -# -# Coalesce adjacent unicode char blocks that have the same linebreaking -# property. Invoke _doemit() for the accumulate unicode char range once -# a range with a different linebreaking class is seen. - -sub range { - - my $this=shift; - - my $f=shift; - my $l=shift; - my $t=shift; - - if ($$this{'last_l'} + 1 == $f && $$this{'last'} eq $t) - { - $$this{'last_l'}=$l; - return; - } - - $this->_doemit() if $$this{'last'}; # New linebreaking class - - $$this{'last_f'}=$f; - $$this{'last_l'}=$l; - $$this{'last'}=$t; -} - -sub output { - my $this=shift; - - $this->_doemit(); # Emit last linebreaking unicode char range class - - $this->_doemit_endblock(); # End of the most recent $BLOCK_SIZE char range class - - print "static const uint8_t unicode_rangetab[][2]={\n"; - - my $comma="\t"; - - my $modulo=sprintf("0x%X", $BLOCK_SIZE-1); - - foreach ( @{$$this{'char_array'}} ) - { - print "${comma}{0x" . sprintf("%04x", $$_[0]) . " & $modulo, 0x" - . sprintf("%04x", $$_[1]) . " & $modulo}"; - $comma=",\n\t"; - } - - print "};\n\n"; - - print "static const uint8_t unicode_classtab[]={\n"; - - $comma="\t"; - foreach ( @{$$this{'char_class'}} ) - { - print "${comma}$_"; - $comma=",\n\t"; - } - - print "};\n\n"; - - print "static const size_t unicode_indextab[]={\n"; - - $comma="\t"; - - my $prev_block=-1; - foreach (@{$$this{'char_start'}}) - { - my $sp=$_; - my $cnt=1; - - if ($sp <= $#{$$this{'char_array'}}) - { - my $block=int($$this{'char_array'}->[$sp]->[0] / $BLOCK_SIZE); - - $cnt = $block - $prev_block; - $prev_block=$block; - } - - foreach (1..$cnt) - { - print "$comma$sp"; - $comma=",\n\t"; - } - } - - print "};\n\n"; -} - -1;