1
0
Files
irix-657m-src/eoe/cmd/rfind/lib/macros.c
2022-09-29 17:59:04 +03:00

81 lines
1.7 KiB
C

#include "fsdump.h"
static heap_set *prevmh;
static ino64_t prevbaseino = 0;
static inm2_t* previnm2;
hpindex_t *pnm1 (heap_set *mh, ino64_t inobase)
{
return (mh->hp_inum + HASHFUNC(inobase));
}
inm2_t *PNM2 (heap_set *mh, ino64_t inobase)
{
inm2_t *pnm2;
if (prevmh == mh && prevbaseino == inobase)
return previnm2;
pnm2 = mh->hp_inm2 + *PNM1 (*mh, inobase);
while (pnm2->startino != inobase && pnm2->nextptr != 0) {
pnm2 = mh->hp_inm2 + pnm2->nextptr;
}
if (pnm2->startino == inobase) {
prevmh = mh;
prevbaseino = inobase;
previnm2 = pnm2;
} else {
pnm2 = mh->hp_inm2;
}
return pnm2;
}
inod_t *PINO (heap_set *mh, ino64_t ino)
{
int offsetino = (int)(ino & 63);
if ((prevmh == mh) && ((ino & ~63) == prevbaseino))
return mh->hp_inod + previnm2->inoptr[offsetino];
return (mh->hp_inod + PNM2(mh, ino & ~63)->inoptr[offsetino]);
}
void PADD(heap_set *mh, hpindex_t inod, ino64_t ino)
{
hpindex_t offsetino = (hpindex_t)(ino & 63);
ino64_t baseino = ino & ~63;
hpindex_t *inm1;
inm2_t *inm2;
if (mh == prevmh && prevbaseino == baseino) {
previnm2->inoptr[offsetino] = inod;
}
inm1 = PNM1 (*mh, baseino);
if (*inm1 == 0) {
*inm1 = heapalloc ((void **)(&mh->hp_inm2), 1);
inm2 = mh->hp_inm2 + *inm1;
inm2->startino = baseino;
} else {
inm2 = mh->hp_inm2 + *inm1;
while(inm2->startino != baseino) {
if (inm2->nextptr == 0) {
hpindex_t inm2x = heapalloc ((void **)(&mh->hp_inm2), 1);
inm2->nextptr = inm2x;
inm2 = mh->hp_inm2 + inm2x;
inm2->startino = baseino;
} else {
inm2 = mh->hp_inm2 + inm2->nextptr;
}
}
}
inm2->inoptr[offsetino] = inod;
prevbaseino = baseino;
previnm2 = inm2;
prevmh = mh;
}