| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- (*
- 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.
|