forked from KolibriOS/kolibrios
109 lines
2.1 KiB
Plaintext
109 lines
2.1 KiB
Plaintext
|
(*
|
||
|
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.
|