2020-05-25 22:48:33 +02:00
|
|
|
(*
|
|
|
|
BSD 2-Clause License
|
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
Copyright (c) 2019-2020, Anton Krotov
|
2020-05-25 22:48:33 +02:00
|
|
|
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
|
2020-10-13 09:58:51 +02:00
|
|
|
p := WINAPI.GetCommandLineA();
|
2020-05-25 22:48:33 +02:00
|
|
|
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.
|