#include "tag.h" void usage(void) { fprint(2, "usage: %s [file]\n", argv0); exits("usage"); } void main(int argc, char **argv) { int fd; Biobuf bin; uchar buf[1024], *p; Header hdr; Rechdr rhdr; ARGBEGIN { default: usage(); } ARGEND switch(argc) { case 0: fd = 0; break; case 1: if((fd = open(argv[0], OREAD)) < 0) sysfatal("open %s: %r", argv[0]); break; default: usage(); SET(fd); } Binit(&bin, fd, OREAD); readrec(&bin, buf, sizeof buf, HeaderSize, "header"); p = buf; gheader(&p, &hdr); if(strcmp(hdr.magic, "ID3") != 0) sysfatal("bad magic"); print("%d\n", HeaderSize + hdr.length); print("%s 2.%d.%d %.8b %d\n", hdr.magic, hdr.version, hdr.revision, hdr.flags, hdr.length); while(Boffset(&bin) < HeaderSize + hdr.length) { readrec(&bin, buf, sizeof buf, hdr.version == 2 ? 6 : RecHdrSize, "rhdr"); // FIXME p = buf; grechdr(&p, &rhdr, &hdr); if(strcmp(rhdr.id, "") == 0) { print("padding %ulld\n", (HeaderSize+hdr.length) - (Boffset(&bin) - (hdr.version == 2 ? 6 : RecHdrSize))); // FIXME break; } print("%s %d %.8b %.8b\n", rhdr.id, rhdr.length, rhdr.flags >> 8, rhdr.flags & 0xff); if(Bseek(&bin, rhdr.length, 1) < 0) sysfatal("seek: %r"); } exits(nil); }