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