// GFILE.SR GYPSY added readfile etc to invoke overlay
get "BRAVO.DF";
get "CHAR.DF";
get "GINN.DF"; // ** for minuserfn
// Incoming Procedures
external [
GETAFILE;
OPENAFILE;
stsize;
hpalloca;
stcopy;
stappend;
ugt;
stget;
stput;
movec;
move;
ActOnPages;
hpfree;
ult;
gets;
RealDA;
GetNextDA;
errhlt;
CreateFile;
puts;
getvp;
WritePages;
trims;
flushfn;
sbwsize;
umin;
VirtualDA;
diskio;
ckdoc;
remakevmtb;
inheap;
// **
qreadfile;
qreadfile1;
qwritefile;
qwritefile1;
overlay
ckdir
];
// Incoming Statics
external [
sbpast;
vcp;
vchremain;
vcplast;
vlb;
vpw;
vrgcc;
SYSTEMDIR;
macbp;
rgvpa;
mpfnof;
dnbp;
vwremain;
fillInDA;
DCread;
vbp;
];
// Outgoing Procedures
external [
open;
normalizefilesb;
opens;
creates;
dirlkup;
fnalloc;
closes;
setmacfp;
updateofs;
endofs;
deallocfn;
// **
readfile;
readfile1;
writefile;
writefile1;
];
// Outgoing Statics
external [
mpfnsb;
cstream;
dnfn;
rgcfn;
macfn;
vsn1;
vsn2;
vversion;
vda;
vpos;
vposhole;
cof;
vdeltafp;
];
// Local Statics
static [
mpfnsb;
cstream;
dnfn;
rgcfn;
macfn;
vsn1;
vsn2;
vversion;
vda;
vpos;
vposhole;
cof;
vdeltafp;
];
manifest [
ldirstruc = 7; // plus the rest of the name
]
// O P E N
// catalogue no. = 124
let open(fn,sb,wf) = valof
[ let tstream = nil;
let tchar = nil;
let tsb = vec (sbfnaml+1);
normalizefilesb(sb,tsb);
unless dirlkup(tsb) do resultis false;
unless opens(fn,vversion,vsn1,vsn2,vda,wf,false) do
[ stcopy(sbpast," File too large -");
resultis false;
]
let siz = (stsize(tsb)+6) rshift 1;
mpfnsb ! fn = hpalloca(siz);
(mpfnsb ! fn) ! 0 = 0;
stcopy(mpfnsb ! fn,tsb);
resultis true;
]
and opens(fn,version,sn1,sn2,da,wf,wmode) = valof
[ let tof = hpalloca(ofsiz+129);
tof >> OF.version = version;
tof >> OF.sn1 = sn1;
tof >> OF.sn2 = sn2;
tof >> OF.wf = wf;
tof >> OF.wmode = wmode;
tof >> OF.rgda = da;
tof >> OF.pos = 0;
tof >> OF.macfp = 129;
let rgda = lv (tof >> OF.rgda);
let lastpage = nil;
let numcharslast = nil;
let numcharsfullpages = nil;
movec(rgda+1,rgda+129,fillInDA);
test wf ifnot
[ lastpage = ActOnPages(0,rgda,lv(tof >> OF.fileid),0,129,DCread,lv numcharslast,0,dnbp ! bpbuff,0);
if lastpage eq 130 then
resultis false;
test lastpage ifso
numcharsfullpages = (lastpage-1) lshift 9
ifnot numcharsfullpages = 0;
tof >> OF.macpos = numcharsfullpages+numcharslast;
mpfnof ! fn = tof;
setmacfp(fn,lastpage+1);
]
ifso [ mpfnof ! fn = tof;
tof >> OF.macpos = 0;
]
cof = cof+1;
resultis true;
]
// C R E A T E S
//
and creates(fn,sb,wf,wmode) = valof
[ let tsb = vec sbfnaml+1;
normalizefilesb(sb,tsb);
unless dirlkup(tsb) do
[ let dir = vec (offset DIR.name)/16
dir ! 4 = 0;
CreateFile(tsb,dir+1);
dir >> DIR.da = VirtualDA(dir >> DIR.da);
let sizdir = (offset DIR.name)/16+sbwsize(tsb);
(mpfnof ! fndir) >> OF.wf = true;
if vposhole ne (mpfnof ! fndir) >> OF.macpos then
[ (mpfnof ! fndir) >> OF.pos = vposhole;
let sizhole = gets(fndir);
if sizhole ls sizdir then errhlt("siz");
if sizdir ls sizhole then
[ (mpfnof ! fndir) >> OF.pos = vposhole;
puts(fndir,sizhole-sizdir);
vposhole = vposhole+((sizhole-sizdir) lshift 1);
]
]
(mpfnof ! fndir) >> OF.pos = vposhole;
dir >> DIR.type = 1;
dir >> DIR.siz = sizdir;
for i = 0 to (offset DIR.name)/16-1 do
puts(fndir,dir ! i);
for i = 0 to sbwsize(tsb)-1 do
puts(fndir,tsb ! i);
flushfn(fndir);
(mpfnof ! fndir) >> OF.wf = false;
vsn1 = dir >> DIR.sn1;
vsn2 = dir >> DIR.sn2;
vversion = dir >> DIR.version;
vda = RealDA(dir >> DIR.da);
vpos = vposhole;
]
unless opens(fn,vversion,vsn1,vsn2,vda,wf,false) do
[ stcopy(sbpast," File too large -");
resultis false;
]
let siz = (stsize(tsb)+6) rshift 1;
mpfnsb ! fn = hpalloca(siz);
(mpfnsb ! fn) ! 0 = 0;
stcopy(mpfnsb ! fn,tsb);
ckdir() // **
resultis true;
]
// N O R M A L I Z E F I L E S B
//
and normalizefilesb(sbsource,sbdest) be
[
let tchar = nil;
sbdest >> lh = stsize(sbsource);
for i = 0 to sbsource >> lh-1 do
[ tchar = stget(sbsource,i);
stput(sbdest,i,tchar % #40);
]
if tchar ne $. then
stappend(sbdest,".");
unless (sbdest >> lh) << odd then
stput(sbdest,sbdest >> lh,0);
]
// D I R L K U P
//
and dirlkup(sb) = valof
[ let lwinsb = sbwsize(sb)-1;
let lcmask = #20040;
let firstlcmask = #40;
let ofdir = mpfnof ! fndir;
ofdir >> OF.pos = 0;
let macpos = ofdir >> OF.macpos;
let type = nil;
let j = nil;
let siz = nil;
let tword = nil;
let pname = nil;
let ldirentry = (offset DIR.name)/16+lwinsb+1;
let holeneeded = true;
vwremain = 0;
vdeltafp = macbp-1;
while ult(ofdir >> OF.pos,macpos) do
[ vpos = ofdir >> OF.pos;
if vwremain le 0 then
tword = gets(fndir);
type = vpw >> DIR.type;
siz = vpw >> DIR.siz;
test type ifso
test vwremain ge siz ifso
[ pname = lv(vpw >> DIR.name);
if rv sb ne ((rv pname) % firstlcmask) then
goto failinc;
for i = 1 to lwinsb do
if (sb ! i % lcmask) ne (pname ! i % lcmask) then
goto failinc;
vsn1 = vpw ! 1;
vsn2 = vpw ! 2;
vversion = vpw ! 3;
vda = RealDA(vpw ! 5);
vdeltafp = 0;
resultis true;
]
ifnot
[ ofdir >> OF.pos = vpos+2;
vsn1 = gets(fndir);
vsn2 = gets(fndir);
vversion = gets(fndir);
tword = gets(fndir);
vda = RealDA(gets(fndir));
tword = gets(fndir);
if rv sb ne (tword % firstlcmask) then
goto failninc;
for i = 1 to lwinsb do
[ tword = gets(fndir);
if (sb ! i % lcmask) ne (tword % lcmask) then
goto failninc;
]
vdeltafp = 0;
resultis true;
]
ifnot
[ if holeneeded & (siz ge ldirentry) then
[
vposhole = vpos;
holeneeded = false;
]
test vwremain ge siz ifso
goto failinc
ifnot
goto failninc;
]
failninc:
ofdir >> OF.pos = vpos+(siz lshift 1);
vwremain = 0;
loop;
failinc:
ofdir >> OF.pos = vpos+(siz lshift 1);
vwremain = vwremain-siz;
vpw = vpw+siz;
]
if holeneeded then
vposhole = ofdir >> OF.macpos;
vdeltafp = 0;
resultis false;
]
// F N A L L O C
// catalogue no. = 128
and fnalloc( ) = valof
[ for fn = minuserfn to maxfn-1 do
if mpfnof ! fn eq -1 then resultis fn;
resultis -1;
]
// C L O S E S
//
and closes(fn) be
[ errhlt("cls");
if (mpfnof ! fn) >> OF.wf then
[ flushfn(fn);
let macpos = (mpfnof ! fn) >> OF.macpos;
let lastnumchars = macpos << PCD.rc;
let rgda = lv ((mpfnof ! fn) >> OF.rgda);
let fileid = lv((mpfnof ! fn) >> OF.fileid);
if lastnumchars then
[ let fp = macpos << PCD.p;
let vpa = nil;
vpa << VPA.fn= fn;
vpa << VPA.fp = macpos << PCD.p;
let ca = getvp(vpa);
WritePages(0,rgda,fileid,fp+1,fp+1,0,0,lastnumchars,ca);
]
trims(fn);
(mpfnof ! fn) >> OF.wf = false;
]
]
// S E T M A C F P
//
and setmacfp(fn,newmac) be
[ let of = mpfnof ! fn;
let macfp = of >> OF.macfp;
unless ult(of >> OF.macpos,(newmac lshift 9)) then errhlt("mfp");
let ofnew = hpalloca(ofsiz+newmac);
of = mpfnof ! fn;
move(of,ofnew,ofsiz+umin(macfp,newmac));
let rgdanew = lv(ofnew >> OF.rgda);
if newmac gr macfp then
movec(rgdanew+macfp,rgdanew+newmac,fillInDA);
ofnew >> OF.macfp = newmac;
mpfnof ! fn = ofnew;
hpfree(of);
]
// U P D A T E O F S
//
and updateofs( ) be
[ ckdoc( );
for fn = minuserfn to maxfn-1 do
[ if fnscr eq fn then errhlt("scr");
if (rgcfn ! fn eq 0) & (mpfnof ! fn ne -1) & not (mpfnof ! fn) >> OF.wf do
[ hpfree(mpfnsb ! fn);
hpfree(mpfnof ! fn);
mpfnof ! fn = -1;
cof = cof-1;
if cof ls 2 then errhlt("cst");
mpfnsb ! fn = 0;
]
]
for bp = 0 to macbp-1 do
if mpfnof ! ((rgvpa+bp) >> VPA.fn) eq -1 then
rgvpa ! bp = -1;
remakevmtb( );
]
// E N D O F S
//
and endofs(fn) = valof
[ let of = mpfnof ! fn;
test ult(of >> OF.pos,of >> OF.macpos) ifso
resultis false
ifnot resultis true;
]
// D E A L L O C F N
//
and deallocfn(fn) be
[ test inheap(mpfnof ! fn) ifnot
errhlt("nih")
ifso hpfree(mpfnof ! fn);
test inheap(mpfnsb ! fn) ifnot
errhlt("nih")
ifso hpfree(mpfnsb ! fn);
mpfnsb ! fn = 0;
mpfnof ! fn = -1;
]
// **
and readfile(selfnam,doc,cp) = valof
[
overlay(fnfilebb);
let ans = qreadfile(selfnam,doc,cp)
resultis ans
]
and readfile1(sbfnam,doc,cp) = valof
[
overlay(fnfilebb);
let ans = qreadfile1(sbfnam,doc,cp)
resultis ans
]
and writefile(selfnam,docfnam,cpfirst,cplast,translate) = valof
[
overlay(fnfilebb);
let ans = qwritefile(selfnam,docfnam,cpfirst,cplast,translate)
resultis ans
]
and writefile1(sbfnam,docfnam,cpfirst,cplast,translate) = valof
[
overlay(fnfilebb);
let ans = qwritefile1(sbfnam,docfnam,cpfirst,cplast,translate)
resultis ans
]