ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /appl/wm/samstub.m/
Samstub: module
{
PATH: con "/dis/wm/samstub.dis";
SAM: con "sam -R";
VERSION: con 0;
UTFmax: con 3;
TBLOCKSIZE: con 512; # largest piece of text sent to terminal ...
DATASIZE: con (UTFmax*TBLOCKSIZE+30);
# ... including protocol header stuff
SNARFSIZE: con 4096; # maximum length of exchanged snarf buffer
# Message types
Error, Status, Debug: con iota;
Sammsg: adt {
mtype: int;
mcount: int;
mdata: array of byte;
inshort: fn(h: self ref Sammsg, n: int): int;
inlong: fn(h: self ref Sammsg, n: int): int;
invlong: fn(h: self ref Sammsg, n: int): big;
outcopy: fn(h: self ref Sammsg, pos: int, data: array of byte);
outshort: fn(h: self ref Sammsg, pos: int, s: int);
outlong: fn(h: self ref Sammsg, pos: int, s: int);
outvlong: fn(h: self ref Sammsg, pos: int, s: big);
};
Samio: adt {
ctl: ref Sys->FD; # /cmd/nnn/ctl
data: ref Sys->FD; # /cmd/nnn/data
buffer: array of byte; # buffered data read from sam
index: int;
count: int; # pointers into buffer
};
init: fn(ctxt: ref Context);
start: fn(): (ref Samio, chan of ref Sammsg);
sender: fn(s: ref Samio, c: chan of ref Sammsg);
receiver: fn(s: ref Samio, c: chan of ref Sammsg);
outTs: fn(t, s: int);
outTv: fn(t: int, i: big);
outT0: fn(t: int);
outTsl: fn(t, m, l: int);
outTslS: fn(t, s1, l1: int, s: string);
outTsll: fn(t, m, l1, l2: int);
cleanout: fn();
close: fn(win, tag: int);
cut: fn(t: ref Text, fl: ref Flayer);
findhole: fn(t: ref Text): (int, int);
grow: fn(t: ref Text, l1, l2: int);
horigin: fn(m, l: int);
inmesg: fn(h: ref Sammsg): int;
keypress: fn(key: string);
look: fn(t: ref Text, fl: ref Flayer);
menuins: fn(p: int, s: string, t: ref Text, tg: int);
newtext: fn(tag, tp: int): int;
paste: fn(t: ref Text, fl: ref Flayer);
scrollto: fn(fl: ref Flayer, where: int);
sctget: fn(scts: list of ref Section, p1, p2: int): string;
sctgetlines: fn(scts: list of ref Section, p, n: int):
(int, string);
scthole: fn(t: ref Text, f: int): (int, int);
sctput: fn(scts: list of ref Section, pos: int, s: string):
list of ref Section;
search: fn(t: ref Text, fl: ref Flayer);
send: fn(t: ref Text, fl: ref Flayer);
setlock: fn();
snarf: fn(t: ref Text, fl: ref Flayer);
startcmdfile: fn();
startfile: fn(tag: int): int;
startnewfile: fn();
updatefls: fn(t: ref Text, l: int, s: string);
zerox: fn(t: ref Text);
Tversion, # version
Tstartcmdfile, # terminal just opened command frame
Tcheck, # ask host to poke with Hcheck
Trequest, # request data to fill a hole
Torigin, # gimme an Horigin near here
Tstartfile, # terminal just opened a file's frame
Tworkfile, # set file to which commands apply
Ttype, # add some characters, but terminal already knows
Tcut,
Tpaste,
Tsnarf,
Tstartnewfile, # terminal just opened a new frame
Twrite, # write file
Tclose, # terminal requests file close; check mod. status
Tlook, # search for literal current text
Tsearch, # search for last regular expression
Tsend, # pretend he typed stuff
Tdclick, # double click
Tstartsnarf, # initiate snarf buffer exchange
Tsetsnarf, # remember string in snarf buffer
Tack, # acknowledge Hack
Texit, # exit
TMAX: con iota;
Hversion, # version
Hbindname, # attach name[0] to text in terminal
Hcurrent, # make named file the typing file
Hnewname, # create "" name in menu
Hmovname, # move file name in menu
Hgrow, # insert space in rasp
Hcheck0, # see below
Hcheck, # ask terminal to check whether it needs more data
Hunlock, # command is finished; user can do things
Hdata, # store this data in previously allocated space
Horigin, # set origin of file/frame in terminal
Hunlockfile, # unlock file in terminal
Hsetdot, # set dot in terminal
Hgrowdata, # Hgrow + Hdata folded together
Hmoveto, # scrolling, context search, etc.
Hclean, # named file is now 'clean'
Hdirty, # named file is now 'dirty'
Hcut, # remove space from rasp
Hsetpat, # set remembered regular expression
Hdelname, # delete file name from menu
Hclose, # close file and remove from menu
Hsetsnarf, # remember string in snarf buffer
Hsnarflen, # report length of implicit snarf
Hack, # request acknowledgement
Hexit,
HMAX: con iota;
};