mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
85 lines
1.4 KiB
C
85 lines
1.4 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <venti.h>
|
|
#include "cvt.h"
|
|
|
|
static int
|
|
checksize(int n)
|
|
{
|
|
if(n < 256 || n > VtMaxLumpSize) {
|
|
werrstr("bad block size");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
vtentrypack(VtEntry *e, uchar *p, int index)
|
|
{
|
|
ulong t32;
|
|
int flags;
|
|
uchar *op;
|
|
int depth;
|
|
|
|
p += index * VtEntrySize;
|
|
op = p;
|
|
|
|
U32PUT(p, e->gen);
|
|
p += 4;
|
|
U16PUT(p, e->psize);
|
|
p += 2;
|
|
U16PUT(p, e->dsize);
|
|
p += 2;
|
|
depth = e->type&VtTypeDepthMask;
|
|
flags = (e->flags&~(_VtEntryDir|_VtEntryDepthMask));
|
|
flags |= depth << _VtEntryDepthShift;
|
|
if(e->type - depth == VtDirType)
|
|
flags |= _VtEntryDir;
|
|
U8PUT(p, flags);
|
|
p++;
|
|
memset(p, 0, 5);
|
|
p += 5;
|
|
U48PUT(p, e->size, t32);
|
|
p += 6;
|
|
memmove(p, e->score, VtScoreSize);
|
|
p += VtScoreSize;
|
|
|
|
assert(p-op == VtEntrySize);
|
|
}
|
|
|
|
int
|
|
vtentryunpack(VtEntry *e, uchar *p, int index)
|
|
{
|
|
uchar *op;
|
|
|
|
p += index * VtEntrySize;
|
|
op = p;
|
|
|
|
e->gen = U32GET(p);
|
|
p += 4;
|
|
e->psize = U16GET(p);
|
|
p += 2;
|
|
e->dsize = U16GET(p);
|
|
p += 2;
|
|
e->flags = U8GET(p);
|
|
e->type = (e->flags&_VtEntryDir) ? VtDirType : VtDataType;
|
|
e->type += (e->flags & _VtEntryDepthMask) >> _VtEntryDepthShift;
|
|
e->flags &= ~(_VtEntryDir|_VtEntryDepthMask);
|
|
p++;
|
|
p += 5;
|
|
e->size = U48GET(p);
|
|
p += 6;
|
|
memmove(e->score, p, VtScoreSize);
|
|
p += VtScoreSize;
|
|
|
|
assert(p-op == VtEntrySize);
|
|
|
|
if(!(e->flags & VtEntryActive))
|
|
return 0;
|
|
|
|
if(checksize(e->psize) < 0 || checksize(e->dsize) < 0)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|