Remove sys/segments.h dependency
[kopensolaris-gnu/glibc.git] / locale / gen-translit.pl
1 #! /usr/bin/perl -w
2 open F, "cat C-translit.h.in | gcc -E - |" || die "Cannot preprocess input file";
3
4
5 sub cstrlen {
6   my($str) = @_;
7   my($len) = length($str);
8   my($cnt);
9   my($res) = 0;
10
11   for ($cnt = 0; $cnt < $len; ++$cnt) {
12     if (substr($str, $cnt, 1) eq '\\') {
13       # Recognize the escape sequence.
14       if (substr($str, $cnt + 1, 1) eq 'x') {
15         my($inner);
16         for ($inner = $cnt + 2; $inner < $len && $inner < $cnt + 10; ++$inner) {
17           my($ch) = substr($str, $inner, 1);
18           next if (($ch ge '0' && $ch le '9')
19                    || ($ch ge 'a' && $ch le 'f')
20                    || ($ch ge 'A' && $ch le 'F'));
21           last;
22         }
23         $cnt = $inner;
24         ++$res;
25       } else {
26         die "invalid input" if ($cnt + 1 >= $len);
27         ++$res;
28         ++$cnt;
29       }
30     } else {
31       ++$res;
32     }
33   }
34
35   return $res;
36 }
37
38 while (<F>) {
39   next if (/^#/);
40   next if (/^[  ]*$/);
41   chop;
42
43   if (/"([^\"]*)"[      ]*"(.*)"/) {
44     my($from) = $1;
45     my($to) = $2;
46     my($fromlen) = cstrlen($from);
47     my($tolen) = cstrlen($to);
48
49     push(@froms, $from);
50     push(@fromlens, $fromlen);
51     push(@tos, $to);
52     push(@tolens, $tolen);
53   }
54 }
55
56 printf "#define NTRANSLIT %d\n", $#froms + 1;
57
58 printf "static const uint32_t translit_from_idx[] =\n{\n  ";
59 $col = 2;
60 $total = 0;
61 for ($cnt = 0; $cnt <= $#fromlens; ++$cnt) {
62   if ($cnt != 0) {
63     if ($col + 7 >= 79) {
64       printf(",\n  ");
65       $col = 2;
66     } else {
67       printf(", ");
68       $col += 2;
69     }
70   }
71   printf("%4d", $total);
72   $total += $fromlens[$cnt] + 1;
73   $col += 4;
74 }
75 printf("\n};\n");
76
77 printf "static const wchar_t translit_from_tbl[] =\n ";
78 $col = 1;
79 for ($cnt = 0; $cnt <= $#froms; ++$cnt) {
80   if ($cnt != 0) {
81     if ($col + 6 >= 79) {
82       printf("\n ");
83       $col = 1;
84     }
85     printf(" L\"\\0\"");
86     $col += 6;
87   }
88   if ($col > 2 && $col + length($froms[$cnt]) + 4 >= 79) {
89     printf("\n  ");
90     $col = 2;
91   } else {
92     printf(" ");
93     ++$col;
94   }
95   printf("L\"$froms[$cnt]\"");
96   $col += length($froms[$cnt]) + 3;
97 }
98 printf(";\n");
99
100 printf "static const uint32_t translit_to_idx[] =\n{\n  ";
101 $col = 2;
102 $total = 0;
103 for ($cnt = 0; $cnt <= $#tolens; ++$cnt) {
104   if ($cnt != 0) {
105     if ($col + 7 >= 79) {
106       printf(",\n  ");
107       $col = 2;
108     } else {
109       printf(", ");
110       $col += 2;
111     }
112   }
113   printf("%4d", $total);
114   $total += $tolens[$cnt] + 2;
115   $col += 4;
116 }
117 printf("\n};\n");
118
119 printf "static const wchar_t translit_to_tbl[] =\n ";
120 $col = 1;
121 for ($cnt = 0; $cnt <= $#tos; ++$cnt) {
122   if ($cnt != 0) {
123     if ($col + 6 >= 79) {
124       printf("\n ");
125       $col = 1;
126     }
127     printf(" L\"\\0\"");
128     $col += 6;
129   }
130   if ($col > 2 && $col + length($tos[$cnt]) + 6 >= 79) {
131     printf("\n  ");
132     $col = 2;
133   } else {
134     printf(" ");
135     ++$col;
136   }
137   printf("%s", "L\"$tos[$cnt]\\0\"");
138   $col += length($tos[$cnt]) + 5;
139 }
140 printf(";\n");
141
142 exit 0;