forked from Matway/mpl-c
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pathUtils.mpl
executable file
·82 lines (68 loc) · 1.76 KB
/
pathUtils.mpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
"pathUtils" module
"control" useModule
extractClearPath: [
splittedPath: makeStringView.split;
[
splittedPath.success [
position: 0;
lastPosition: -1;
splittedPath.chars [
pair:;
pair.value "\\" = pair.value "/" = or [
pair.index @lastPosition set
] when
] each
position lastPosition 1 + splittedPath.chars makeSubRange assembleString
] [
String
] if
] call
];
simplifyPath: [
splittedPath: makeStringView.split;
[
splittedPath.success [
resultPath: String;
resultFileName: String;
splittedPath.chars.dataSize 0 > [
position: 0 dynamic;
fragments: String Array;
String @fragments.pushBack
isCurrent: ["." =];
isBack: [".." =];
splittedPath.chars [
pair:;
lastFragment: @fragments.last;
pair.value "\\" = pair.value "/" = or [ # slash
lastFragment textSize 0nx > [
lastFragment isCurrent [ @fragments.popBack ] when
lastFragment isBack
[fragments.getSize 1 >] &&
[fragments.getSize 2 - @fragments.at isBack not] && [
@fragments.popBack
@fragments.popBack
] when
String @fragments.pushBack
] when
] [
pair.value @lastFragment.cat
] if
] each
fragments [
pair:;
i: pair.index copy;
i 1 + fragments.dataSize < [
i 0 > ["/" @resultPath.cat] when
pair.value @resultPath.cat
] [
pair.value @resultFileName.cat
] if
] each
] when
@resultPath
@resultFileName
] [
String String
] if
] call
];