Subversion Repositories Kolibri OS

Rev

Rev 7983 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7983 leency 1
(*
7597 akron1 2
    BSD 2-Clause License
3
 
8859 leency 4
    Copyright (c) 2018-2021, Anton Krotov
7597 akron1 5
    All rights reserved.
6
*)
7
 
8
MODULE PATHS;
9
 
10
IMPORT STRINGS, UTILS;
11
 
12
 
13
CONST
14
 
7693 akron1 15
    slash = UTILS.slash;
16
 
7597 akron1 17
    PATHLEN = 2048;
7693 akron1 18
 
19
 
7597 akron1 20
TYPE
21
 
22
    PATH* = ARRAY PATHLEN OF CHAR;
23
 
24
 
25
PROCEDURE split* (fname: ARRAY OF CHAR; VAR path, name, ext: ARRAY OF CHAR);
26
VAR
27
    pos1, pos2, len: INTEGER;
28
 
29
BEGIN
30
    len := LENGTH(fname);
31
    pos1 := len - 1;
8859 leency 32
    pos2 := pos1;
7597 akron1 33
    STRINGS.search(fname, pos1, slash, FALSE);
34
    STRINGS.search(fname, pos2,   ".", FALSE);
35
 
36
    path := fname;
37
    path[pos1 + 1] := 0X;
38
 
39
    IF (pos2 = -1) OR (pos2 < pos1) THEN
40
        pos2 := len
41
    END;
42
 
43
    INC(pos1);
44
 
45
    STRINGS.copy(fname, name, pos1, 0, pos2 - pos1);
46
    name[pos2 - pos1] := 0X;
47
    STRINGS.copy(fname, ext, pos2, 0, len - pos2);
8859 leency 48
    ext[len - pos2] := 0X
7597 akron1 49
END split;
50
 
51
 
52
PROCEDURE RelPath* (absolute, relative: ARRAY OF CHAR; VAR res: ARRAY OF CHAR);
53
VAR
54
    i, j: INTEGER;
55
    error: BOOLEAN;
56
 
57
BEGIN
58
    COPY(absolute, res);
59
    i := LENGTH(res) - 1;
60
    WHILE (i >= 0) & (res[i] # slash) DO
61
        DEC(i)
62
    END;
63
 
64
    INC(i);
65
    res[i] := 0X;
66
 
67
    error := FALSE;
68
    j := 0;
8859 leency 69
    WHILE (relative[j] = ".") & (relative[j + 1] = slash) DO
70
        INC(j, 2)
71
    ELSIF relative[j] = slash DO
72
        INC(j)
73
    END;
74
 
7597 akron1 75
    WHILE ~error & (relative[j] # 0X) DO
76
        IF (relative[j] = ".") & (relative[j + 1] = ".") & (relative[j + 2] = slash) & (i > 0) & (res[i - 1] = slash) THEN
77
            DEC(i, 2);
78
            WHILE (i >= 0) & (res[i] # slash) DO
79
                DEC(i)
80
            END;
81
            IF i < 0 THEN
82
                error := TRUE
83
            ELSE
84
                INC(i);
85
                INC(j, 3)
86
            END
87
        ELSE
88
            res[i] := relative[j];
89
            INC(i);
90
            INC(j)
91
        END
92
    END;
93
 
94
    IF error THEN
95
        COPY(relative, res)
96
    ELSE
97
        res[i] := 0X
98
    END
99
 
7693 akron1 100
END RelPath;
7597 akron1 101
 
102
 
8859 leency 103
PROCEDURE DelSlashes* (VAR path: ARRAY OF CHAR);
104
VAR
105
    i, j, k: INTEGER;
106
    c: CHAR;
107
 
108
BEGIN
109
    i := 0;
110
    j := 0;
111
    k := 0;
112
    REPEAT
113
        c := path[j];
114
        INC(j);
115
        IF c = slash THEN
116
            INC(k)
117
        ELSE
118
            k := 0
119
        END;
120
        IF k <= 1 THEN
121
            path[i] := c;
122
            INC(i)
123
        END
124
    UNTIL c = 0X;
125
 
126
    i := 0;
127
    j := 0;
128
    REPEAT
129
        c := path[j];
130
        INC(j);
131
        path[i] := c;
132
        INC(i);
133
        IF (c = slash) & (path[j] = ".") & (path[j + 1] = slash) THEN
134
            INC(j, 2)
135
        END
136
    UNTIL c = 0X
137
END DelSlashes;
138
 
139
 
7597 akron1 140
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
141
    RETURN UTILS.isRelative(path)
7693 akron1 142
END isRelative;
7597 akron1 143
 
144
 
145
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
146
BEGIN
147
    UTILS.GetCurrentDirectory(path)
148
END GetCurrentDirectory;
149
 
150
 
7983 leency 151
END PATHS.