Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7693 Rev 7696
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
3
 
3
 
4
    Copyright (c) 2018, 2019, Anton Krotov
4
    Copyright (c) 2018-2019, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
6
*)
6
*)
7
 
7
 
8
MODULE PATHS;
8
MODULE PATHS;
9
 
9
 
10
IMPORT STRINGS, UTILS;
10
IMPORT STRINGS, UTILS;
11
 
11
 
12
 
12
 
13
CONST
13
CONST
14
 
14
 
15
    slash = UTILS.slash;
15
    slash = UTILS.slash;
16
 
16
 
17
    PATHLEN = 2048;
17
    PATHLEN = 2048;
18
 
18
 
19
 
19
 
20
TYPE
20
TYPE
21
 
21
 
22
    PATH* = ARRAY PATHLEN OF CHAR;
22
    PATH* = ARRAY PATHLEN OF CHAR;
23
 
23
 
24
 
24
 
25
PROCEDURE split* (fname: ARRAY OF CHAR; VAR path, name, ext: ARRAY OF CHAR);
25
PROCEDURE split* (fname: ARRAY OF CHAR; VAR path, name, ext: ARRAY OF CHAR);
26
VAR
26
VAR
27
    pos1, pos2, len: INTEGER;
27
    pos1, pos2, len: INTEGER;
28
 
28
 
29
BEGIN
29
BEGIN
30
    len := LENGTH(fname);
30
    len := LENGTH(fname);
31
    pos1 := len - 1;
31
    pos1 := len - 1;
32
    pos2 := len - 1;
32
    pos2 := len - 1;
33
    STRINGS.search(fname, pos1, slash, FALSE);
33
    STRINGS.search(fname, pos1, slash, FALSE);
34
    STRINGS.search(fname, pos2,   ".", FALSE);
34
    STRINGS.search(fname, pos2,   ".", FALSE);
35
 
35
 
36
    path := fname;
36
    path := fname;
37
    path[pos1 + 1] := 0X;
37
    path[pos1 + 1] := 0X;
38
 
38
 
39
    IF (pos2 = -1) OR (pos2 < pos1) THEN
39
    IF (pos2 = -1) OR (pos2 < pos1) THEN
40
        pos2 := len
40
        pos2 := len
41
    END;
41
    END;
42
 
42
 
43
    INC(pos1);
43
    INC(pos1);
44
 
44
 
45
    STRINGS.copy(fname, name, pos1, 0, pos2 - pos1);
45
    STRINGS.copy(fname, name, pos1, 0, pos2 - pos1);
46
    name[pos2 - pos1] := 0X;
46
    name[pos2 - pos1] := 0X;
47
    STRINGS.copy(fname, ext, pos2, 0, len - pos2);
47
    STRINGS.copy(fname, ext, pos2, 0, len - pos2);
48
    ext[len - pos2] := 0X;
48
    ext[len - pos2] := 0X;
49
 
49
 
50
END split;
50
END split;
51
 
51
 
52
 
52
 
53
PROCEDURE RelPath* (absolute, relative: ARRAY OF CHAR; VAR res: ARRAY OF CHAR);
53
PROCEDURE RelPath* (absolute, relative: ARRAY OF CHAR; VAR res: ARRAY OF CHAR);
54
VAR
54
VAR
55
    i, j: INTEGER;
55
    i, j: INTEGER;
56
    error: BOOLEAN;
56
    error: BOOLEAN;
57
 
57
 
58
BEGIN
58
BEGIN
59
    COPY(absolute, res);
59
    COPY(absolute, res);
60
    i := LENGTH(res) - 1;
60
    i := LENGTH(res) - 1;
61
    WHILE (i >= 0) & (res[i] # slash) DO
61
    WHILE (i >= 0) & (res[i] # slash) DO
62
        DEC(i)
62
        DEC(i)
63
    END;
63
    END;
64
 
64
 
65
    INC(i);
65
    INC(i);
66
    res[i] := 0X;
66
    res[i] := 0X;
67
 
67
 
68
    error := FALSE;
68
    error := FALSE;
69
    j := 0;
69
    j := 0;
70
    WHILE ~error & (relative[j] # 0X) DO
70
    WHILE ~error & (relative[j] # 0X) DO
71
        IF (relative[j] = ".") & (relative[j + 1] = ".") & (relative[j + 2] = slash) & (i > 0) & (res[i - 1] = slash) THEN
71
        IF (relative[j] = ".") & (relative[j + 1] = ".") & (relative[j + 2] = slash) & (i > 0) & (res[i - 1] = slash) THEN
72
            DEC(i, 2);
72
            DEC(i, 2);
73
            WHILE (i >= 0) & (res[i] # slash) DO
73
            WHILE (i >= 0) & (res[i] # slash) DO
74
                DEC(i)
74
                DEC(i)
75
            END;
75
            END;
76
            IF i < 0 THEN
76
            IF i < 0 THEN
77
                error := TRUE
77
                error := TRUE
78
            ELSE
78
            ELSE
79
                INC(i);
79
                INC(i);
80
                INC(j, 3)
80
                INC(j, 3)
81
            END
81
            END
82
        ELSE
82
        ELSE
83
            res[i] := relative[j];
83
            res[i] := relative[j];
84
            INC(i);
84
            INC(i);
85
            INC(j)
85
            INC(j)
86
        END
86
        END
87
    END;
87
    END;
88
 
88
 
89
    IF error THEN
89
    IF error THEN
90
        COPY(relative, res)
90
        COPY(relative, res)
91
    ELSE
91
    ELSE
92
        res[i] := 0X
92
        res[i] := 0X
93
    END
93
    END
94
 
94
 
95
END RelPath;
95
END RelPath;
96
 
96
 
97
 
97
 
98
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
98
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
99
    RETURN UTILS.isRelative(path)
99
    RETURN UTILS.isRelative(path)
100
END isRelative;
100
END isRelative;
101
 
101
 
102
 
102
 
103
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
103
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
104
BEGIN
104
BEGIN
105
    UTILS.GetCurrentDirectory(path)
105
    UTILS.GetCurrentDirectory(path)
106
END GetCurrentDirectory;
106
END GetCurrentDirectory;
107
 
107
 
108
 
108
 
109
END PATHS.
109
END PATHS.