1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/* backpage.c
*/
/* This software is copyrighted as detailed in the LICENSE file. */
#include "EXTERN.h"
#include "common.h"
#include "intrp.h"
#include "util2.h"
#include "final.h"
#include "INTERN.h"
#include "backpage.h"
ART_LINE maxindx = -1;
void
backpage_init()
{
char* varyname;
varyname = filexp(VARYNAME);
close(creat(varyname,0600));
varyfd = open(varyname,2);
UNLINK(varyname);
if (varyfd < 0) {
printf(cantopen,varyname) FLUSH;
sig_catcher(0);
}
}
/* virtual array read */
ART_POS
vrdary(indx)
ART_LINE indx;
{
int subindx;
long offset;
#ifdef DEBUG
if (indx > maxindx) {
printf("vrdary(%ld) > %ld\n",(long)indx, (long)maxindx) FLUSH;
return 0;
}
#endif
if (indx < 0)
return 0;
subindx = indx % VARYSIZE;
offset = (indx - subindx) * sizeof(varybuf[0]);
if (offset != oldoffset) {
if (oldoffset >= 0) {
#ifndef lint
(void)lseek(varyfd,oldoffset,0);
write(varyfd, (char*)varybuf,sizeof(varybuf));
#endif /* lint */
}
#ifndef lint
(void)lseek(varyfd,offset,0);
read(varyfd,(char*)varybuf,sizeof(varybuf));
#endif /* lint */
oldoffset = offset;
}
return varybuf[subindx];
}
/* write to virtual array */
void
vwtary(indx,newvalue)
ART_LINE indx;
ART_POS newvalue;
{
int subindx;
long offset;
#ifdef DEBUG
if (indx < 0)
printf("vwtary(%ld)\n",(long)indx) FLUSH;
if (!indx)
maxindx = 0;
if (indx > maxindx) {
if (indx != maxindx + 1)
printf("indx skipped %d-%d\n",maxindx+1,indx-1) FLUSH;
maxindx = indx;
}
#endif
subindx = indx % VARYSIZE;
offset = (indx - subindx) * sizeof(varybuf[0]);
if (offset != oldoffset) {
if (oldoffset >= 0) {
#ifndef lint
(void)lseek(varyfd,oldoffset,0);
write(varyfd,(char*)varybuf,sizeof(varybuf));
#endif /* lint */
}
#ifndef lint
(void)lseek(varyfd,offset,0);
read(varyfd,(char*)varybuf,sizeof(varybuf));
#endif /* lint */
oldoffset = offset;
}
varybuf[subindx] = newvalue;
}
|