Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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