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
|
# warning: autogenerated code; don't bother to change this, change mktypeset.b or fs.b instead
Fs: module {
PATH: con "/dis/alphabet/fs.dis";
Value: adt {
r: fn(v: self ref Value): ref Value.Vr; # status
d: fn(v: self ref Value): ref Value.Vd; # data
c: fn(v: self ref Value): ref Value.Vc; # command
f: fn(v: self ref Value): ref Value.Vf; # fd
s: fn(v: self ref Value): ref Value.Vs; # string
m: fn(v: self ref Value): ref Value.Vm; # selector
p: fn(v: self ref Value): ref Value.Vp; # gate
t: fn(v: self ref Value): ref Value.Vt; # entries
x: fn(v: self ref Value): ref Value.Vx; # fs
typec: fn(v: self ref Value): int;
type2s: fn(t: int): string;
free: fn(v: self ref Value, used: int);
dup: fn(v: self ref Value): ref Value;
pick {
Vr =>
i: chan of string;
Vd =>
i: Datachan;
Vc =>
i: ref Sh->Cmd;
Vf =>
i: chan of ref Sys->FD;
Vs =>
i: string;
Vm =>
i: Cmpchan;
Vp =>
i: Gatechan;
Vt =>
i: Entrychan;
Vx =>
i: Fschan;
}
};
init: fn();
sendnulldir: fn(c: Fschan): int;
copy: fn(src, dst: Fschan): int;
Option: adt {
opt: int;
args: list of ref Value;
};
Datachan: adt {
d: chan of array of byte;
stop: chan of int;
};
Entrychan: adt {
sync: chan of int;
c: chan of Entry;
};
Cmpchan: type chan of (ref Sys->Dir, ref Sys->Dir, chan of int);
Entry: type (ref Sys->Dir, string, int);
Gatequery: type (Entry, chan of int);
Gatechan: type chan of Gatequery;
Fsdata: adt {
dir: ref Sys->Dir;
data: array of byte;
};
Fschan: type chan of (Fsdata, chan of int);
Next, Down, Skip, Quit: con iota;
Nilentry: con (nil, nil, 0);
};
Fsmodule: module {
types: fn(): string;
init: fn();
run: fn(ctxt: ref Draw->Context, r: ref Reports->Report,
opts: list of Fs->Option, args: list of ref Fs->Value): ref Fs->Value;
};
Fsfilter: module {
PATH: con "/dis/alphabet/fsfilter.dis";
filter: fn[T](t: T, src, dst: Fs->Fschan)
for{
T =>
query: fn(t: self T, d: ref Sys->Dir, name: string, depth: int): int;
};
};
|