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.>> |