Args.ob07 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2019-2020, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE Args;
  7. IMPORT SYSTEM, WINAPI;
  8. CONST
  9. MAX_PARAM = 1024;
  10. VAR
  11. Params: ARRAY MAX_PARAM, 2 OF INTEGER;
  12. argc*: INTEGER;
  13. PROCEDURE GetChar (adr: INTEGER): CHAR;
  14. VAR
  15. res: CHAR;
  16. BEGIN
  17. SYSTEM.GET(adr, res)
  18. RETURN res
  19. END GetChar;
  20. PROCEDURE ParamParse;
  21. VAR
  22. p, count, cond: INTEGER;
  23. c: CHAR;
  24. PROCEDURE ChangeCond (A, B, C: INTEGER; VAR cond: INTEGER; c: CHAR): INTEGER;
  25. BEGIN
  26. IF (c <= 20X) & (c # 0X) THEN
  27. cond := A
  28. ELSIF c = 22X THEN
  29. cond := B
  30. ELSIF c = 0X THEN
  31. cond := 6
  32. ELSE
  33. cond := C
  34. END
  35. RETURN cond
  36. END ChangeCond;
  37. BEGIN
  38. p := WINAPI.GetCommandLineA();
  39. cond := 0;
  40. count := 0;
  41. WHILE (count < MAX_PARAM) & (cond # 6) DO
  42. c := GetChar(p);
  43. CASE cond OF
  44. |0: IF ChangeCond(0, 4, 1, cond, c) = 1 THEN Params[count, 0] := p END
  45. |1: IF ChangeCond(0, 3, 1, cond, c) IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
  46. |3: IF ChangeCond(3, 1, 3, cond, c) = 6 THEN Params[count, 1] := p - 1; INC(count) END
  47. |4: IF ChangeCond(5, 0, 5, cond, c) = 5 THEN Params[count, 0] := p END
  48. |5: IF ChangeCond(5, 1, 5, cond, c) = 6 THEN Params[count, 1] := p - 1; INC(count) END
  49. |6:
  50. END;
  51. INC(p)
  52. END;
  53. argc := count
  54. END ParamParse;
  55. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  56. VAR
  57. i, j, len: INTEGER;
  58. c: CHAR;
  59. BEGIN
  60. j := 0;
  61. IF n < argc THEN
  62. i := Params[n, 0];
  63. len := LEN(s) - 1;
  64. WHILE (j < len) & (i <= Params[n, 1]) DO
  65. c := GetChar(i);
  66. IF c # '"' THEN
  67. s[j] := c;
  68. INC(j)
  69. END;
  70. INC(i)
  71. END
  72. END;
  73. s[j] := 0X
  74. END GetArg;
  75. BEGIN
  76. ParamParse
  77. END Args.