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