(* BSD 2-Clause License Copyright (c) 2020-2021, Anton Krotov All rights reserved. *) MODULE In; IMPORT SYSTEM, Libdl, LINAPI, API; CONST MAX_LEN = 10240; bit_depth = API.BIT_DEPTH; VAR Done*: BOOLEAN; s: ARRAY MAX_LEN OF CHAR; fmt: ARRAY 8 OF CHAR; sscanf: PROCEDURE [linux] (buf: INTEGER; fmt: INTEGER; adr: INTEGER): INTEGER; fgets: PROCEDURE [linux-] (string: INTEGER; num: INTEGER; filestream: INTEGER): INTEGER; PROCEDURE String* (VAR str: ARRAY OF CHAR); BEGIN fgets(SYSTEM.ADR(s[0]), LEN(s), LINAPI.stdin); COPY(s, str); str[LEN(str) - 1] := 0X; Done := TRUE END String; PROCEDURE Int* (VAR x: INTEGER); BEGIN String(s); Done := sscanf(SYSTEM.ADR(s[0]), SYSTEM.ADR(fmt[0]), SYSTEM.ADR(x)) = 1 END Int; PROCEDURE Real* (VAR x: REAL); BEGIN String(s); Done := sscanf(SYSTEM.ADR(s[0]), SYSTEM.SADR("%lf"), SYSTEM.ADR(x)) = 1 END Real; PROCEDURE Char* (VAR x: CHAR); BEGIN String(s); x := s[0] END Char; PROCEDURE Ln*; BEGIN String(s) END Ln; PROCEDURE Open*; BEGIN Done := TRUE END Open; BEGIN IF bit_depth = 32 THEN fmt := "%d" ELSE fmt := "%lld" END; SYSTEM.PUT(SYSTEM.ADR(sscanf), Libdl.sym(API.libc, "sscanf")); ASSERT(sscanf # NIL); SYSTEM.PUT(SYSTEM.ADR(fgets), Libdl.sym(API.libc, "fgets")); ASSERT(fgets # NIL); END In.