#!/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 () { 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 "#include \n"; 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("%s", "L\"$tos[$cnt]\\0\""); $col += length($tos[$cnt]) + 5; } printf(";\n"); exit 0;