1*0Sigor@sysoev.ru#!/usr/bin/perl 2*0Sigor@sysoev.ru 3*0Sigor@sysoev.ruuse warnings; 4*0Sigor@sysoev.ruuse strict; 5*0Sigor@sysoev.ru 6*0Sigor@sysoev.ru# BLOCK_SIZE should be 128, 256, 512, etc. The value 128 provides 7*0Sigor@sysoev.ru# the minimum memory footprint for both 32-bit and 64-bit platforms. 8*0Sigor@sysoev.ruuse constant BLOCK_SIZE => 128; 9*0Sigor@sysoev.ru 10*0Sigor@sysoev.rumy %lowcase; 11*0Sigor@sysoev.rumy %blocks; 12*0Sigor@sysoev.rumy $max_block = 0; 13*0Sigor@sysoev.rumy $max_lowcase = 0; 14*0Sigor@sysoev.ru 15*0Sigor@sysoev.ruwhile (<>) { 16*0Sigor@sysoev.ru if (/^(\w+); (C|S); (\w+);/) { 17*0Sigor@sysoev.ru my ($symbol, $folding) = (hex $1, hex $3); 18*0Sigor@sysoev.ru $lowcase{$symbol} = $folding; 19*0Sigor@sysoev.ru $blocks{int($symbol / BLOCK_SIZE)} = 1; 20*0Sigor@sysoev.ru 21*0Sigor@sysoev.ru if ($max_lowcase < $symbol) { 22*0Sigor@sysoev.ru $max_lowcase = $symbol; 23*0Sigor@sysoev.ru } 24*0Sigor@sysoev.ru } 25*0Sigor@sysoev.ru} 26*0Sigor@sysoev.ru 27*0Sigor@sysoev.ru 28*0Sigor@sysoev.rumy $last_block_size = $max_lowcase % BLOCK_SIZE + 1; 29*0Sigor@sysoev.ru 30*0Sigor@sysoev.ru 31*0Sigor@sysoev.rufor my $block (sort { $a <=> $b } keys %blocks) { 32*0Sigor@sysoev.ru if ($max_block < $block) { 33*0Sigor@sysoev.ru $max_block = $block; 34*0Sigor@sysoev.ru } 35*0Sigor@sysoev.ru} 36*0Sigor@sysoev.ru 37*0Sigor@sysoev.ru 38*0Sigor@sysoev.rumy $blocks = scalar keys %blocks; 39*0Sigor@sysoev.ru 40*0Sigor@sysoev.ruprintf("\n/*\n" . 41*0Sigor@sysoev.ru " * %d %s-bytes blocks, %d pointers.\n" . 42*0Sigor@sysoev.ru " * %d bytes on 32-bit platforms, %d bytes on 64-bit platforms.\n" . 43*0Sigor@sysoev.ru " */\n\n", 44*0Sigor@sysoev.ru $blocks, BLOCK_SIZE, $max_block + 1, 45*0Sigor@sysoev.ru ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 4, 46*0Sigor@sysoev.ru ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size+ $max_block * 8); 47*0Sigor@sysoev.ru 48*0Sigor@sysoev.ruprintf("#define NXT_UNICODE_MAX_LOWCASE 0x%05x\n\n", $max_lowcase); 49*0Sigor@sysoev.ruprintf("#define NXT_UNICODE_BLOCK_SIZE %d\n\n\n", BLOCK_SIZE); 50*0Sigor@sysoev.ru 51*0Sigor@sysoev.ru 52*0Sigor@sysoev.rufor my $block (sort { $a <=> $b } keys %blocks) { 53*0Sigor@sysoev.ru my $block_size = ($block != $max_block) ? BLOCK_SIZE : $last_block_size; 54*0Sigor@sysoev.ru 55*0Sigor@sysoev.ru print "static const uint32_t "; 56*0Sigor@sysoev.ru printf("nxt_unicode_block_%03x[%d] nxt_aligned(64) = {", 57*0Sigor@sysoev.ru $block, $block_size); 58*0Sigor@sysoev.ru 59*0Sigor@sysoev.ru for my $c (0 .. $block_size - 1) { 60*0Sigor@sysoev.ru printf "\n " if $c % 8 == 0; 61*0Sigor@sysoev.ru 62*0Sigor@sysoev.ru my $n = $block * BLOCK_SIZE + $c; 63*0Sigor@sysoev.ru 64*0Sigor@sysoev.ru if (exists $lowcase{$n}) { 65*0Sigor@sysoev.ru printf(" 0x%05x,", $lowcase{$n}); 66*0Sigor@sysoev.ru 67*0Sigor@sysoev.ru } else { 68*0Sigor@sysoev.ru #print " .......,"; 69*0Sigor@sysoev.ru printf(" 0x%05x,", $n); 70*0Sigor@sysoev.ru } 71*0Sigor@sysoev.ru } 72*0Sigor@sysoev.ru 73*0Sigor@sysoev.ru print "\n};\n\n\n"; 74*0Sigor@sysoev.ru} 75*0Sigor@sysoev.ru 76*0Sigor@sysoev.ru 77*0Sigor@sysoev.ruprint "static const uint32_t *nxt_unicode_blocks[] nxt_aligned(64) = {\n"; 78*0Sigor@sysoev.ru 79*0Sigor@sysoev.rufor my $block (0 .. $max_block) { 80*0Sigor@sysoev.ru if (exists($blocks{$block})) { 81*0Sigor@sysoev.ru printf(" nxt_unicode_block_%03x,\n", $block); 82*0Sigor@sysoev.ru 83*0Sigor@sysoev.ru } else { 84*0Sigor@sysoev.ru print " NULL,\n"; 85*0Sigor@sysoev.ru } 86*0Sigor@sysoev.ru} 87*0Sigor@sysoev.ru 88*0Sigor@sysoev.ruprint "};\n"; 89