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