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