// GCOMPACT.SR Compact display data on heap get "DISPLAY.DF" get "BRAVO.DF" get "HEAP.DF" // Incoming procedures external [ hpcompact // ** enfs hpalloc ult errhlt freedl findlfpc; // ** fsassign; enpspecs // ** ugt hpfree // %% max // %% ] // Incoming statics external [ inheap vpzone macww rgdlfirst rgdllast rgpbm rgpctb dnlf vlf mpfnsb mpfunsb rgfont rgrgcc vrgcc fontstd // ** vfont mpdldcb pbmfirstfree rghpused rgpbmnew; // ** rgfs; // ** rgfsnew; // ** vfsesc; // ** rgfsesc; vwwlock; rgul; cnrgul; vcompactlock; mpfnof; // GYPSY ADDED: ** rgsfile rgpara rgspec currentspec otherspec rgpage rgpagenum rgreadonly attoplevel // %% mww // %% // END GYPSY ADDITIONS ] // Outgoing procedures external [ enphpd; enphp; compactdisplay hpalloca adjustphpd makeroominheap trycompact newsphp // %% freesphp // %% ] // Outgoing statics external [ vup vproc sphp // %% ] // Local statics static [ vup vproc csphp = 0 // %% sphp // %% ] // C O M P A C T D I S P L A Y // SPE catalogue no. let compactdisplay() be [ let minphp,maxphp = nil,nil; test vup ifso [ minphp = vpzone >> ZONE.min+hpbuf; maxphp = vpzone >> ZONE.max+hpbuf; ] ifnot [ minphp = vpzone >> ZONE.min-hpbuf; maxphp = vpzone >> ZONE.max-hpbuf; ]; hpcompact(vup,minphp,maxphp); vup = not vup; ] and trycompact() = valof [ if ugt(vpzone >> ZONE.cfree, vpzone >> ZONE.free >> HP.fp >> HP.siz) then [ let abandoned = gchp(vpzone) // %% compactdisplay() resultis abandoned? abandoned, -1 // %% ] resultis false ] and gchp(zone) = valof // %% [ if not attoplevel then resultis 0 enphp(hpmarkused) let abandoned = 0 let minphp,maxphp = zone >> ZONE.min,zone >> ZONE.max; let tphp = minphp; let abphp = 0 [ let tblksiz = tphp >> HP.siz; if tblksiz eq 0 then errhlt("HBZ"); (lv tphp >> HP.siz)>>odd = 0 let nxphp = tphp+tphp >> HP.siz; if (tphp >> HP.fp eq 0) % (tphp >> HP.fp eq prevfree) then if tblksiz<<odd eq 0 then [ if abphp then hpfree(abphp) abandoned = abandoned+1; abphp = tphp+offset HP.use/16 ] tphp = nxphp; if ugt(tphp,maxphp) then errhlt("HSL"); ] repeatuntil tphp eq maxphp; if abphp then hpfree(abphp) resultis abandoned ] and hpmarkused(php) be // %% (lv (rv php - offset HP.use/16)>>HP.siz)>>odd = 1 // E N P H P D // catalogue no. and enphpd(proc) be [ for ww = 0 to macww-1 do for dl = rgdlfirst ! ww to rgdllast ! ww do if rgpbm ! dl ne 0 then proc(dl,rgpbm ! dl) ] // E N P H P // catalogue no. and enphp(proc) be [ let lf,tp = nil,nil; let pctb,rgcp = nil,nil; let ppcd = nil; for i = 0 to maxlf-1 do [ if dnlf ! i eq 0 then loop; tp = lv(dnlf ! i); lf = rv tp; while lf do [ proc(lv(lf >> LF.sl)); proc(tp); pctb = rgpctb ! (lf >> LF.doc); rgcp = lv (pctb >> PCTB.rgcp); ppcd = rgcp+(pctb >> PCTB.maxpc)+1+((lf >> LF.pc) lshift 1); if (lf >> LF.pc ge pctb >> PCTB.macpc) % (lf >> LF.pc ls 0) % (not ppcd >> PCD.live) % (ppcd >> PCD.esc ne lf) then lf >> LF.pc = findlfpc(lf >> LF.doc,lf); ppcd = rgcp+(pctb >> PCTB.maxpc)+1+((lf >> LF.pc) lshift 1); proc(lv (ppcd >> PCD.esc)); tp = lv(lf >> LF.link); lf = lf >> LF.link; ]; ]; for i = 0 to maxdoc-1 do [ pctb = rgpctb ! i; if pctb eq -1 then loop; proc(rgpctb+i); ] proc(lv vlf); for i = 0 to maxfn-1 do [ if inheap(mpfnsb ! i) then proc(lv(mpfnsb ! i)); if inheap(mpfnof ! i) then proc(mpfnof+i); ] // for i = 0 to macbp-1 do // if dnbp ! i ne 0 then proc(lv(dnbp ! i)); // **enfs(proc); for fun = 0 to maxfun-1 do [ if inheap(mpfunsb ! fun) then proc(mpfunsb+fun); if inheap(rgfont ! fun) then proc(rgfont+fun); if inheap(rgrgcc ! fun) then proc(rgrgcc+fun); ] if inheap(vrgcc) then proc(lv vrgcc); if inheap(vfont) then proc(lv vfont); if inheap(fontstd) then proc(lv fontstd); // ** for ww = 0 to macww-1 do for dl = rgdlfirst ! ww to rgdllast ! ww do if rgpbmnew ! dl ne 0 then proc(rgpbmnew+dl) // ** GYPSY ADDITIONS: if currentspec then proc(lv currentspec) if otherspec then proc(lv otherspec) for i = 1 to csphp do if sphp!i then proc(sphp!i) // %% enpspecs(proc) for i=0 to maxdoc-1 do if rgpctb ! i ne -1 then [ if rgsfile ! i then proc(lv(rgsfile ! i)) if rgpara ! i then proc(lv(rgpara ! i)) if rgspec ! i then proc(lv(rgspec ! i)) if rgpage ! i then proc(lv(rgpage ! i)) if rgpagenum ! i then proc(lv(rgpagenum ! i)) if rgreadonly ! i then proc(lv(rgreadonly ! i)) ] // ** END GYPSY ADDITIONS: ] // end enphp and newsphp(php) = valof // %% [ for i = 1 to maxsphp do if not sphp!i then [ sphp!i = php csphp = max(i, csphp) resultis i ] errhlt("SPH") ] and freesphp(i) be sphp ! i = 0 // %% // A D J U S T P H P D // catalogue no. and adjustphpd(id,phpnew) be [ let dl = id; phpnew = phpnew+(offset HP.use)/16; (mpdldcb ! dl) >> DCB.sa = phpnew; rgpbm ! dl = phpnew; ] // H P A L L O C A // catalogue # SPE- and hpalloca(siz) = valof // ** SUBROUTINIZED MAKEROOMINHEAP [ let adr = hpalloc(siz); if adr ne 0 then resultis adr; makeroominheap(siz) // ** unless vcompactlock do compactdisplay( ); adr = hpalloc(siz); if adr eq 0 then errhlt("HPE"); resultis adr; ] // M A K E R O O M I N H E A P // Gypsy added and makeroominheap(siz) be // ** EXTRACTED FROM HPALLOCA [ let hpovd = vpzone >> ZONE.ovh; for ww = macww-1 to mww+1 by -1 do // %% unless vwwlock eq ww do for dl = rgdllast ! ww to rgdlfirst ! ww+1 by -1 do [ unless ult(vpzone >> ZONE.cfree, siz+hpovd) do return pbmfirstfree = 1; rghpused ! ww = rghpused ! ww - ((rgpbm ! dl)-((offset HP.use)/16)) >> HP.siz; freedl(dl); // ** if rgfsesc ! ww then // ** fsassign(rgfs+dl,0); if rgul ! dl ls 0 then cnrgul = cnrgul-1; rgdllast ! ww = dl-1; ] errhlt("HPZ"); ]