Subversion Repositories Kolibri OS

Rev

Rev 7696 | Go to most recent revision | 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
 
7696 akron1 4
    Copyright (c) 2018-2019, 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;
32
    pos2 := len - 1;
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);
48
    ext[len - pos2] := 0X;
49
 
50
END split;
51
 
52
 
53
PROCEDURE RelPath* (absolute, relative: ARRAY OF CHAR; VAR res: ARRAY OF CHAR);
54
VAR
55
    i, j: INTEGER;
56
    error: BOOLEAN;
57
 
58
BEGIN
59
    COPY(absolute, res);
60
    i := LENGTH(res) - 1;
61
    WHILE (i >= 0) & (res[i] # slash) DO
62
        DEC(i)
63
    END;
64
 
65
    INC(i);
66
    res[i] := 0X;
67
 
68
    error := FALSE;
69
    j := 0;
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
72
            DEC(i, 2);
73
            WHILE (i >= 0) & (res[i] # slash) DO
74
                DEC(i)
75
            END;
76
            IF i < 0 THEN
77
                error := TRUE
78
            ELSE
79
                INC(i);
80
                INC(j, 3)
81
            END
82
        ELSE
83
            res[i] := relative[j];
84
            INC(i);
85
            INC(j)
86
        END
87
    END;
88
 
89
    IF error THEN
90
        COPY(relative, res)
91
    ELSE
92
        res[i] := 0X
93
    END
94
 
7693 akron1 95
END RelPath;
7597 akron1 96
 
97
 
98
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
99
    RETURN UTILS.isRelative(path)
7693 akron1 100
END isRelative;
7597 akron1 101
 
102
 
103
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
104
BEGIN
105
    UTILS.GetCurrentDirectory(path)
106
END GetCurrentDirectory;
107
 
108
 
7983 leency 109
END PATHS.