In.ob07 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2020-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE In;
  7. IMPORT SYSTEM, Libdl, LINAPI, API;
  8. CONST
  9. MAX_LEN = 10240;
  10. bit_depth = API.BIT_DEPTH;
  11. VAR
  12. Done*: BOOLEAN;
  13. s: ARRAY MAX_LEN OF CHAR;
  14. fmt: ARRAY 8 OF CHAR;
  15. sscanf: PROCEDURE [linux] (buf: INTEGER; fmt: INTEGER; adr: INTEGER): INTEGER;
  16. fgets: PROCEDURE [linux-] (string: INTEGER; num: INTEGER; filestream: INTEGER): INTEGER;
  17. PROCEDURE String* (VAR str: ARRAY OF CHAR);
  18. BEGIN
  19. fgets(SYSTEM.ADR(s[0]), LEN(s), LINAPI.stdin);
  20. COPY(s, str);
  21. str[LEN(str) - 1] := 0X;
  22. Done := TRUE
  23. END String;
  24. PROCEDURE Int* (VAR x: INTEGER);
  25. BEGIN
  26. String(s);
  27. Done := sscanf(SYSTEM.ADR(s[0]), SYSTEM.ADR(fmt[0]), SYSTEM.ADR(x)) = 1
  28. END Int;
  29. PROCEDURE Real* (VAR x: REAL);
  30. BEGIN
  31. String(s);
  32. Done := sscanf(SYSTEM.ADR(s[0]), SYSTEM.SADR("%lf"), SYSTEM.ADR(x)) = 1
  33. END Real;
  34. PROCEDURE Char* (VAR x: CHAR);
  35. BEGIN
  36. String(s);
  37. x := s[0]
  38. END Char;
  39. PROCEDURE Ln*;
  40. BEGIN
  41. String(s)
  42. END Ln;
  43. PROCEDURE Open*;
  44. BEGIN
  45. Done := TRUE
  46. END Open;
  47. BEGIN
  48. IF bit_depth = 32 THEN
  49. fmt := "%d"
  50. ELSE
  51. fmt := "%lld"
  52. END;
  53. SYSTEM.PUT(SYSTEM.ADR(sscanf), Libdl.sym(API.libc, "sscanf"));
  54. ASSERT(sscanf # NIL);
  55. SYSTEM.PUT(SYSTEM.ADR(fgets), Libdl.sym(API.libc, "fgets"));
  56. ASSERT(fgets # NIL);
  57. END In.