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 Conv;
  21.  
  22. IMPORT sys := SYSTEM, Encode;
  23.  
  24. VAR table: ARRAY 65536 OF CHAR;
  25.  
  26. PROCEDURE GetUtf8 (str: INTEGER; VAR val, idx: INTEGER);
  27. VAR ch: CHAR;
  28. BEGIN
  29.   sys.GET(str + idx, ch); INC(idx);
  30.   IF ch < 80X THEN
  31.     val := ORD(ch)
  32.   ELSIF ch < 0E0X THEN
  33.     val := ORD(ch) - 192;
  34.     sys.GET(str + idx, ch); INC(idx);
  35.     val := val * 64 + ORD(ch) - 128
  36.   ELSE
  37.     val := ORD(ch) - 224;
  38.     sys.GET(str + idx, ch); INC(idx); val := val * 64 + ORD(ch) - 128;
  39.     sys.GET(str + idx, ch); INC(idx); val := val * 64 + ORD(ch) - 128
  40.   END
  41. END GetUtf8;
  42.  
  43. PROCEDURE convert*(adr, adr2: INTEGER; len: INTEGER);
  44. VAR val, idx: INTEGER;
  45. BEGIN
  46.   idx := 0;
  47.   WHILE len > 0 DO
  48.     GetUtf8(adr, val, idx);
  49.     IF (0 <= val) & (val < LEN(table)) THEN
  50.       sys.PUT(adr2, table[val])
  51.     ELSE
  52.       sys.PUT(adr2, "?")
  53.     END;
  54.     INC(adr2);
  55.     DEC(len)
  56.   END
  57. END convert;
  58.  
  59. PROCEDURE utf8to1251(code: INTEGER): CHAR;
  60. VAR res: CHAR; i: INTEGER;
  61. BEGIN
  62.   res := "?";
  63.   i := 0;
  64.   WHILE i <= 255 DO
  65.     IF Encode.W1251[i].code = code THEN
  66.       res := CHR(i);
  67.       i := 255
  68.     END;
  69.     INC(i)
  70.   END
  71.   RETURN res
  72. END utf8to1251;
  73.  
  74. PROCEDURE main;
  75. VAR i: INTEGER;
  76. BEGIN
  77.   FOR i := 0 TO LEN(table) - 1 DO
  78.     table[i] := utf8to1251(i)
  79.   END
  80. END main;
  81.  
  82. BEGIN
  83.   main
  84. END Conv.
  85.