Args.ob07 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. (*
  2. Copyright 2016, 2018 Anton Krotov
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. *)
  14. MODULE Args;
  15. IMPORT sys := SYSTEM, KOSAPI;
  16. CONST
  17. MAX_PARAM = 1024;
  18. VAR
  19. Params: ARRAY MAX_PARAM, 2 OF INTEGER;
  20. argc*: INTEGER;
  21. PROCEDURE GetChar(adr: INTEGER): CHAR;
  22. VAR res: CHAR;
  23. BEGIN
  24. sys.GET(adr, res)
  25. RETURN res
  26. END GetChar;
  27. PROCEDURE ParamParse;
  28. VAR p, count, name: INTEGER; c: CHAR; cond: INTEGER;
  29. PROCEDURE ChangeCond(A, B, C: INTEGER; c: CHAR; VAR cond: INTEGER);
  30. BEGIN
  31. IF (c <= 20X) & (c # 0X) THEN
  32. cond := A
  33. ELSIF c = 22X THEN
  34. cond := B
  35. ELSIF c = 0X THEN
  36. cond := 6
  37. ELSE
  38. cond := C
  39. END
  40. END ChangeCond;
  41. BEGIN
  42. p := KOSAPI.GetCommandLine();
  43. name := KOSAPI.GetName();
  44. Params[0, 0] := name;
  45. WHILE GetChar(name) # 0X DO
  46. INC(name)
  47. END;
  48. Params[0, 1] := name - 1;
  49. cond := 0;
  50. count := 1;
  51. WHILE (argc < MAX_PARAM) & (cond # 6) DO
  52. c := GetChar(p);
  53. CASE cond OF
  54. |0: ChangeCond(0, 4, 1, c, cond); IF cond = 1 THEN Params[count, 0] := p END
  55. |1: ChangeCond(0, 3, 1, c, cond); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
  56. |3: ChangeCond(3, 1, 3, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  57. |4: ChangeCond(5, 0, 5, c, cond); IF cond = 5 THEN Params[count, 0] := p END
  58. |5: ChangeCond(5, 1, 5, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  59. ELSE
  60. END;
  61. INC(p)
  62. END;
  63. argc := count
  64. END ParamParse;
  65. PROCEDURE GetArg*(n: INTEGER; VAR s: ARRAY OF CHAR);
  66. VAR i, j, len: INTEGER; c: CHAR;
  67. BEGIN
  68. j := 0;
  69. IF n < argc THEN
  70. len := LEN(s) - 1;
  71. i := Params[n, 0];
  72. WHILE (j < len) & (i <= Params[n, 1]) DO
  73. c := GetChar(i);
  74. IF c # 22X THEN
  75. s[j] := c;
  76. INC(j)
  77. END;
  78. INC(i);
  79. END;
  80. END;
  81. s[j] := 0X
  82. END GetArg;
  83. BEGIN
  84. ParamParse
  85. END Args.