-
Notifications
You must be signed in to change notification settings - Fork 27
/
main.n
109 lines (84 loc) · 1.85 KB
/
main.n
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import strings
import fmt.util as *
import syscall
fn exists(string path):bool {
var _ = syscall.stat(path) catch err {
return false
}
return true
}
// refer golang path.base
fn base(string path):string {
if path == '' {
return '.'
}
path = strings.rtrim(path, ['/'])
if path == '' {
return '/'
}
var i = strings.rfind(path, "/", path.len())
if i == -1 {
return path
}
return strings.slice(path, i + 1, path.len())
}
// ref golang path.dir
fn dir(string path):string {
if path == '' {
return '.'
}
var last = path[path.len() - 1]
if last == ascii('/') {
return strings.slice(path, 0, path.len()-1)
}
var i = strings.rfind(path, '/', path.len())
if i == -1 {
return '.'
}
if i == 0 {
return '/'
}
return strings.slice(path, 0, i)
}
fn join(string dst, ...[string] list):string {
for src in list {
dst = _join(dst, src)
}
return dst
}
fn _join(string dst, string src):string {
if src.len() == 0 {
return dst
}
if dst.len() == 0 {
return src
}
// src 是绝对路径时不进行拼接
if src[0] == ascii('/') {
return src
}
var dst_list = dst as [u8]
var len = dst_list.len()
// 去掉结尾的 /
if dst_list[len - 1] == ascii('/') {
dst_list = dst_list.slice(0, len - 1)
}
var result = ''
// ./
if src[0] == ascii('.') && src[1] == ascii('/') {
for int i = 1; i < src.len(); i+=1 {
dst_list.push(src[i])
}
result = dst_list as string
} else {
// ../ not handle, direct join
result = dst_list as string + '/' + src
}
return result
}
fn isdir(string path):bool {
var s = syscall.stat(path) catch err {
return false
}
return (s.mode & 0170000) == (0040000)
}