// GPC.SR getscrwd and putscrwd get "BRAVO.DF"; get "CHAR.DF"; // Incoming Procedures external [ errhlt; ult; ugt; errck; getvp; hpalloca; insertlf; setlf; mult; stsize; stnum; stget; gets; puts; umin; ]; // Incoming Statics external [ vbp; ckproc; ckperr; pctb; rgpctb; rgcp; vpc; rgpcd; ppcd; rgmaccp; rgbs; vcp; cblind; deltacp; vcpput; vchremainput; vlbput; vpwput; mpfnof; ]; // Outgoing Procedures external [ binsearcha; ckbinsearcha; mapcp; mapcpb; prevscrvch; getvch putvch getint; putint; cprealch; getscrwd // ** putscrwd // ** ]; // Outgoing Statics external [ vpw; vlb; vchremain; vpa; pfwpg; vdoc; rcnew; vchremainb; ] // Local Statics static [ vpw; vlb; vchremain; vpa; pfwpg; vdoc; rcnew; vchremainb; ] // P C //B I N S E A R C H A //threshold search for k in tbl // catalogue no. = SPE-59 let binsearcha(tbl,maxi,k) = valof [ let ttbl = tbl-1; let u = maxi; let l = 1; let i = nil; if ult(k,tbl ! maxi) do [ i = (u+l) rshift 1; test ugt((ttbl ! i),k) ifso u = i-1 ifnot [ test ( not ugt( (ttbl ! (i+1)),k)) ifso l = i+1 ifnot resultis i-1 ] ] repeat resultis maxi; ] //C K B I N S E A R C H A //checks to see if tbl!i <= k < tbl!(i+1) // catalogue no. = SPE-63 and ckbinsearcha(tbl,i,k) be [ ckproc = "ckbinsearch"; ckperr = i; if ( ugt(k, (tbl ! i))) % (not ugt( (tbl ! (i+1)),k)) do errck("bs"); ] // M A P C P // returns the number of characters which can be // accessed without another mapcp call, as well as the location // of cp in vpw and vlb // catalogue no. = SPE-76 and mapcp(doc,cp) be [ pctb = rgpctb ! doc; let proc = nil; rgcp = lv(pctb >> PCTB.rgcp); vpc = binsearcha(rgcp,(pctb >> PCTB.macpc),cp); if vpc eq pctb >> PCTB.macpc then errhlt("mpc"); let cppcrel = cp-rgcp ! vpc; rgpcd = (rgcp+(pctb >> PCTB.maxpc)+1); ppcd = rgpcd+(vpc lshift 1); livetest: test ppcd >> PCD.live ifnot [ rcnew = cppcrel+(ppcd >> PCD.rc); vpa = (ppcd >> PCD.vpaddr)+rcnew << PCD.p; pfwpg = getvp(vpa); vpw = pfwpg+(rcnew << PCD.rc rshift 1); test (rcnew << odd) ifso vlb = false; ifnot vlb = true; let pgremain = (#177777 << PCD.rc)+1-(rcnew << PCD.rc); let pcremain = (rgcp ! (vpc+1))-cp; vchremain = umin(pgremain,pcremain); ] ifso [ let plf = ppcd >> PCD.esc; //**proc = lfyield ! (plf >> LF.lf); //**proc(plf); //**proc = lftouch ! (plf >> LF.lf); //**proc(plf); rcnew = cp-(rgcp ! vpc); vpw = (plf >> LF.sl)+1+(rcnew rshift 1); test rcnew << odd ifso vlb = false ifnot vlb = true; vchremain = (rgcp ! (vpc+1))-(cp); ] ] // M A P C P B // returns the number of characters which can be // reverse accessed without another mapcpb call, as well as the location // of cp in vpw and vlb // catalogue no. = SPE-76 and mapcpb(doc,cp) be [ mapcp(doc,cp); test ppcd >> PCD.live ifso vchremainb = rcnew+1 ifnot [ let pgremainb = rcnew << PCD.rc+1; let pcremainb = cp-(rgcp ! vpc)+1; vchremainb = umin(pcremainb,pgremainb); ] ] // C R E A T E D O C E // catalogue no. = SPE-99 and createdoce(doc,maxpc) be [ rgpctb ! doc = hpalloca(maxpc*3+1+pctbl); rgmaccp ! doc = 0; (rgpctb ! doc) >> PCTB.maxpc = maxpc; (rgpctb ! doc) >> PCTB.macpc = 0; (rgpctb ! doc) >> PCTB.rgcp = 0; ] // C R E A T E D O C M // and createdocm(doc) be [ createdoce(doc,1); insertlf(doc,0,lfedoc,doc,4); setlf(lfedoc,doc," ~"); ] // P R E V S C R V C H // catalogue no. = 138 and prevscrvch( ) = valof [ let char = nil; vcpput = vcpput-1; (mpfnof ! fnscr) >> OF.pos = vcpput; gets(fnscr); (mpfnof ! fnscr) >> OF.pos = vcpput; puts(fnscr,chblind); (mpfnof ! fnscr) >> OF.pos = vcpput; cblind = cblind+1; deltacp = deltacp-1; resultis char; ] // G E T V C H // catalogue no. = 135 and getvch( ) = valof [ let char = nil; if vchremain eq 0 then mapcp(vdoc,vcp) ; test vlb ifso [ char = vpw >> lh; vlb = false; ] ifnot [ char = vpw >> rh; vlb = true; vpw = vpw+1; ] vchremain = vchremain-1; vcp = vcp+1; resultis char; ] // ** GYPSY DELETED GETINT // P U T V C H // catalogue no. = SPE-107 and putvch(char) be [ (mpfnof ! fnscr) >> OF.pos = vcpput; puts(fnscr,char); vcpput = vcpput+1; ] // ** GYPSY DELETED PUTINT AND CPREALCH // ** GYPSY ADDED: // G E T S C R W D and getscrwd() = valof [ (mpfnof ! fnscr) >> OF.pos = vcp; (mpfnof ! fnscr) >> OF.wmode = true; let wd = gets(fnscr); vcp = vcp+2; (mpfnof ! fnscr) >> OF.wmode = false; resultis wd; ] // P U T S C R W D and putscrwd(wd) be [ (mpfnof ! fnscr) >> OF.pos = vcpput; (mpfnof ! fnscr) >> OF.wmode = true; puts(fnscr,wd); vcpput = vcpput+2; (mpfnof ! fnscr) >> OF.wmode = false; ]