In.ob07 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2020-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE In;
  7. IMPORT SYSTEM, API;
  8. CONST
  9. MAX_LEN = 1024;
  10. bit_depth = API.BIT_DEPTH;
  11. VAR
  12. Done*: BOOLEAN;
  13. hConsoleInput: INTEGER;
  14. s: ARRAY MAX_LEN + 4 OF CHAR;
  15. fmt: ARRAY 8 OF CHAR;
  16. PROCEDURE [ccall, "msvcrt.dll", ""] sscanf (buf: INTEGER; fmt: INTEGER; adr: INTEGER): INTEGER;
  17. PROCEDURE [windows, "kernel32.dll", ""] GetStdHandle (nStdHandle: INTEGER): INTEGER;
  18. PROCEDURE [windows, "kernel32.dll", ""] ReadConsoleA (hConsoleInput, lpBuffer, nNumberOfCharsToRead, lpNumberOfCharsRead, lpReserved: INTEGER);
  19. PROCEDURE String* (VAR str: ARRAY OF CHAR);
  20. VAR
  21. count: INTEGER;
  22. BEGIN
  23. ReadConsoleA(hConsoleInput, SYSTEM.ADR(s[0]), MAX_LEN, SYSTEM.ADR(count), 0);
  24. IF (s[count - 1] = 0AX) & (s[count - 2] = 0DX) THEN
  25. DEC(count, 2)
  26. END;
  27. s[count] := 0X;
  28. COPY(s, str);
  29. str[LEN(str) - 1] := 0X;
  30. Done := TRUE
  31. END String;
  32. PROCEDURE Int* (VAR x: INTEGER);
  33. BEGIN
  34. String(s);
  35. Done := sscanf(SYSTEM.ADR(s[0]), SYSTEM.ADR(fmt[0]), SYSTEM.ADR(x)) = 1
  36. END Int;
  37. PROCEDURE Real* (VAR x: REAL);
  38. BEGIN
  39. String(s);
  40. Done := sscanf(SYSTEM.ADR(s[0]), SYSTEM.SADR("%lf"), SYSTEM.ADR(x)) = 1
  41. END Real;
  42. PROCEDURE Char* (VAR x: CHAR);
  43. BEGIN
  44. String(s);
  45. x := s[0]
  46. END Char;
  47. PROCEDURE Ln*;
  48. BEGIN
  49. String(s)
  50. END Ln;
  51. PROCEDURE Open*;
  52. BEGIN
  53. hConsoleInput := GetStdHandle(-10);
  54. Done := TRUE
  55. END Open;
  56. BEGIN
  57. IF bit_depth = 32 THEN
  58. fmt := "%d"
  59. ELSE
  60. fmt := "%lld"
  61. END
  62. END In.