aboutsummaryrefslogtreecommitdiff
path: root/locale/gen-translit.pl
diff options
context:
space:
mode:
Diffstat (limited to 'locale/gen-translit.pl')
-rw-r--r--locale/gen-translit.pl142
1 files changed, 142 insertions, 0 deletions
diff --git a/locale/gen-translit.pl b/locale/gen-translit.pl
new file mode 100644
index 0000000..b6fba77
--- /dev/null
+++ b/locale/gen-translit.pl
@@ -0,0 +1,142 @@
+#! /usr/bin/perl -w
+open F, "cat C-translit.h.in | gcc -E - |" || die "Cannot preprocess input file";
+
+
+sub cstrlen {
+ my($str) = @_;
+ my($len) = length($str);
+ my($cnt);
+ my($res) = 0;
+
+ for ($cnt = 0; $cnt < $len; ++$cnt) {
+ if (substr($str, $cnt, 1) eq '\\') {
+ # Recognize the escape sequence.
+ if (substr($str, $cnt + 1, 1) eq 'x') {
+ my($inner);
+ for ($inner = $cnt + 2; $inner < $len && $inner < $cnt + 10; ++$inner) {
+ my($ch) = substr($str, $inner, 1);
+ next if (($ch ge '0' && $ch le '9')
+ || ($ch ge 'a' && $ch le 'f')
+ || ($ch ge 'A' && $ch le 'F'));
+ last;
+ }
+ $cnt = $inner;
+ ++$res;
+ } else {
+ die "invalid input" if ($cnt + 1 >= $len);
+ ++$res;
+ ++$cnt;
+ }
+ } else {
+ ++$res;
+ }
+ }
+
+ return $res;
+}
+
+while (<F>) {
+ next if (/^#/);
+ next if (/^[ ]*$/);
+ chop;
+
+ if (/"([^\"]*)"[ ]*"(.*)"/) {
+ my($from) = $1;
+ my($to) = $2;
+ my($fromlen) = cstrlen($from);
+ my($tolen) = cstrlen($to);
+
+ push(@froms, $from);
+ push(@fromlens, $fromlen);
+ push(@tos, $to);
+ push(@tolens, $tolen);
+ }
+}
+
+printf "#define NTRANSLIT %d\n", $#froms + 1;
+
+printf "static const uint32_t translit_from_idx[] =\n{\n ";
+$col = 2;
+$total = 0;
+for ($cnt = 0; $cnt <= $#fromlens; ++$cnt) {
+ if ($cnt != 0) {
+ if ($col + 7 >= 79) {
+ printf(",\n ");
+ $col = 2;
+ } else {
+ printf(", ");
+ $col += 2;
+ }
+ }
+ printf("%4d", $total);
+ $total += $fromlens[$cnt] + 1;
+ $col += 4;
+}
+printf("\n};\n");
+
+printf "static const wchar_t translit_from_tbl[] =\n ";
+$col = 1;
+for ($cnt = 0; $cnt <= $#froms; ++$cnt) {
+ if ($cnt != 0) {
+ if ($col + 6 >= 79) {
+ printf("\n ");
+ $col = 1;
+ }
+ printf(" L\"\\0\"");
+ $col += 6;
+ }
+ if ($col > 2 && $col + length($froms[$cnt]) + 4 >= 79) {
+ printf("\n ");
+ $col = 2;
+ } else {
+ printf(" ");
+ ++$col;
+ }
+ printf("L\"$froms[$cnt]\"");
+ $col += length($froms[$cnt]) + 3;
+}
+printf(";\n");
+
+printf "static const uint32_t translit_to_idx[] =\n{\n ";
+$col = 2;
+$total = 0;
+for ($cnt = 0; $cnt <= $#tolens; ++$cnt) {
+ if ($cnt != 0) {
+ if ($col + 7 >= 79) {
+ printf(",\n ");
+ $col = 2;
+ } else {
+ printf(", ");
+ $col += 2;
+ }
+ }
+ printf("%4d", $total);
+ $total += $tolens[$cnt] + 2;
+ $col += 4;
+}
+printf("\n};\n");
+
+printf "static const wchar_t translit_to_tbl[] =\n ";
+$col = 1;
+for ($cnt = 0; $cnt <= $#tos; ++$cnt) {
+ if ($cnt != 0) {
+ if ($col + 6 >= 79) {
+ printf("\n ");
+ $col = 1;
+ }
+ printf(" L\"\\0\"");
+ $col += 6;
+ }
+ if ($col > 2 && $col + length($tos[$cnt]) + 6 >= 79) {
+ printf("\n ");
+ $col = 2;
+ } else {
+ printf(" ");
+ ++$col;
+ }
+ printf("L\"$tos[$cnt]\\0\"");
+ $col += length($tos[$cnt]) + 5;
+}
+printf(";\n");
+
+exit 0;