// // umx.mm // Dumb Unreal Archive parser // // Created by Christopher Snowhill on 10/4/13. // Copyright 2013 __NoWork, Inc__. All rights reserved. // #include "umr.h" #include "umx.h" class umr_mem_reader : public umr::file_reader { const void * ptr; long offset, size; public: umr_mem_reader(const void * buf, unsigned p_size) : ptr(buf), size(p_size), offset(0) {} long read( void * buf, long howmany ) { long max = size - offset; if ( max > howmany ) max = howmany; if ( max ) { memcpy( buf, (const uint8_t *)ptr + offset, max ); offset += max; } return max; } void seek( long where ) { if ( where > size ) offset = size; else offset = where; } }; void * unpackUmx( const void * in, long * size ) { umr_mem_reader memreader(in, (unsigned int) *size); umr::upkg pkg; if (pkg.open(&memreader)) { for (int i = 1, j = pkg.ocount(); i <= j; i++) { char * classname = pkg.oclassname(i); if (classname && !strcmp(pkg.oclassname(i), "Music")) { char * type = pkg.otype(i); if (!type || !strcasecmp(type, "it") || !strcasecmp(type, "s3m") || !strcasecmp(type, "xm")) { *size = pkg.object_size(i); void * ret = malloc( *size ); memcpy( ret, (const uint8_t *)in + pkg.object_offset(i), *size ); return ret; } } } } return NULL; }