ref: 49510dd517a058166d1c60a4e9731061ff89d6b2
dir: /test.c/
#include <u.h> #include <libc.h> #include <bio.h> typedef struct Ctx Ctx; struct Ctx { u8int buf[8192]; Biobuf *f; }; 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); }