(linenum→info "unix/slp.c:2238")

glibc/2.7/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;
Syntax (Markdown)