0,0 → 1,109 |
(* |
BSD 2-Clause License |
|
Copyright (c) 2018, Anton Krotov |
All rights reserved. |
*) |
|
MODULE PATHS; |
|
IMPORT STRINGS, UTILS; |
|
|
CONST |
|
slash = UTILS.slash; |
|
PATHLEN = 2048; |
|
|
TYPE |
|
PATH* = ARRAY PATHLEN OF CHAR; |
|
|
PROCEDURE split* (fname: ARRAY OF CHAR; VAR path, name, ext: ARRAY OF CHAR); |
VAR |
pos1, pos2, len: INTEGER; |
|
BEGIN |
len := LENGTH(fname); |
pos1 := len - 1; |
pos2 := len - 1; |
STRINGS.search(fname, pos1, slash, FALSE); |
STRINGS.search(fname, pos2, ".", FALSE); |
|
path := fname; |
path[pos1 + 1] := 0X; |
|
IF (pos2 = -1) OR (pos2 < pos1) THEN |
pos2 := len |
END; |
|
INC(pos1); |
|
STRINGS.copy(fname, name, pos1, 0, pos2 - pos1); |
name[pos2 - pos1] := 0X; |
STRINGS.copy(fname, ext, pos2, 0, len - pos2); |
ext[len - pos2] := 0X; |
|
END split; |
|
|
PROCEDURE RelPath* (absolute, relative: ARRAY OF CHAR; VAR res: ARRAY OF CHAR); |
VAR |
i, j: INTEGER; |
error: BOOLEAN; |
|
BEGIN |
COPY(absolute, res); |
i := LENGTH(res) - 1; |
WHILE (i >= 0) & (res[i] # slash) DO |
DEC(i) |
END; |
|
INC(i); |
res[i] := 0X; |
|
error := FALSE; |
j := 0; |
WHILE ~error & (relative[j] # 0X) DO |
IF (relative[j] = ".") & (relative[j + 1] = ".") & (relative[j + 2] = slash) & (i > 0) & (res[i - 1] = slash) THEN |
DEC(i, 2); |
WHILE (i >= 0) & (res[i] # slash) DO |
DEC(i) |
END; |
IF i < 0 THEN |
error := TRUE |
ELSE |
INC(i); |
INC(j, 3) |
END |
ELSE |
res[i] := relative[j]; |
INC(i); |
INC(j) |
END |
END; |
|
IF error THEN |
COPY(relative, res) |
ELSE |
res[i] := 0X |
END |
|
END RelPath; |
|
|
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN; |
RETURN UTILS.isRelative(path) |
END isRelative; |
|
|
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR); |
BEGIN |
UTILS.GetCurrentDirectory(path) |
END GetCurrentDirectory; |
|
|
END PATHS. |