(* BSD 2-Clause License Copyright (c) 2019-2020, Anton Krotov All rights reserved. *) MODULE Args; IMPORT SYSTEM, WINAPI; CONST MAX_PARAM = 1024; VAR Params: ARRAY MAX_PARAM, 2 OF INTEGER; argc*: INTEGER; PROCEDURE GetChar (adr: INTEGER): CHAR; VAR res: CHAR; BEGIN SYSTEM.GET(adr, res) RETURN res END GetChar; PROCEDURE ParamParse; VAR p, count, cond: INTEGER; c: CHAR; PROCEDURE ChangeCond (A, B, C: INTEGER; VAR cond: INTEGER; c: CHAR): INTEGER; BEGIN IF (c <= 20X) & (c # 0X) THEN cond := A ELSIF c = 22X THEN cond := B ELSIF c = 0X THEN cond := 6 ELSE cond := C END RETURN cond END ChangeCond; BEGIN p := WINAPI.GetCommandLineA(); cond := 0; count := 0; WHILE (count < MAX_PARAM) & (cond # 6) DO c := GetChar(p); CASE cond OF |0: IF ChangeCond(0, 4, 1, cond, c) = 1 THEN Params[count, 0] := p END |1: IF ChangeCond(0, 3, 1, cond, c) IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END |3: IF ChangeCond(3, 1, 3, cond, c) = 6 THEN Params[count, 1] := p - 1; INC(count) END |4: IF ChangeCond(5, 0, 5, cond, c) = 5 THEN Params[count, 0] := p END |5: IF ChangeCond(5, 1, 5, cond, c) = 6 THEN Params[count, 1] := p - 1; INC(count) END |6: END; INC(p) END; argc := count END ParamParse; PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); VAR i, j, len: INTEGER; c: CHAR; BEGIN j := 0; IF n < argc THEN i := Params[n, 0]; len := LEN(s) - 1; WHILE (j < len) & (i <= Params[n, 1]) DO c := GetChar(i); IF c # '"' THEN s[j] := c; INC(j) END; INC(i) END END; s[j] := 0X END GetArg; BEGIN ParamParse END Args.