(* Copyright 2016 Anton Krotov This file is part of fb2read. fb2read is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. fb2read is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with fb2read. If not, see . *) MODULE Conv; IMPORT sys := SYSTEM, Encode; VAR table: ARRAY 65536 OF CHAR; PROCEDURE GetUtf8 (str: INTEGER; VAR val, idx: INTEGER); VAR ch: CHAR; BEGIN sys.GET(str + idx, ch); INC(idx); IF ch < 80X THEN val := ORD(ch) ELSIF ch < 0E0X THEN val := ORD(ch) - 192; sys.GET(str + idx, ch); INC(idx); val := val * 64 + ORD(ch) - 128 ELSE val := ORD(ch) - 224; sys.GET(str + idx, ch); INC(idx); val := val * 64 + ORD(ch) - 128; sys.GET(str + idx, ch); INC(idx); val := val * 64 + ORD(ch) - 128 END END GetUtf8; PROCEDURE convert*(adr, adr2: INTEGER; len: INTEGER); VAR val, idx: INTEGER; BEGIN idx := 0; WHILE len > 0 DO GetUtf8(adr, val, idx); IF (0 <= val) & (val < LEN(table)) THEN sys.PUT(adr2, table[val]) ELSE sys.PUT(adr2, "?") END; INC(adr2); DEC(len) END END convert; PROCEDURE utf8to1251(code: INTEGER): CHAR; VAR res: CHAR; i: INTEGER; BEGIN res := "?"; i := 0; WHILE i <= 255 DO IF Encode.W1251[i].code = code THEN res := CHR(i); i := 255 END; INC(i) END RETURN res END utf8to1251; PROCEDURE main; VAR i: INTEGER; BEGIN FOR i := 0 TO LEN(table) - 1 DO table[i] := utf8to1251(i) END END main; BEGIN main END Conv.