Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7983 leency 1
(*
2
    BSD 2-Clause License
3
 
8097 maxcodehac 4
    Copyright (c) 2019-2020, Anton Krotov
7983 leency 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
8097 maxcodehac 57
    p := WINAPI.GetCommandLineA();
7983 leency 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.