Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016 Anton Krotov
  3.  
  4.     This file is part of fb2read.
  5.  
  6.     fb2read is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation, either version 3 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     fb2read is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with fb2read. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Encode;
  21.  
  22. IMPORT S := Strings;
  23.  
  24. TYPE
  25.  
  26.   CP* = ARRAY 256 OF RECORD code*, len*: INTEGER; utf8*: S.UTF8 END;
  27.  
  28.  
  29. VAR
  30.  
  31.   W1250*, W1251*, W1252*, CP866*: CP;
  32.  
  33.  
  34. PROCEDURE InitCP(VAR cp: CP);
  35. VAR i: INTEGER;
  36. BEGIN
  37.    FOR i := 0H TO 7FH DO
  38.      cp[i].code := i
  39.    END;
  40.    FOR i := 0H TO 0FFH DO
  41.      S.utf8(cp[i].code, cp[i].utf8);
  42.      cp[i].len := LENGTH(cp[i].utf8)
  43.    END
  44. END InitCP;
  45.  
  46.  
  47. PROCEDURE Init8(VAR cp: CP; VAR n: INTEGER; a, b, c, d, e, f, g, h: INTEGER);
  48. BEGIN
  49.   cp[n].code := a; INC(n);
  50.   cp[n].code := b; INC(n);
  51.   cp[n].code := c; INC(n);
  52.   cp[n].code := d; INC(n);
  53.   cp[n].code := e; INC(n);
  54.   cp[n].code := f; INC(n);
  55.   cp[n].code := g; INC(n);
  56.   cp[n].code := h; INC(n);
  57. END Init8;
  58.  
  59.  
  60. PROCEDURE InitW1250(VAR cp: CP);
  61. VAR n: INTEGER;
  62. BEGIN
  63.    n := 80H;
  64.    Init8(cp, n, 20ACH,   20H, 201AH,   20H, 201EH, 2026H, 2020H, 2021H);
  65.    Init8(cp, n,   20H, 2030H, 0160H, 2039H, 015AH, 0164H, 017DH, 0179H);
  66.    Init8(cp, n,   20H, 2018H, 2019H, 201CH, 201DH, 2022H, 2013H, 2014H);
  67.    Init8(cp, n,   20H, 2122H, 0161H, 203AH, 015BH, 0165H, 017EH, 017AH);
  68.    Init8(cp, n, 00A0H, 02C7H, 02D8H, 0141H, 00A4H, 0104H, 00A6H, 00A7H);
  69.    Init8(cp, n, 00A8H, 00A9H, 015EH, 00ABH, 00ACH, 00ADH, 00AEH, 017BH);
  70.    Init8(cp, n, 00B0H, 00B1H, 02DBH, 0142H, 00B4H, 00B5H, 00B6H, 00B7H);
  71.    Init8(cp, n, 00B8H, 0105H, 015FH, 00BBH, 013DH, 02DDH, 013EH, 017CH);
  72.    Init8(cp, n, 0154H, 00C1H, 00C2H, 0102H, 00C4H, 0139H, 0106H, 00C7H);
  73.    Init8(cp, n, 010CH, 00C9H, 0118H, 00CBH, 011AH, 00CDH, 00CEH, 010EH);
  74.    Init8(cp, n, 0110H, 0143H, 0147H, 00D3H, 00D4H, 0150H, 00D6H, 00D7H);
  75.    Init8(cp, n, 0158H, 016EH, 00DAH, 0170H, 00DCH, 00DDH, 0162H, 00DFH);
  76.    Init8(cp, n, 0155H, 00E1H, 00E2H, 0103H, 00E4H, 013AH, 0107H, 00E7H);
  77.    Init8(cp, n, 010DH, 00E9H, 0119H, 00EBH, 011BH, 00EDH, 00EEH, 010FH);
  78.    Init8(cp, n, 0111H, 0144H, 0148H, 00F3H, 00F4H, 0151H, 00F6H, 00F7H);
  79.    Init8(cp, n, 0159H, 016FH, 00FAH, 0171H, 00FCH, 00FDH, 0163H, 02D9H);
  80.    InitCP(cp)
  81. END InitW1250;
  82.  
  83.  
  84. PROCEDURE InitW1251(VAR cp: CP);
  85. VAR n, i: INTEGER;
  86. BEGIN
  87.    n := 80H;
  88.    Init8(cp, n, 0402H, 0403H, 201AH, 0453H, 201EH, 2026H, 2020H, 2021H);
  89.    Init8(cp, n, 20ACH, 2030H, 0409H, 2039H, 040AH, 040CH, 040BH, 040FH);
  90.    Init8(cp, n, 0452H, 2018H, 2019H, 201CH, 201DH, 2022H, 2013H, 2014H);
  91.    Init8(cp, n,   20H, 2122H, 0459H, 203AH, 045AH, 045CH, 045BH, 045FH);
  92.    Init8(cp, n, 00A0H, 040EH, 045EH, 0408H, 00A4H, 0490H, 00A6H, 00A7H);
  93.    Init8(cp, n, 0401H, 00A9H, 0404H, 00ABH, 00ACH, 00ADH, 00AEH, 0407H);
  94.    Init8(cp, n, 00B0H, 00B1H, 0406H, 0456H, 0491H, 00B5H, 00B6H, 00B7H);
  95.    Init8(cp, n, 0451H, 2116H, 0454H, 00BBH, 0458H, 0405H, 0455H, 0457H);
  96.    FOR i := 0410H TO 044FH DO
  97.      cp[i - 350H].code := i
  98.    END;
  99.    InitCP(cp)
  100. END InitW1251;
  101.  
  102.  
  103. PROCEDURE InitW1252(VAR cp: CP);
  104. VAR n, i: INTEGER;
  105. BEGIN
  106.    n := 80H;
  107.    Init8(cp, n, 20ACH,   20H, 201AH, 0192H, 201EH, 2026H, 2020H, 2021H);
  108.    Init8(cp, n, 02C6H, 2030H, 0160H, 2039H, 0152H,   20H, 017DH,   20H);
  109.    Init8(cp, n,   20H, 2018H, 2019H, 201CH, 201DH, 2022H, 2013H, 2014H);
  110.    Init8(cp, n, 02DCH, 2122H, 0161H, 203AH, 0153H,   20H, 017EH, 0178H);
  111.    FOR i := 0A0H TO 0FFH DO
  112.      cp[i].code := i
  113.    END;
  114.    InitCP(cp)
  115. END InitW1252;
  116.  
  117.  
  118. PROCEDURE InitCP866(VAR cp: CP);
  119. VAR n, i: INTEGER;
  120. BEGIN
  121.    FOR i := 0410H TO 043FH DO
  122.      cp[i - 0410H + 80H].code := i
  123.    END;
  124.    FOR i := 0440H TO 044FH DO
  125.      cp[i - 0440H + 0E0H].code := i
  126.    END;
  127.  
  128.    n := 0B0H;
  129.    Init8(cp, n, 2591H, 2592H, 2593H, 2502H, 2524H, 2561H, 2562H, 2556H);
  130.    Init8(cp, n, 2555H, 2563H, 2551H, 2557H, 255DH, 255CH, 255BH, 2510H);
  131.    Init8(cp, n, 2514H, 2534H, 252CH, 251CH, 2500H, 253CH, 255EH, 255FH);
  132.    Init8(cp, n, 255AH, 2554H, 2569H, 2566H, 2560H, 2550H, 256CH, 2567H);
  133.    Init8(cp, n, 2568H, 2564H, 2565H, 2559H, 2558H, 2552H, 2553H, 256BH);
  134.    Init8(cp, n, 256AH, 2518H, 250CH, 2588H, 2584H, 258CH, 2590H, 2580H);
  135.  
  136.    n := 0F0H;
  137.    Init8(cp, n, 0401H, 0451H, 0404H, 0454H, 0407H, 0457H, 040EH, 045EH);
  138.    Init8(cp, n, 00B0H, 2219H, 00B7H, 221AH, 2116H, 00A4H, 25A0H, 00A0H);
  139.  
  140.    InitCP(cp)
  141. END InitCP866;
  142.  
  143.  
  144. BEGIN
  145.   InitW1250(W1250);
  146.   InitW1251(W1251);
  147.   InitW1252(W1252);
  148.   InitCP866(CP866);
  149. END Encode.
  150.