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