ref: c183f656495c07f3c600a09185073a00076c2e62
dir: /fs.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <bio.h> #include "dat.h" #include "fns.h" enum{ Vertsz = 4, Sectsz = 26, Sidesz = 30, Linesz = 14, Thingsz = 10 }; Vertex *verts; int nverts; Sector *sects; int nsects; Side *sides; int nsides; Line *lines; int nlines; Thing *things; int nthings; #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 static vlong filelen(int fd) { vlong l; Dir *d; d = dirfstat(fd); if(d == nil) sysfatal("filelen: %r"); l = d->length; free(d); return l; } static void loadthings(char *f) { int n; vlong l; char *s; uchar u[Thingsz]; Biobuf *bf; Thing *p; static u32int sel = CFthing; s = smprint("%s/things", f); bf = Bopen(s, OREAD); if(bf == nil) sysfatal("loadthings: %r"); free(s); l = filelen(Bfildes(bf)); if(l % sizeof u != 0) sysfatal("invalid THINGS lump"); n = l / sizeof u; things = emalloc(n * sizeof *things); Blethal(bf, nil); for(p=things; Bread(bf, u, sizeof u) == sizeof u; p++, sel++){ if(nthings++ == n) sysfatal("loadthings: overflow\n"); p->i = nthings; p->x = (s16int)(u[0] | u[1]<<8); p->y = -(s16int)(u[2] | u[3]<<8); p->an = (s16int)(u[4] | u[5]<<8); p->type = (s16int)(u[6] | u[7]<<8); p->f = (s16int)(u[7] | u[8]<<8); PBIT32(p->sel, sel); } Bterm(bf); } static void loadlines(char *f) { int n; vlong l; char *s; uchar u[Linesz]; Biobuf *bf; Line *p; static u32int sel = CFline; s = smprint("%s/linedefs", f); bf = Bopen(s, OREAD); if(bf == nil) sysfatal("loadlines: %r"); free(s); l = filelen(Bfildes(bf)); if(l % sizeof u != 0) sysfatal("invalid LINEDEFS lump"); n = l / sizeof u; lines = emalloc(n * sizeof *lines); Blethal(bf, nil); for(p=lines; Bread(bf, u, sizeof u) == sizeof u; p++, sel++){ if(nlines++ == n) sysfatal("loadsides: overflow\n"); p->i = nlines; /* FIXME: are these supposed to be sign extended? */ p->vid = (s16int)(u[0] | u[1]<<8); p->v = verts + p->vid; p->wid = (s16int)(u[2] | u[3]<<8); p->w = verts + p->wid; p->f = (s16int)(u[4] | u[5]<<8); p->type = (s16int)(u[6] | u[7]<<8); p->tag = (s16int)(u[8] | u[9]<<8); /* FIXME: if == (s16int)-1, dont set pointer */ p->rid = (s16int)(u[10] | u[11]<<8); p->r = sides + p->rid; p->lid = (s16int)(u[12] | u[13]<<8); p->l = sides + p->lid; PBIT32(p->sel, sel); } Bterm(bf); } static void loadsides(char *f) { int n; vlong l; char *s; uchar u[Sidesz]; Biobuf *bf; Side *p; s = smprint("%s/sidedefs", f); bf = Bopen(s, OREAD); if(bf == nil) sysfatal("loadsides: %r"); free(s); l = filelen(Bfildes(bf)); if(l % sizeof u != 0) sysfatal("invalid SIDEDEFS lump"); n = l / sizeof u; sides = emalloc(n * sizeof *sides); Blethal(bf, nil); for(p=sides; Bread(bf, u, sizeof u) == sizeof u; p++){ if(nsides++ == n) sysfatal("loadsides: overflow\n"); p->i = nsides; p->x = (s16int)(u[0] | u[1]<<8); p->y = -(s16int)(u[2] | u[3]<<8); memcpy(p->high, u+4, 8); memcpy(p->low, u+12, 8); memcpy(p->mid, u+20, 8); p->sid = (s16int)(u[28] | u[29]<<8); p->s = sects + p->sid; } Bterm(bf); } static void loadsects(char *f) { int n; vlong l; char *s; uchar u[Sectsz]; Biobuf *bf; Sector *p; s = smprint("%s/sectors", f); bf = Bopen(s, OREAD); if(bf == nil) sysfatal("loadsects: %r"); free(s); l = filelen(Bfildes(bf)); if(l % sizeof u != 0) sysfatal("invalid SECTORS lump"); n = l / sizeof u; sects = emalloc(n * sizeof *sects); Blethal(bf, nil); for(p=sects; Bread(bf, u, sizeof u) == sizeof u; p++){ if(nsects++ == n) sysfatal("loadsects: overflow\n"); p->i = nsects; p->y = (s16int)(u[0] | u[1]<<8); p->x = -(s16int)(u[2] | u[3]<<8); memcpy(p->fflat, u+4, 8); memcpy(p->cflat, u+12, 8); p->lum = (s16int)(u[20] | u[21]<<8); p->type = (s16int)(u[22] | u[23]<<8); p->tag = (s16int)(u[24] | u[25]<<8); } Bterm(bf); } static void loadverts(char *f) { int n; vlong l; char *s; uchar u[Vertsz]; Biobuf *bf; Vertex *p; static u32int sel = CFvert; s = smprint("%s/vertexes", f); bf = Bopen(s, OREAD); if(bf == nil) sysfatal("loadverts: %r"); free(s); l = filelen(Bfildes(bf)); if(l % sizeof u != 0) sysfatal("invalid VERTEXES lump"); n = l / sizeof u; verts = emalloc(n * sizeof *verts); Blethal(bf, nil); for(p=verts; Bread(bf, u, sizeof u) == sizeof u; p++, sel++){ if(nverts++ == n) sysfatal("loadverts: overflow\n"); p->i = nverts; p->x = (s16int)(u[0] | u[1]<<8); p->y = -(s16int)(u[2] | u[3]<<8); PBIT32(p->sel, sel); } Bterm(bf); } void load(char *f) { if(f == nil) f = "."; loadverts(f); loadsects(f); loadsides(f); loadlines(f); loadthings(f); }