X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffileio.cpp;h=d8ff4653da539e4456628739dd74596d857c43e0;hb=6618dd130b72fa3c19b7583855f227160c3384c1;hp=3261c2c95d58c38902d49529fae1ee7e3e2e53e1;hpb=d4af988d8210a0d2c505d663fd7fa8f175a89d3b;p=wozmaker diff --git a/src/fileio.cpp b/src/fileio.cpp index 3261c2c..d8ff465 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -171,11 +171,13 @@ Really, this crap should go into fileio.cpp. !!! FIX !!! if (Global::a2rSize > (60 + Uint32LE(Global::a2r->strmSize))) { - Global::metadata = (A2RMetadata *)((uint8_t *)Global::a2r + (60 + Uint32LE(Global::a2r->strmSize))); + Global::metadata = (Metadata *)((uint8_t *)Global::a2r + (60 + Uint32LE(Global::a2r->strmSize))); // Make sure it's plausible metadata if (memcmp(Global::metadata->metaTag, "META", 4) != 0) Global::metadata = NULL; + else + UnpackMetadata(Global::metadata); } // Unpack TMNG & XTMG streams to simplify analysis @@ -289,3 +291,130 @@ bool WriteWOZFile(const char * filename) return true; } + +void UnpackMetadata(Metadata * data) +{ + uint32_t start = 0; + uint32_t end = Uint32LE(data->metaSize); + uint32_t i = 0; + Global::metaCount = 0; + + while (start < end) + { + if (i < 255) + Global::meta[Global::metaCount][i++] = data->data[start]; + + start++; + + if (data->data[start] == '\x0A') + { + Global::meta[Global::metaCount][i] = 0; + Global::metaCount++; + i = 0; + start++; + } + } +} + + +uint8_t * GetMetadata(const char * keyword) +{ + uint32_t kwLen = strlen(keyword); + + for(uint8_t i=0; i= kwLen) + && (memcmp(Global::meta[i], keyword, kwLen) == 0)) + { + return &Global::meta[i][kwLen]; + } + } + + return NULL; +} + + +uint16_t GetRequiredMachineBits(void) +{ + uint8_t * kw = GetMetadata("requires_machine\x09"); + uint32_t kwLen = strlen((char *)kw); + uint16_t bits = 0; + char type[8]; + uint8_t typeLen = 0; + + for(uint32_t i=0; i