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 %lower_case; 11my %blocks; 12my $max_block = 0; 13my $max_lower_case = 0; 14 15while (<>) { 16 my @line = split(";", $_); 17 18 if ($line[13]) { 19 my ($symbol, $folding) = (hex $line[0], hex $line[13]); 20 21 $lower_case{$symbol} = $folding; 22 $blocks{int($symbol / BLOCK_SIZE)} = 1; 23 24 if ($max_lower_case < $symbol) { 25 $max_lower_case = $symbol; 26 } 27 } 28} 29 30 31my $last_block_size = $max_lower_case % BLOCK_SIZE + 1; 32 33 34for my $block (sort { $a <=> $b } keys %blocks) { 35 if ($max_block < $block) { 36 $max_block = $block; 37 } 38} 39 40 41my $blocks = scalar keys %blocks; 42 43printf("\n/*\n" . 44 " * %d %s-bytes blocks, %d pointers.\n" . 45 " * %d bytes on 32-bit platforms, %d bytes on 64-bit platforms.\n" . 46 " */\n\n", 47 $blocks, BLOCK_SIZE, $max_block + 1, 48 ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 4, 49 ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 8); 50 51printf("#define NJS_UNICODE_MAX_LOWER_CASE 0x%05x\n\n", $max_lower_case); 52printf("#define NJS_UNICODE_BLOCK_SIZE %d\n\n\n", BLOCK_SIZE); 53 54 55for my $block (sort { $a <=> $b } keys %blocks) { 56 my $block_size = ($block != $max_block) ? BLOCK_SIZE : $last_block_size; 57 58 print "static const uint32_t "; 59 printf("njs_unicode_lower_case_block_%03x[%d]\n" . 60 " njs_aligned(64) =\n" . 61 "{", 62 $block, $block_size); 63 64 for my $c (0 .. $block_size - 1) { 65 printf "\n " if $c % 8 == 0; 66 67 my $n = $block * BLOCK_SIZE + $c; 68 69 if (exists $lower_case{$n}) { 70 printf(" 0x%05x,", $lower_case{$n}); 71 72 } else { 73 #print " .......,"; 74 printf(" 0x%05x,", $n); 75 } 76 } 77 78 print "\n};\n\n\n"; 79} 80 81 82print "static const uint32_t *njs_unicode_lower_case_blocks[]\n" . 83 " njs_aligned(64) =\n" . 84 "{\n"; 85 86for my $block (0 .. $max_block) { 87 if (exists($blocks{$block})) { 88 printf(" njs_unicode_lower_case_block_%03x,\n", $block); 89 90 } else { 91 print " NULL,\n"; 92 } 93} 94 95print "};\n"; 96