// GCPDL.SR ** GYPSY changes get "BRAVO.DF" get "CHAR.DF" get "GINN.DF" // ** // Incoming procedures external [ ult ugt binsearcha invalidatedisplay updatedisplay mapcp move format mapcpb; errhlt // ** GYPSY ADDED: paracp cppara umin vrgcc ] // Incoming statics external [ rgdlfirst rgdllast rgcpfirst rgcplast rgdoc rgcpfdispl vcp rgmaccp pctb rgpctb rgcp vpc vchremain vlb vpw vcplast vchremainb // ** GYPSY ADDED: vww rgupdate rgpara vturning ] // Outgoing procedures external [ finddl; cpvisible; backnlines; visible; backscan forwardscan // ** GYPSY ADDED: cpseeable; ] // Outgoing statics external [ rgcpfirstinl cpfirstinl; ] // Local statics static [ rgcpfirstinl cpfirstinl; ] // F I N D D L // SPE catalogue no. let finddl(ww,cp) = valof [ let dlfirst = rgdlfirst ! ww; if (rgdllast ! ww ls dlfirst) % ult(cp,rgcpfirst ! dlfirst) % ugt( cp,rgcplast ! (rgdllast ! ww)) then resultis -1; resultis dlfirst+binsearcha(lv(rgcpfirst ! dlfirst), ((rgdllast ! ww)-dlfirst),cp); ] // end finddl // C P V I S I B L E // and cpvisible(ww,cp) be [ let tdoc = rgdoc ! ww; invalidatedisplay(tdoc,rgcpfdispl ! ww,-1); backnlines(ww,cp,0); invalidatedisplay(tdoc,vcp,-1); rgcpfdispl ! ww = vcp; vturning = true updatedisplay( ); ] // B A C K N L I N E S //catalogue no. = 116 and backnlines(ww,cp,n) = valof [ let tcp = 0; let char = nil; let tl = nil; let k = nil; let doc = rgdoc ! ww; let chfixpoint = chcr; n = umin(n,maxl-1); if cp eq rgmaccp ! doc & cp ne 0 then cp = cp-1; vcp = 0; unless cp eq 0 do [ tcp = cp-1; if backscan(doc,tcp,-1,chfixpoint) then if n do [ vww = ww; tcp = vcp; if vcp & (chfixpoint eq chcr) then vcp = vcp+1; format(doc,vcp); vcp = tcp; unless ult(vcplast,cp) do backscan(doc,tcp-1,-1,chfixpoint); ] ] if vcp & (chfixpoint eq chcr) then vcp = vcp+1; vww = ww; let l = 0; [ test l ls maxl ifso [ rgcpfirstinl ! l = vcp; ] ifnot [ move(rgcpfirstinl+1,rgcpfirstinl,maxl-1) rgcpfirstinl ! (maxl-1) = vcp; ] format(doc,vcp); if not ult(vcplast,cp) then [ k = umin(l,n); tl = umin(maxl-1,l); vcp = rgcpfirstinl ! (tl-k); resultis k; ] vcp = vcplast+1; l = l+1; ] repeat ] // B A C K S C A N // and backscan(doc,cp,mode,arg1,arg2; numargs N) = valof [ let tchar = nil; let twoargs = true; if N ls 5 then [ arg2 = -1; twoargs = false; ] pctb = rgpctb ! doc; rgcp = lv (pctb >> PCTB.rgcp); vcp = cp; let foundnonbreakchar = false; [ mapcpb(doc,vcp); [ test vlb ifso [ tchar = vpw >> lh; vpw = vpw-1; vlb = false; ] ifnot [ tchar = vpw >> rh; vlb = true; ] unless foundnonbreakchar % (vrgcc+tchar) >> CC.breakchar do foundnonbreakchar = false; test mode ifso test twoargs ifnot if tchar eq arg1 then resultis true ifso if (tchar eq arg1) % (tchar eq arg2) then resultis true ifnot test ult(vcp,arg1) ifso test tchar eq chcr ifso resultis false ifnot resultis true ifnot if foundnonbreakchar & (vrgcc+tchar) >> CC.breakchar then resultis false; if vcp eq 0 then resultis false; vchremainb = vchremainb-1; vcp = vcp-1; unless vchremainb then break; ] repeat ] repeat ] // F O R W A R D S C A N // and forwardscan(doc,cp,mode,arg1,arg2; numargs N) = valof [ let tchar = nil; let twoargs = true; let maccp = rgmaccp ! doc; if N ls 5 then [ arg2 = -1; twoargs = false; ] unless mode do errhlt("m0"); pctb = rgpctb ! doc; rgcp = lv (pctb >> PCTB.rgcp); vcp = cp; [ mapcp(doc,vcp); while vchremain do [ test vlb ifso [ tchar = vpw >> lh; vlb = false; ] ifnot [ tchar = vpw >> rh; vlb = true; vpw = vpw+1; ] vchremain = vchremain-1; test mode ifso test twoargs ifnot if tchar eq arg1 then resultis true ifso if (tchar eq arg1) % (tchar eq arg2) then resultis true ifnot errhlt("m0"); vcp = vcp+1; if vcp eq maccp then resultis false; ] ] repeat ] // V I S I B L E // and visible(ww,cp) = valof [ test rgdllast ! ww ls rgdlfirst ! ww % // ** new condition ult(cp,rgcpfdispl ! ww) % ugt(cp,(rgcplast ! (rgdllast ! ww))) // ** was +1) ifso resultis false ifnot resultis true; ] // C P S E E A B L E // ** and cpseeable(ww,cp,orcp; numargs N) = valof [ // ** marks must be off ** if N eq 3 & visible(ww, orcp) then resultis false test ult(cp,rgcpfdispl ! ww) ifso test ult(cp, rgcpfdispl ! ww - farcp) ifso cpvisible(ww, cp) ifnot [ let n = 2; vcp = rgcpfdispl ! ww; [ n = n-backnlines(ww,vcp,n); ] repeatuntil (vcp eq 0) % (n eq 0) rgcpfdispl ! ww = vcp; rgupdate ! ww = true; vturning = true updatedisplay( ); resultis true; ] ifnot if not ult(cp,rgcplast ! (rgdllast ! ww)) then test ugt(cp, rgcplast ! (rgdllast ! ww)+farcp) ifso cpvisible(ww, cp) ifnot [ rgcpfdispl ! ww=rgcplast ! (rgdlfirst ! ww)+1; rgupdate ! ww = true; vturning = true updatedisplay( ); resultis true; ] resultis false ]