// TESLER changed Quit, Section -> Page, added "sel" args
// QDIRTY.SR
// N.B bounds procedures return cp to start of text, cp to start of
// trailer, cp to end of trailer and
// macpara returns number of paras, para number macpara does
// not exist, -1 is fake for binsearcha, -2 is the dummy para at end
// $$ some procedures moved here from gmenu.sr
get "BRAVO.DF"
get "CHAR.DF"
get "GINN.DF"
// Incoming Procedures
external [
getvch
deleteparas
cppara
paracp
paraspec
setformata
parabounds
stappend
cpparabounds
readsel
setmessage
invalidatedisplay
fdeletea
wipedoc
getdoc
qreadfile1
resetmessage
hpalloc
selectsel
stcopy
stnum
stsubstring
finsertstring
paranum
stsize
stget
turntopage
finserta
invalidatedoc
hidemark
lastparacp
pagecp
makepage
finishchanges
establishww
move
qwritefile1
stequal
dirflip
finsertk
finsertparastring
macpara
insertparas
specstate
nextspecstate
invalidateband
movec
hpfree
gcspecs
// ** TESLER ADDED
freedl
];
// Incoming Statics
external [
vcp
vchremain
rgpage
rgcpfirst
vwwcurrent
ddoc
vdlhint
rgdirty
vdoc
vww
rgsdoc
sdoc
rgmaccp
rgdoc
rgsfile
pzone
selection
selaux
sww
vcpfinsert
vdcborig
macww
rgprogram
vlook
vquad
rgpctb
// ** TESLER ADDED
rgdlfirst
rgdllast
vwindowstripe // %%
];
// Outgoing Procedures
external [
qturnto
qparsename
qaddpage
qmakeversion
qcreatedraft
qfetch
qfile
qourfile
qquit
];
let qaddpage(char, sel) = valof
[
let snum = nil
let sbfnam = vec sbfnaml
let pnum = cppara(ddoc, char)
let cpfpara,cplpara,cptlr=nil,nil,nil
qparsename(ddoc, char, sbfnam, lv snum)
if paracp(ddoc, pnum+2)-paracp(ddoc, pnum+1) eq 2 then
[
setmessage(" First type label, then bug Insert")
resultis true
]
insertparas(ddoc, pnum+2, ddoc, macpara(ddoc)-2, macpara(ddoc)-2)
parabounds(ddoc, pnum+1, lv cpfpara, lv cplpara, lv cptlr)
invalidateband(ddoc, cpfpara, cplpara-1)
setformata(ddoc, cpfpara, cplpara-1, $b)
let tpnum = qmakesection(pnum+1, snum)
qreplacetext(pnum, "Insert a new",
"Find the")
qmakeadd(pnum+2, snum+1)
makepage(ddoc, paracp(ddoc, tpnum+3))
rgdirty!ddoc = true
qfiledir()
resultis true
]
and qmakeversion(char, sel) = valof
[
let cptlr,cpfpara,cplpara = nil,nil,nil
let snum,vnum = nil,nil
let nxtvernam = vec sbfnaml
let draftnam = vec sbfnaml
let pnum = cppara(ddoc, char)
qparsename(ddoc, char, nxtvernam, lv snum, lv vnum)
if paracp(ddoc, pnum+2)-paracp(ddoc, pnum+1) eq 2 then
[
setmessage(" First type title, then bug Copy")
resultis true
]
insertparas(ddoc, pnum+2, ddoc, macpara(ddoc)-2, macpara(ddoc)-2)
qreplacetext(pnum,
"Copy the Working Draft to a new",
"Fetch the")
parabounds(ddoc, pnum+1, lv cpfpara, lv cplpara, lv cptlr)
invalidateband(ddoc, cpfpara, cplpara-1)
setformata(ddoc, cpfpara, cplpara-1, $b)
qmakemake(pnum+2, snum, vnum+1)
[
pnum = pnum-1
parabounds(ddoc, pnum, lv cpfpara, lv cplpara, lv cptlr)
specstate(ddoc, cpfpara, pnum)
nextspecstate()
if (vlook & mmenu) ne 0 then break
] repeat
qparsename(ddoc, cpfpara, draftnam, lv snum, lv vnum)
deleteparas(ddoc, pnum, pnum+1)
qfetch1(draftnam, false)
qfile1(rgsdoc!vwwcurrent, vwwcurrent, nxtvernam)
qfiledir()
hpfree(rgsfile ! (rgsdoc ! vwwcurrent))
rgsfile ! (rgsdoc ! vwwcurrent) = 0
resultis true
]
and qcreatedraft(char, sel) = true
and qfiledir() be
[
let sbfnam = vec sbfnaml
setmessage(" Updating file cabinet...") // %%
finishchanges(ddoc)
establishww(vwwcurrent)
stcopy(sbfnam, "GYPSY.DIRECTORY")
qwritefile1(sbfnam,ddoc,0,rgmaccp!ddoc-1,false)
resetmessage()
rgdirty ! ddoc = false
]
and qfetch(char, sel) = valof
[
let sbfnam = vec sbfnaml
let snum,vnum=nil,nil
qparsename(ddoc, char, sbfnam, lv snum, lv vnum)
resultis qfetch1(sbfnam, true)
]
and qfetch1(sbfnam, turntoit) = valof
[
let tww = vww
wipedoc(rgsdoc ! tww)
if turntoit then getdoc(tww,rgsdoc!tww)
invalidatedoc(sdoc) // LT
wipedoc(sdoc); // scratch pad too **
finsertk(sdoc, 0, 0) // LT
setmessage(" Fetching document...")
let doc = turntoit? rgdoc ! tww, rgsdoc ! tww
invalidatedoc(doc)
test qreadfile1(sbfnam, doc, 0) // **
ifso [
test rgprogram ! doc
ifso [
setmessage(" Fetched unformatted document")
vwindowstripe = true // %%
]
ifnot resetmessage()
if rgsfile!doc eq 0 then
rgsfile!doc = hpalloc(sbfnaml,pzone)
stcopy(rgsfile!doc,sbfnam)
]
ifnot [
setmessage(" Could not fetch document")
getdoc(tww, ddoc)
]
rgdirty ! doc = false
vwwcurrent = tww
selectsel(selection, tww, 0)
selectsel(selaux, sww, 0)
hidemark()
resultis 1
]
and qfile(char, sel) = valof
[
let tww = vwwcurrent
let tdoc=rgdoc!tww
if tdoc eq sdoc then resultis true
let tname =vec sbfnaml
move(rgsfile!tdoc,tname,sbfnaml)
resultis qfile1(tdoc, tww, tname)
]
and qourfile(char, sel) = valof
[
let tww = vwwcurrent
let tdoc=rgsdoc!tww
if tdoc eq sdoc then resultis true
let tname =vec sbfnaml
let dummy = nil
qparsename(ddoc, char, tname, lv dummy, lv dummy)
move(tname,rgsfile!tdoc,sbfnaml)
resultis qfile1(tdoc, tww, tname)
]
and qfile1(doc, ww, tname) = valof
[
setmessage(" Filing document...") // %% before finishchanges
finishchanges(doc)
establishww(ww)
qwritefile1(tname,doc,0,rgmaccp!doc-1,false)
resetmessage()
rgdirty ! doc = false
resultis true
]
and qquit(char, sel) = valof
[
for ww = 2 to macww-2 do
[
if rgdoc ! ww eq sdoc % rgdoc ! ww eq ddoc then loop ;
if rgdirty ! (rgdoc ! ww) then
[
setmessage(" Before quitting, File or Cancel all documents")
resultis 1
]
]
// TESLER REDID THE REST OF THIS PROCEDURE FOR COUNTERJUNTA:
if rgdirty ! ddoc then qfiledir()
// can not deletea LF pieces in docsys and mdoc!
for doc = 2 to maxdoc-1 do if rgpctb ! doc ne -1 then wipedoc(doc)
gcspecs()
for ww = 2 to macww-1 do
[
for dl = rgdlfirst ! ww + 1 to rgdllast ! ww do freedl(dl)
rgdllast ! ww = rgdlfirst ! ww
]
resultis false
]
and qreplacetext(pnum, oldtext, newtext) be
[
let cptlr,cpfpara,cplpara = nil,nil,nil
let len = stsize(oldtext)
let lenn = stsize(newtext)
let ch = nil
let cpl = -1
[
cpl = cpl+1
ch = stget(newtext, cpl)
] repeatuntil ch eq chsp % cpl eq lenn
parabounds(ddoc, pnum, lv cpfpara, lv cplpara, lv cptlr)
invalidatedisplay(ddoc, cpfpara, -1)
fdeletea(ddoc, cpfpara, cpfpara+len-1)
finsertstring(ddoc, cpfpara, newtext)
setformata(ddoc, cpfpara, cpfpara+cpl-1, $m, $i)
]
and qmakesection(pnum, snum) = valof
[
let para = vec paral
let tpnum = macpara(ddoc)-2
invalidatedisplay(ddoc, paracp(ddoc, tpnum), -1)
insertparas(ddoc, tpnum, ddoc, tpnum, tpnum)
invalidatedisplay(ddoc, paracp(ddoc, macpara(ddoc)-2), -1)
insertparas(ddoc, macpara(ddoc)-2, ddoc, pnum, pnum)
let cpfpara,cplpara,cptlr=nil,nil,nil
parabounds(ddoc, macpara(ddoc)-3, lv cpfpara, lv cplpara, lv cptlr)
invalidateband(ddoc, cpfpara, cplpara-1)
setformata(ddoc, cpfpara, cplpara-1, $c, $b)
qmakemake(macpara(ddoc)-2, snum, 1)
resultis tpnum
]
and qmakeadd(pnum, snum) be
[
let para = vec paral
let cpfm = 0
stcopy(para, "Insert a new Folder labelled... ")
let cplm = stsize("Insert")-1
let cpfv = stsize(para)
qappendstrnum(para, "*T*T{S", snum, true)
stappend(para, "}")
let cplv = stsize(para)-1
qdomake(pnum, para, cpfm, cplm, cpfv, cplv)
]
and qmakemake(pnum, snum, vnum) be
[
let para = vec paral
let sbfnam = vec sbfnaml
let cplm = nil
let cpfm = 0
stcopy(sbfnam, "")
qappendstrnum(sbfnam, "GYPSY-S", snum, true)
stappend(sbfnam, "-V0")
stappend(sbfnam, ".FILE")
if vnum eq 1 then
[
let tdoc = rgsdoc ! vwwcurrent
wipedoc(tdoc)
for i = 1 to 5 do // %% create 32 blank paragraphs
[
invalidatedisplay(tdoc,
paracp(tdoc, macpara(tdoc)-2), -1)
insertparas(tdoc, macpara(tdoc)-2, tdoc,
0, macpara(tdoc)-2) // %% 0
]
if rgsfile!tdoc eq 0 then rgsfile!tdoc =
hpalloc(sbfnaml,pzone)
move(sbfnam, rgsfile!tdoc, sbfnaml)
qfile1(tdoc, vwwcurrent, sbfnam)
]
stcopy(para, "Fetch the Working Draft ")
cplm = cpfm + stsize("Fetch")-1
let cpfv = stsize(para)
stappend(para,"*T*T{")
stappend(para,sbfnam)
stappend(para,"}")
let cplv = stsize(para)-1
qdomake(pnum, para, cpfm, cplm, cpfv, cplv)
stcopy(sbfnam, "")
qappendstrnum(sbfnam, "GYPSY-S", snum, true)
qappendstrnum(sbfnam, "-V", vnum, true)
stappend(sbfnam, ".FILE")
stcopy(para, "Copy the Working Draft to a new Draft titled... ")
cplm = cpfm + stsize("Fetch")-1
let cpfv = stsize(para)
stappend(para,"*T*T{")
stappend(para,sbfnam)
stappend(para,"}")
let cplv = stsize(para)-1
qdomake(pnum+2, para, cpfm, cplm, cpfv, cplv)
]
and qdomake(pnum, para, cpfm, cplm, cpfv, cplv; numargs N) be
[
// cpfm always 0, vanish always to end of paragraph
invalidatedisplay(ddoc, paracp(ddoc, pnum), -1)
insertparas(ddoc, pnum, ddoc, macpara(ddoc)-2, macpara(ddoc)-2)
let tlr = vec 10
stcopy(tlr, "")
if N ge 6 then
[
qappendstrnum(tlr, "i", 2, false) // 2 is number changes
stappend(tlr, "m")
qappendstrnum(tlr, "I", cplm-cpfm+1, false)
stappend(tlr, "M")
qappendstrnum(tlr, "v", cpfv-cplm-1, false)
]
invalidatedisplay(ddoc, paracp(ddoc, pnum+1), -1)
finsertparastring(ddoc, pnum+1, tlr, para)
invalidatedisplay(ddoc, paracp(ddoc, pnum+2), -1)
insertparas(ddoc, pnum+2, ddoc, macpara(ddoc)-2, macpara(ddoc)-2)
]
and qappendstrnum(para, str, num, order) be
[
let stn = vec 2
stnum(stn, num)
stappend(para, order? str,stn)
stappend(para, order? stn,str)
]
and qparsename(doc, cp, sbfnam, snum, vnum; numargs N) =valof
[
let cpf,cpl=nil,nil
qgetstring(doc,cp,leftdelim,rightdelim,lv cpf,lv cpl)
readsel(sbfnam,vdoc,cpf,cpl,(sbfnaml lshift 1)-1)
let cps = 0
@snum = qfindint(sbfnam, lv cps, cpl-cpf)
if N ge 5 then @vnum = qfindint(sbfnam, lv cps, cpl-cpf)
resultis cpl+2
]
and qturnto(char, sel) = valof
[
let sbfnam = vec sbfnaml
let snum,vnum = nil,nil
let cpfpara,cplpara,cptrlr = nil,nil,nil
cpparabounds(vdoc, char, lv cpfpara, lv cplpara, lv cptrlr)
qparsename(vdoc, cpfpara, sbfnam, lv snum)
turntopage(vdoc, snum)
resultis true
]
and qfindint(string, cpf, cpl) = valof
[
// returns value of first +ve integer in string starting from cp
// or -1 if none
// also resets cp to first char after number
let digit = nil
let int = 0
let i = @cpf
digit = stget(string, i)
while $0 gr digit % digit gr $9 do
[
if i eq cpl then resultis -1
i = i+1
digit = stget(string, i)
]
while $0 le digit & digit le $9 do
[
int = (int*10) + digit-$0
if i eq cpl then break
i = i+1
digit = stget(string, i)
]
@cpf = i
resultis int
]
and qgetstring(doc,cp,left,right,cpfirst,cplast) be
[
vdoc=doc
vcp=cp
vchremain=0
until getvch() eq left do loop
rv cpfirst=vcp
until getvch() eq right do loop
rv cplast=vcp-2
]