-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorig.go
108 lines (100 loc) · 2.17 KB
/
orig.go
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
package main
import (
"context"
"os"
gm "github.com/hymkor/gmnlisp"
"github.com/nyaosorg/go-windows-su"
)
func funShellExecute(ctx context.Context, w *gm.World, list []gm.Node) (gm.Node, error) {
var sup su.Param
sup.Show = su.SHOWNORMAL
switch len(list) {
default:
return nil, gm.ErrTooManyArguments
case 4:
dir, err := gm.ExpectClass[gm.String](ctx, w, list[3])
if err != nil {
return nil, err
}
sup.Directory = dir.String()
fallthrough
case 3:
param, err := gm.ExpectClass[gm.String](ctx, w, list[2])
if err != nil {
return nil, err
}
sup.Param = param.String()
fallthrough
case 2:
action, err := gm.ExpectClass[gm.String](ctx, w, list[0])
if err != nil {
return nil, err
}
sup.Action = action.String()
path, err := gm.ExpectClass[gm.String](ctx, w, list[1])
if err != nil {
return nil, err
}
sup.Path = path.String()
case 1:
return nil, gm.ErrTooFewArguments
case 0:
return nil, gm.ErrTooFewArguments
}
rc, err := sup.ShellExecute()
return gm.Integer(rc), err
}
func trueOrNil(b bool) gm.Node {
if b {
return gm.True
} else {
return gm.Null
}
}
func funStat(ctx context.Context, w *gm.World, args []gm.Node) (gm.Node, error) {
_fname, err := gm.ExpectClass[gm.String](ctx, w, args[0])
if err != nil {
return nil, err
}
fname := _fname.String()
stat, err := os.Stat(fname)
if err != nil {
if os.IsNotExist(err) {
return gm.Null, nil
}
return nil, err
}
var cons gm.Node = gm.Null
cons = &gm.Cons{
Car: &gm.Cons{Car: gm.NewSymbol("name"), Cdr: gm.String(stat.Name())},
Cdr: cons,
}
cons = &gm.Cons{
Car: &gm.Cons{Car: gm.NewSymbol("is-dir"), Cdr: trueOrNil(stat.IsDir())},
Cdr: cons,
}
cons = &gm.Cons{
Car: &gm.Cons{Car: gm.NewSymbol("size"), Cdr: gm.Integer(stat.Size())},
Cdr: cons,
}
mt := stat.ModTime()
cons = &gm.Cons{
Car: gm.List(
gm.NewSymbol("mod-time"),
gm.Integer(mt.Year()),
gm.Integer(mt.Month()),
gm.Integer(mt.Day()),
gm.Integer(mt.Hour()),
gm.Integer(mt.Minute()),
gm.Integer(mt.Second())),
Cdr: cons,
}
cons = &gm.Cons{
Car: &gm.Cons{
Car: gm.NewSymbol("mod-time-unix"),
Cdr: gm.Integer(mt.Unix()),
},
Cdr: cons,
}
return cons, nil
}