// raid.sr
// Carol Hankins
// May 14, 1976
get "bravo1.df"
get "com.df"
get "doc.df"
get "char.df"
get "msg.df"
//incoming routines
external
[
setsel //params are selection,cpfirst,cplast
MakeCurrentBuf
invalidatedisplay
replacea
InsertBuf
updatedisplay
FInsertCom
umin
ult
mapcp
move
inserta
SetVab
SetRegionSys
]
//incoming statics
external
[
rgmaccp
vdlhint
chcom
selmain
vmapstatus
parsacred
vlook1
vlook2
doctxcurrent
vesccom
vundocom
ttblsacred
dcpendofdoc
]
//outgoing routines
external
[
editrepeat
EditCheck
deletez
replacez
insertz
FAdjustSelEod
]
let editrepeat(cf) = valof
[
// code for a repeat of insert, append, replace
unless cf>>CF.w0 do
[
// Command terminated
SetRegionSys(risyspast, 50)
resultis abmsg
]
let sel = cf>>CF.sel
let doc = sel>>SEL.doc
FAdjustSelEod(sel, cf>>CF.chcom)
let cpfirst = sel>>SEL.cpfirst
let cplast = sel>>SEL.cplast
let cp = nil
let dcp = cplast - cpfirst + 1
cp = cf>>CF.chcom eq $a ? cplast+1, cpfirst
invalidatedisplay(doc, cp, vdlhint)
// should check for improper return from replacea
let doctx = doctxcurrent
switchon cf>>CF.chcom into
[
case $a:
case $i: if vundocom then
doctx = 1
replacea(doc, cp, 0, doctx, 0, rgmaccp ! doctx)
endcase;
case $r: if vundocom then
[
replacea(doctx2, 0, rgmaccp ! doctx2, doctx1, 0, rgmaccp ! doctx1)
InsertBuf(2, doctx, 0, rgmaccp ! doctx)
doctx = 2
]
replacea(doctx1, 0, rgmaccp ! doctx1, doc, cp, dcp)
InsertBuf(1, doc, cp, dcp)
replacea(doc, cp, dcp, doctx, 0, rgmaccp ! doctx)
endcase;
]
let cpMac = rgmaccp ! doctx
setsel(selmain, cp, cp + (cpMac ne 0 ? cpMac-1, 0))
resultis abcomplete
]
and EditCheck(cf) =
vesccom % vundocom ? editrepeat(cf), abnil
// delete command
and deletez(cf) = valof
[
if (vesccom % vundocom) & not cf>>CF.w0 then
[
// Command terminated
SetRegionSys(risyspast, 50)
resultis abmsg
]
let sel = cf>>CF.sel
let doc = sel>>SEL.doc
FAdjustSelEod(sel, $d)
let cpfirst = sel>>SEL.cpfirst
let dcp = sel>>SEL.cplast - cpfirst + 1
invalidatedisplay(doc, cpfirst, vdlhint)
replacea(doctx1, 0, rgmaccp ! doctx1, doc, cpfirst, dcp)
InsertBuf(1, doc, cpfirst, dcp)
replacea(doc, cpfirst, dcp, 0, 0, 0)
MakeCurrentBuf(1)
setsel(selmain, cpfirst, cpfirst)
cf>>CF.w0 = true
resultis abnil
]
// replace
and replacez(cf) = valof
[
let sel = cf>>CF.sel
let cplastOld = sel>>SEL.cplast
FAdjustSelEod(sel, $r)
let doc = sel>>SEL.doc
let ww = sel>>SEL.ww
let cpfirst = sel>>SEL.cpfirst
let dcp = sel>>SEL.cplast - cpfirst + 1
vmapstatus = statusblind; mapcp(doc, cpfirst, parneeded)
let parLook = vec parovhd; move(parsacred, parLook, parovhd)
let ttblLook = vec lnttblMax; move(ttblsacred, ttblLook, lnttblMax)
let look1 = vlook1; let look2 = vlook2
invalidatedisplay(doc, cpfirst, vdlhint)
// do delete first, then store in doctx5, then insert
replacea(doctx5, 0, rgmaccp ! doctx5, doc, cpfirst, dcp)
replacea(doc, cpfirst, dcp, 0, 0, 0)
unless FInsertCom(ww, doc, cpfirst, look1, look2, parLook, ttblLook) do
[
if dcp ne 0 then
[
invalidatedisplay(doc, cpfirst, vdlhint);
inserta(doc, cpfirst, doctx5, 0, dcp-1);
]
// REPLACE Command terminated
SetVab(abmsg, false, 2, 50)
setsel(sel, cpfirst, cplastOld)
cf>>CF.w0 = false
resultis abmsg
]
cf>>CF.w0 = true
resultis abcomplete
]
// insert, append
and insertz(cf) = valof
[
let sel = cf>>CF.sel
let cplastOld = sel>>SEL.cplast
FAdjustSelEod(sel, cf>>CF.chcom)
let doc = sel>>SEL.doc
let tcp = nil
let tcpLook = nil
test cf>>CF.chcom eq $a ifso
[
tcp = sel>>SEL.cplast+1
tcpLook = tcp eq 0 ? tcp, tcp-1
]
ifnot [
tcp = sel>>SEL.cpfirst
tcpLook = tcp
]
vmapstatus = statusblind; mapcp(doc, tcpLook, parneeded)
let parLook = vec parovhd; move(parsacred, parLook, parovhd)
let ttblLook = vec lnttblMax; move(ttblsacred, ttblLook, lnttblMax)
let look1 = vlook1; let look2 = vlook2
unless FInsertCom(sel>>SEL.ww, doc, tcp, look1, look2, parLook, ttblLook) do
[
// {APPEND, INSERT} Command terminated
SetVab(abmsg, false, (cf>>CF.chcom eq $a ? 1, 0), 50)
setsel(sel, sel>>SEL.cpfirst, cplastOld)
cf>>CF.w0 = false
resultis abmsg
]
cf>>CF.w0 = true
resultis abcomplete
]
and FAdjustSelEod(sel, chCom) = valof
[
let doc = sel>>SEL.doc
let fDelete = ((chCom eq $d) % (chCom eq $r)) ? true, false
let cpFirst = sel>>SEL.cpfirst
let cpMac = rgmaccp ! doc - dcpendofdoc
sel>>SEL.cplast = umin(sel>>SEL.cplast+1, cpMac) - 1
sel >> SEL.cpfirst = umin(sel >> SEL.cpfirst,sel >> SEL.cplast+1)
resultis not (fDelete & (cpFirst eq cpMac))
]