Subversion Repositories Kolibri OS

Rev

Rev 9659 | Rev 9708 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2021, 2022 Anton Krotov
  3.  
  4.     This file is part of CEdit.
  5.  
  6.     CEdit 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.     CEdit 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 CEdit. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Encodings;
  21.  
  22. CONST
  23.     CP866* = 0; W1251* = 1; UTF8* = 2; UTF8BOM* = 3; (*UTF16LE* = 4;*)
  24.  
  25.     UNDEF* = -1;
  26.  
  27.     EOL_CRLF* = 0; EOL_LF* = 1; EOL_CR* = 2;
  28.     CR = 0DX; LF = 0AX;
  29.  
  30. TYPE
  31.     CP* = ARRAY 256 OF INTEGER;
  32.  
  33.     tEOL* = ARRAY 3 OF WCHAR;
  34.  
  35. VAR
  36.     cp1251*, cp866*: CP;
  37.     names*: ARRAY 4, 16 OF WCHAR;
  38.     UNI*: ARRAY 65536, 2 OF INTEGER;
  39.  
  40.     eol*: ARRAY 3 OF tEOL;
  41.     eolNames*: ARRAY 3, 16 OF WCHAR;
  42.  
  43.  
  44. PROCEDURE InitCP (VAR cp: CP);
  45. VAR
  46.     i: INTEGER;
  47. BEGIN
  48.     FOR i := 0H TO 7FH DO
  49.         cp[i] := i
  50.     END
  51. END InitCP;
  52.  
  53.  
  54. PROCEDURE Init8 (VAR cp: CP; VAR n: INTEGER; a, b, c, d, e, f, g, h: INTEGER);
  55. BEGIN
  56.     cp[n] := a; INC(n);
  57.     cp[n] := b; INC(n);
  58.     cp[n] := c; INC(n);
  59.     cp[n] := d; INC(n);
  60.     cp[n] := e; INC(n);
  61.     cp[n] := f; INC(n);
  62.     cp[n] := g; INC(n);
  63.     cp[n] := h; INC(n);
  64. END Init8;
  65.  
  66.  
  67. PROCEDURE InitW1251 (VAR cp: CP);
  68. VAR
  69.     n, i: INTEGER;
  70. BEGIN
  71.         InitCP(cp);
  72.     FOR i := 0410H TO 044FH DO
  73.         cp[i - 350H] := i
  74.     END;
  75.     n := 80H;
  76.     Init8(cp, n, 0402H, 0403H, 201AH, 0453H, 201EH, 2026H, 2020H, 2021H);
  77.     Init8(cp, n, 20ACH, 2030H, 0409H, 2039H, 040AH, 040CH, 040BH, 040FH);
  78.     Init8(cp, n, 0452H, 2018H, 2019H, 201CH, 201DH, 2022H, 2013H, 2014H);
  79.     Init8(cp, n, UNDEF, 2122H, 0459H, 203AH, 045AH, 045CH, 045BH, 045FH);
  80.     Init8(cp, n, 00A0H, 040EH, 045EH, 0408H, 00A4H, 0490H, 00A6H, 00A7H);
  81.     Init8(cp, n, 0401H, 00A9H, 0404H, 00ABH, 00ACH, 00ADH, 00AEH, 0407H);
  82.     Init8(cp, n, 00B0H, 00B1H, 0406H, 0456H, 0491H, 00B5H, 00B6H, 00B7H);
  83.     Init8(cp, n, 0451H, 2116H, 0454H, 00BBH, 0458H, 0405H, 0455H, 0457H);
  84. END InitW1251;
  85.  
  86.  
  87. PROCEDURE InitCP866 (VAR cp: CP);
  88. VAR
  89.     n, i: INTEGER;
  90. BEGIN
  91.         InitCP(cp);
  92.         FOR i := 0410H TO 043FH DO
  93.            cp[i - 390H] := i
  94.         END;
  95.         FOR i := 0440H TO 044FH DO
  96.            cp[i - 360H] := i
  97.         END;
  98.         n := 0B0H;
  99.         Init8(cp, n, 2591H, 2592H, 2593H, 2502H, 2524H, 2561H, 2562H, 2556H);
  100.         Init8(cp, n, 2555H, 2563H, 2551H, 2557H, 255DH, 255CH, 255BH, 2510H);
  101.         Init8(cp, n, 2514H, 2534H, 252CH, 251CH, 2500H, 253CH, 255EH, 255FH);
  102.         Init8(cp, n, 255AH, 2554H, 2569H, 2566H, 2560H, 2550H, 256CH, 2567H);
  103.         Init8(cp, n, 2568H, 2564H, 2565H, 2559H, 2558H, 2552H, 2553H, 256BH);
  104.         Init8(cp, n, 256AH, 2518H, 250CH, 2588H, 2584H, 258CH, 2590H, 2580H);
  105.         n := 0F0H;
  106.         Init8(cp, n, 0401H, 0451H, 0404H, 0454H, 0407H, 0457H, 040EH, 045EH);
  107.         Init8(cp, n, 00B0H, 2219H, 00B7H, 221AH, 2116H, 00A4H, 25A0H, 00A0H);
  108. END InitCP866;
  109.  
  110.  
  111. PROCEDURE setUNI;
  112. VAR
  113.     i: INTEGER;
  114. BEGIN
  115.     FOR i := 0 TO 65535 DO
  116.         UNI[i, CP866] := UNDEF;
  117.         UNI[i, W1251] := UNDEF
  118.     END;
  119.     FOR i := 0 TO 255 DO
  120.         IF cp1251[i] # UNDEF THEN
  121.             UNI[cp1251[i], W1251] := i
  122.         END;
  123.         IF cp866[i] # UNDEF THEN
  124.             UNI[cp866[i], CP866] := i
  125.         END
  126.     END
  127. END setUNI;
  128.  
  129.  
  130. BEGIN
  131.     eol[EOL_CRLF] := CR + LF;
  132.     eol[EOL_LF]   := LF;
  133.     eol[EOL_CR]   := CR;
  134.     eolNames[EOL_CRLF] := "CRLF";
  135.     eolNames[EOL_LF]   := "LF";
  136.     eolNames[EOL_CR]   := "CR";
  137.     names[CP866]   := "CP866";
  138.     names[W1251]   := "Windows-1251";
  139.     names[UTF8]    := "UTF-8";
  140.     names[UTF8BOM] := "UTF-8-BOM";
  141.     InitW1251(cp1251);
  142.     InitCP866(cp866);
  143.     setUNI
  144. END Encodings.