xref: /unit/src/nxt_unicode_lowcase.pl (revision 1008:84f2370bd642)
10Sigor@sysoev.ru#!/usr/bin/perl
20Sigor@sysoev.ru
30Sigor@sysoev.ruuse warnings;
40Sigor@sysoev.ruuse strict;
50Sigor@sysoev.ru
60Sigor@sysoev.ru# BLOCK_SIZE should be 128, 256, 512, etc.  The value 128 provides
70Sigor@sysoev.ru# the minimum memory footprint for both 32-bit and 64-bit platforms.
80Sigor@sysoev.ruuse constant BLOCK_SIZE => 128;
90Sigor@sysoev.ru
100Sigor@sysoev.rumy %lowcase;
110Sigor@sysoev.rumy %blocks;
120Sigor@sysoev.rumy $max_block = 0;
130Sigor@sysoev.rumy $max_lowcase = 0;
140Sigor@sysoev.ru
150Sigor@sysoev.ruwhile (<>) {
160Sigor@sysoev.ru    if (/^(\w+); (C|S); (\w+);/) {
170Sigor@sysoev.ru        my ($symbol, $folding) = (hex $1, hex $3);
180Sigor@sysoev.ru        $lowcase{$symbol} = $folding;
190Sigor@sysoev.ru        $blocks{int($symbol / BLOCK_SIZE)} = 1;
200Sigor@sysoev.ru
210Sigor@sysoev.ru        if ($max_lowcase < $symbol) {
220Sigor@sysoev.ru            $max_lowcase = $symbol;
230Sigor@sysoev.ru        }
240Sigor@sysoev.ru    }
250Sigor@sysoev.ru}
260Sigor@sysoev.ru
270Sigor@sysoev.ru
280Sigor@sysoev.rumy $last_block_size = $max_lowcase % BLOCK_SIZE + 1;
290Sigor@sysoev.ru
300Sigor@sysoev.ru
310Sigor@sysoev.rufor my $block (sort { $a <=> $b } keys %blocks) {
32*1008Szelenkov@nginx.com    if ($max_block < $block) {
33*1008Szelenkov@nginx.com        $max_block = $block;
34*1008Szelenkov@nginx.com    }
350Sigor@sysoev.ru}
360Sigor@sysoev.ru
370Sigor@sysoev.ru
380Sigor@sysoev.rumy $blocks = scalar keys %blocks;
390Sigor@sysoev.ru
400Sigor@sysoev.ruprintf("\n/*\n" .
410Sigor@sysoev.ru       " * %d %s-bytes blocks, %d pointers.\n" .
420Sigor@sysoev.ru       " * %d bytes on 32-bit platforms, %d bytes on 64-bit platforms.\n" .
430Sigor@sysoev.ru       " */\n\n",
440Sigor@sysoev.ru       $blocks, BLOCK_SIZE, $max_block + 1,
450Sigor@sysoev.ru       ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 4,
460Sigor@sysoev.ru       ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size+ $max_block * 8);
470Sigor@sysoev.ru
480Sigor@sysoev.ruprintf("#define NXT_UNICODE_MAX_LOWCASE  0x%05x\n\n", $max_lowcase);
490Sigor@sysoev.ruprintf("#define NXT_UNICODE_BLOCK_SIZE   %d\n\n\n", BLOCK_SIZE);
500Sigor@sysoev.ru
510Sigor@sysoev.ru
520Sigor@sysoev.rufor my $block (sort { $a <=> $b } keys %blocks) {
530Sigor@sysoev.ru    my $block_size = ($block != $max_block) ? BLOCK_SIZE : $last_block_size;
540Sigor@sysoev.ru
550Sigor@sysoev.ru    print "static const uint32_t  ";
560Sigor@sysoev.ru    printf("nxt_unicode_block_%03x[%d]  nxt_aligned(64) = {",
570Sigor@sysoev.ru           $block, $block_size);
580Sigor@sysoev.ru
590Sigor@sysoev.ru    for my $c (0 .. $block_size - 1) {
600Sigor@sysoev.ru        printf "\n   " if $c % 8 == 0;
610Sigor@sysoev.ru
620Sigor@sysoev.ru        my $n = $block * BLOCK_SIZE + $c;
630Sigor@sysoev.ru
640Sigor@sysoev.ru        if (exists $lowcase{$n}) {
650Sigor@sysoev.ru            printf(" 0x%05x,", $lowcase{$n});
660Sigor@sysoev.ru
670Sigor@sysoev.ru        } else {
680Sigor@sysoev.ru            #print " .......,";
690Sigor@sysoev.ru            printf(" 0x%05x,", $n);
700Sigor@sysoev.ru        }
710Sigor@sysoev.ru    }
720Sigor@sysoev.ru
730Sigor@sysoev.ru    print "\n};\n\n\n";
740Sigor@sysoev.ru}
750Sigor@sysoev.ru
760Sigor@sysoev.ru
770Sigor@sysoev.ruprint "static const uint32_t  *nxt_unicode_blocks[]  nxt_aligned(64) = {\n";
780Sigor@sysoev.ru
790Sigor@sysoev.rufor my $block (0 .. $max_block) {
800Sigor@sysoev.ru    if (exists($blocks{$block})) {
810Sigor@sysoev.ru        printf("    nxt_unicode_block_%03x,\n", $block);
820Sigor@sysoev.ru
830Sigor@sysoev.ru    } else {
840Sigor@sysoev.ru        print  "    NULL,\n";
850Sigor@sysoev.ru    }
860Sigor@sysoev.ru}
870Sigor@sysoev.ru
880Sigor@sysoev.ruprint "};\n";
89