ref: 9fa76896ce8ec96f3f6e76a0b23732be660b71bb
dir: /test.c/
#include <u.h>
#include <libc.h>
#include <bio.h>
typedef struct Ctx Ctx;
struct Ctx {
u8int buf[8192];
Biobuf *f;
};
int
ctxpushrange(Ctx *ctx, int offset, int len)
{
int r;
USED(len);
if((r = Bseek(ctx->f, offset, 0)) != offset){
werrstr("seek offset: need %d, got %d", offset, r);
return -1;
}
return 0;
}
void
ctxpoprange(Ctx *ctx)
{
Bseek(ctx->f, 0, 0);
}
u8int *
ctxreadn(Ctx *ctx, int n)
{
int r;
if((r = Bread(ctx->f, ctx->buf, n)) != n){
werrstr("short read: need %d, got %d", n, r);
return nil;
}
return ctx->buf;
}
int
ctxarray(Ctx *ctx, void **arr_, void *fun_, int elsz, int num)
{
int i;
int (*fun)(Ctx*, void*);
u8int *arr;
if((arr = calloc(num, elsz)) == nil)
return -1;
fun = fun_;
for(i = 0; i < num; i++){
if(fun(ctx, arr + i*elsz) < 0){
free(arr);
return -1;
}
}
*arr_ = arr;
return 0;
}
#include "out.h"
void
main(int argc, char **argv)
{
TableDirectory td;
Ctx ctx;
int i;
otfinit();
for(i = 1; i < argc; i++){
print("%s\n", argv[i]);
if((ctx.f = Bopen(argv[i], OREAD)) == nil){
fprint(2, "%r\n");
}else if(read_TableDirectory(&ctx, &td) != 0){
fprint(2, "%s: %r\n", argv[i]);
} else {
fprint_TableDirectory(1, 0, &td);
}
if(ctx.f != nil)
Bterm(ctx.f);
}
exits(nil);
}