// QCOMMAND.SR get "BRAVO.DF" get "CHAR.DF" get "GINN.DF" // Incoming Procedures external [ setpcsiz putvch getvch prevscrvch mapscrcp pollinput finddl insertb inserta setsel deletea updatedisplay marks cpvisible swat readsel cpmax cpmin visible invalidatedisplay invalidatedisplayk invalidatewindow invalidateband invalidatedoc invalidatesel selectsel cpseeable splitpara mergeparas cpparabounds parabounds finserta fdeletea finsertk cppara formatx macpara lastparacp finsertparastring paracp setmessage wholeparas prevunpointablecp getchar endofkeystream hidemark cpc setformata ]; // Incoming Statics external [ selaux selection cpscrt selarg rgmaccp vchremain vdoc vcp vrgcc vdlhint rgpctb rgcp vpc vdcborig cominstream rgdllast rgdlfirst rgxlast vww rgcpfdispl rgcplast rgupdate rgcpfirst rgdoc comt rgsdoc rgsfile ddoc ybug pzone xbias ybias deltacp inword inwordnext cpfirstinl vwwcurrent sww sdoc rgpara rgview vcpfinsert vcpatx vx vcpfirst rgprogram vcpput rgfcode ]; // Outgoing Procedures external [ paste; cut insert coleft coleftword coright placeleft placeright cutpaste exchange paragraph carrier tabulator ]; // Outgoing Statics external [ cblind; vinsertk ]; // Local static [ cblind; vinsertk ]; let insert(char) = valof [ let cpfirsttarget = selection >> SEL.cpfirst; let cplasttarget = selection >> SEL.cplast; let doctarget = selection >> SEL.doc; let wwtarget = selection >> SEL.ww; if cpc(cplasttarget, cpfirsttarget) ge 0 then // overtype if wholeparas(doctarget, cpfirsttarget, cplasttarget) then [ cut1(selection) resultis insert(char) ] hidemark() ; let tcp=initinsertk(wwtarget, cpfirsttarget) adjustsel(selection, cpfirsttarget, cplasttarget, tcp+maxcblind) let tchar=insertk(wwtarget, tcp, vpc, char) resultis tchar ] and initinsertk(ww,cp)=valof [ let doc=rgdoc ! ww invalidatedisplay(doc,cp,-1); cp = finsertk(doc,cp,maxcblind); vinsertk = true let ppcd = vec 2 let vpa,tpc = nil,nil vcpput = cpscrt; for i = 0 to maxcblind-1 do putvch(chblind); cblind = maxcblind; vpa << VPA.fn = fnscr; vpa << VPA.fp = cpscrt << PCD.p; ppcd >> PCD.vpaddr = vpa; ppcd >> PCD.rc = cpscrt << PCD.rc; ppcd >> PCD.live = 0; insertb(doc,cp,ppcd,maxcblind) tpc=vpc unless visible(ww,cp) do cpvisible(ww,cp) vpc=tpc resultis cp ] and continueinsertk(doc, cp, char) be [ test (vrgcc+char) >> CC.breakchar ifso invalidatedisplay(doc,cp+deltacp,vdlhint) ifnot invalidatedisplayk(doc,cp+deltacp,vdlhint) vcpput = cpscrt+deltacp; ] and insertk(ww,cp,pcinsertk,char)=valof [ cpseeable(ww, cp) let doc=rgdoc ! ww deltacp = 0; vdlhint = 0; let kind = nil // %% [ switchon comt ! char into [ case slookey: invalidatedisplay(doc,cp+deltacp,vdlhint); kind = (rgfcode ! (char-#200)) << FCODE.kind // %% test kind eq klook % kind eq knormal // %% ifso unless rgprogram ! doc do [ let tcp = cp + deltacp setformata(doc, tcp, tcp+cblind-1, char-#200) selection>>SEL.xfirst=-1 selection>>SEL.xlast=-1 ] ifnot break; endcase; case scoleft: test deltacp ifso [ continueinsertk(doc, cp, chsp) prevscrvch( ) selection>>SEL.xfirst=-1 selection>>SEL.xlast=-1 ] ifnot break; endcase; case stabulator: case scarrier: unless rgprogram ! doc do break case smapchar: char = char eq shsp? chsp, char eq shcr? chcr, char eq shtab? chtab, char case sinchar: continueinsertk(doc, cp, char) putvch(char); unless operate(selection,1,0) do [ selection>>SEL.xfirst=-1 selection>>SEL.xlast=-1 ] cblind = cblind-1; deltacp = deltacp+1; endcase; default: break ] if (cblind eq 0) % (cblind gr (maxcblind lshift 1)) then [ vcpput = cpscrt+deltacp; for i = 0 to maxcblind-1 do putvch(chblind); cblind = maxcblind; cp = finsertk(doc, cp+deltacp, maxcblind) - deltacp setpcsiz(doc,pcinsertk,deltacp+maxcblind); ] test endofkeystream() ifso [ updatedisplay( ); cpseeable(ww, cp+deltacp) marks(true) char=pollinput() marks(false) ] ifnot char=getchar() ] repeat endinsertk(doc,cp,pcinsertk,cblind,deltacp) resultis char ] and endinsertk(doc,cp,pcinsertk,cblind,deltacp) be [ test deltacp eq 0 ifso fdeletea(doc,cp,cp+cblind-1) ifnot [ cpscrt = cpscrt+deltacp finsertk(doc, cp+deltacp, -cblind) // LT setpcsiz(doc,pcinsertk,deltacp); ] vinsertk = false ] and paste(cmdcode) = valof [ let wwtarget=selection >> SEL.ww let doctarget = selection >> SEL.doc; let cpfirsttarget=selection >> SEL.cpfirst let cplasttarget=selection >> SEL.cplast let docrange=selaux >> SEL.doc; let cpfirstrange = selaux >> SEL.cpfirst ; let cplastrange= selaux >> SEL.cplast ; if cpc(cpfirstrange, cplastrange) gr 0 then resultis 0 if docrange eq doctarget then [ if cpc(cpfirsttarget, cplastrange) le 0 & cpc(cpfirsttarget, cpfirstrange) gr 0 % cpc(cpfirstrange, cplasttarget) le 0 & cpc(cpfirstrange, cpfirsttarget) gr 0 then [ setmessage(" Target and range overlap") resultis 0; ] ]; if rgprogram ! doctarget & wholeparas(docrange, cpfirstrange, cplastrange) then [ setmessage(" Can't paste paragraphs in programs") resultis 0 ] if cpc(cpfirsttarget, cplasttarget) le 0 then if wholeparas(doctarget, cpfirsttarget, cplasttarget) ne wholeparas(docrange, cpfirstrange, cplastrange) then [ setmessage(" Target or range is partial paragraph") resultis 0 ] cpseeable(wwtarget, cpfirsttarget) invalidatedisplay(doctarget,cpfirsttarget,vdlhint) finserta(doctarget,cpfirsttarget,docrange,cpfirstrange,cplastrange); adjustsel(selection, cpfirsttarget, cplasttarget, vcpfinsert) test cmdcode eq -1 ifso [ // exchange operate(selaux, -1, 0) updatedisplay() if cpc(cpfirsttarget, cplasttarget) le 0 then [ cpfirsttarget = selection>>SEL.cpfirst cplasttarget = selection>>SEL.cplast invalidatedisplay(docrange, selaux>>SEL.cpfirst, vdlhint) finserta(docrange, selaux>>SEL.cpfirst, doctarget, cpfirsttarget, cplasttarget) cpfirsttarget = selection>>SEL.cpfirst cplasttarget = selection>>SEL.cplast adjustsel(selection, cpfirsttarget, cplasttarget, fdeletea(doctarget, cpfirsttarget, cplasttarget)) ] hidemark() selectsel(selection, wwtarget, 1 + selection>>SEL.cplast) ] ifnot [ // paste operate(selection, -1, 1) if selaux>>SEL.doc ne sdoc then operate(selaux, 0, 2) ] updatedisplay() cpseeable(wwtarget, selection >> SEL.cpfirst) resultis 0; ] and cut(char) = valof [ cpseeable(selection >> SEL.ww, selection >> SEL.cpfirst) resultis cut1(selection) ] and cut1(sel) = valof [ operate(sel, -1, 2) resultis 0; ] and cutpaste(char) = valof [ cut1(selaux) paste(0) ] and exchange(char) = paste(-1) and placeleft(cmdcode) = 0 // // valof //[ //let cpfirst = selection >> SEL.cpfirst ; //let cplast = selection>>SEL.cplast //if cpfirst eq 0 then resultis 0 ; //resultis place(cpfirst,cplast,-1) //] and placeright(cmdcode) = 0 // valof // [ // let cpfirst = selection >> SEL.cpfirst ; // let cplast = selection >> SEL.cplast // if cpc(cpfirst, rgmaccp!(selection>>SEL.doc)-1) ge 0 then resultis 0 ; // resultis place(cpfirst,cplast,+1) // ] //and place(cpfirst,cplast,dir) = valof //[ //findrealch(selection >> SEL.doc, cpfirst+dir, dir) ; //setsel(selection, vcp, cpc(cplast,cpfirst) ls 0?vcp-1,cplast) //resultis 0 //] and coleft(cmdcode) = valof [ hidemark() let cpfirsttarget,doctarget,cplasttarget=nil,nil,nil; doctarget = selection >> SEL.doc cpfirsttarget = selection >> SEL.cpfirst cplasttarget = selection >> SEL.cplast if cpfirsttarget eq 0 then resultis 0; let tex, b, e = nil, nil, nil let para = cpparabounds(doctarget, cpfirsttarget, lv tex, lv b, lv e) if para ge macpara(doctarget)-2 then [ parabounds(doctarget, para-1, lv tex, lv b, lv e) selectsel(selection, selection >> SEL.ww, b) resultis 0 ] cpfirsttarget = cpmin(cpfirsttarget, b) let limit = prevunpointablecp(doctarget, cpfirsttarget) if cpc(cpfirsttarget-1, limit) le 0 then resultis 0 test cpc(cpfirsttarget, tex) gr 0 ifso [ let n = 1 test cmdcode eq -1 ifso [ // coleftword [ cpfirsttarget = cpfirsttarget-1 vcp = cpfirsttarget vchremain = 0 vdoc = doctarget ] repeatwhile getvch() eq chsp & cpc(cpfirsttarget, tex) gr 0 let wwtarget = selection >> SEL.ww let dltarget = finddl(wwtarget, cpfirsttarget) if dltarget ls 0 then [ cpseeable(wwtarget, cpfirsttarget) dltarget = finddl(wwtarget, cpfirsttarget) ] vcpatx = cpfirsttarget formatx(wwtarget,dltarget,0); formatx(wwtarget,dltarget,vx); vcpfirst = cpmax(vcpfirst, limit+1) n = selection >> SEL.cpfirst - vcpfirst selection >> SEL.cpfirst = vcpfirst ] ifnot selection>>SEL.cpfirst=cpfirsttarget-1 correct(n) ] ifnot if para & cpc(cplasttarget, cpfirsttarget) ls 0 then [ invalidateband(doctarget, tex-1, e) adjustsel(selection, cpfirsttarget, cplasttarget, mergeparas(doctarget, para-1, para)) ] resultis 0 ] and correct(n) be [ let cpfirst = selection >> SEL.cpfirst let ww = selection >> SEL.ww let scrback = cpc(cpfirst, rgcpfdispl ! ww + 1) ls 0 ? 1, 0 if cpc(selection >> SEL.cplast, cpfirst) ls 0 then selection >> SEL.cplast = cpfirst-1 operate(selection,n,0) cpseeable(ww, cpmax(cpfirst-scrback, 0)) ] and coleftword(cmdchar) = coleft(-1) and coright(cmdcode) = 0 // valof // [ // let cpfirsttarget,doctarget,cplasttarget=nil,nil,nil; // let eodcp = rgmaccp ! (selection >> SEL.doc)-1 ; // doctarget = selection >> SEL.doc // cpfirsttarget = selection >> SEL.cpfirst // cplasttarget = selection >> SEL.cplast // if cpc(cpfirsttarget, eodcp) ge 0 then resultis 0 ; // correct(1) // resultis 0 //] and operate(sel, op, scratch) = valof [ // op -1 Delete whole selection // 0 Don't delete any of it // n Delete first n characters of it // scratch 0 Don't scratch // 1 Scratch // 2 Scratch and set selaux there let doc = sel>>SEL.doc let cpfirst = sel>>SEL.cpfirst let cplast = sel>>SEL.cplast if cpc(cplast, cpfirst) ls 0 then resultis false let cpend = cpc(op, 1) ls 0? cplast, cpfirst+op-1 let crossout = cpc(cplast, cpend) gr 0 let tex, b, e = nil, nil, nil let teodc = lastparacp(sdoc); if scratch then [ invalidatedisplay(sdoc,teodc,-1); teodc = finserta(sdoc,teodc,doc,cpfirst,cpend); if scratch eq 2 then selectsel(selaux, sww, teodc, vcpfinsert-1) ]; if op ne 0 then [ invalidatedisplay(doc,cpfirst,-1); adjustsel(sel, cpfirst, cplast, fdeletea(doc,cpfirst,cpend)); unless crossout do sel >> SEL.cplast = sel >> SEL.cpfirst - 1; ] if scratch then [ rgupdate ! sww = true ; rgxlast ! (rgdlfirst ! sww) = -1 ; rgcpfdispl ! sww = teodc ; ]; resultis true ] //and findrealch(doc,cp,dir) be //[ //let tex, b, e = nil, nil, nil //cpparabounds(doc, cp, lv tex, lv b, lv e) //vcp=cpc(tex, b+1) ls 0 & cpc(cp+1, tex) gr 0? cp,dir gr 0?e+1, b //] and paragraph(char) = valof [ let doc = selection >> SEL.doc if doc ne sdoc & not rgprogram ! doc then [ let cpfirst = selection >> SEL.cpfirst let cplast = selection >> SEL.cplast if cpc(cplast, cpfirst) ls 0 then resultis 0 invalidatesel(selection) invalidatesel(selaux) let eodc = lastparacp(doc) - 1 invalidateband(doc, cpfirst, cplast) let para2 = cpc(cplast, eodc) ls 0? splitpara(doc, cplast+1, false) - 1, macpara(doc)-1 let para1 = splitpara(doc, cpfirst, false) mergeparas(doc, para1, para2) hidemark() ] resultis 0 ] and adjustsel(selection, cpfirst, cplast, newcpfirst) be [ selection >> SEL.cpfirst = newcpfirst if cpc(cplast, cpfirst) le 0 then selection >> SEL.cplast = cplast + newcpfirst - cpfirst ] and carrier(cmdcode) = valof [ let doc = selection >> SEL.doc if rgprogram ! doc then resultis insert(cmdcode) hidemark() let cpfirst = selection >> SEL.cpfirst let cplast = selection >> SEL.cplast invalidatedisplay(doc, cpfirst, vdlhint) adjustsel(selection, cpfirst, cplast, paracp(doc, splitpara(doc, cpfirst, true))) updatedisplay() cpseeable(selection >> SEL.ww, selection >> SEL.cpfirst) resultis 0 ] and tabulator(cmdcode) = valof [ let doc = selection >> SEL.doc if rgprogram ! doc then resultis insert(cmdcode) // someday this will be a table command resultis 0 ]