From 92f17580846c88108aab023092c23e6bcdcf2f75 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Fri, 14 Aug 2015 23:45:02 +0800 Subject: SMELT is finally finished! Add the SMELT library for future use. Add .gitignore. --- extensions/smdatapack.cpp | 176 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 extensions/smdatapack.cpp (limited to 'extensions/smdatapack.cpp') diff --git a/extensions/smdatapack.cpp b/extensions/smdatapack.cpp new file mode 100644 index 0000000..b707d39 --- /dev/null +++ b/extensions/smdatapack.cpp @@ -0,0 +1,176 @@ +// -*- C++ -*- +/* + * Simple MultimEdia LiTerator(SMELT) + * by Chris Xiong 2015 + * api level 1 + * DaTaPack format support implementation + * + * WARNING: This library is in development and interfaces would be very + * unstable. + * This library is developed for the BLR series games. + */ +#include "smdatapack.hpp" +#include +#include +#define gzgetDWORD(f) ((gzgetc(f)<<24)|(gzgetc(f)<<16)|(gzgetc(f)<<8)|(gzgetc(f)))&0xFFFFFFFF +#define gch ((*(cp++))&0xFF) +#define mmgetDWORD ((gch<<24)|(gch<<16)|(gch<<8)|(gch))&0xFFFFFFFF +#define gzputDWORD(f,a) gzputc(f,a>>24);gzputc(f,(a>>16)&0xFF);gzputc(f,(a>>8)&0xFF);gzputc(f,a&0xFF); +bool smDtpFileR::openDtp(const char* path) +{ + file=gzopen(path,"r"); + if(!file)return false;enmemory=false;msize=0; + if(gzgetc(file)!='D')return false; + if(gzgetc(file)!='T')return false; + if(gzgetc(file)!='P')return false; + fcnt=gzgetc(file); + for(int i=0;i::iterator i=m.begin();i!=m.end();++i) + { + delete[] i->second.path;i->second.path=NULL; + if(i->second.data){delete[] i->second.data;i->second.data=NULL;} + i->second.size=i->second.offset=i->second.crc=0; + } + fcnt=0; + m.clear();if(!enmemory){gzclose(file);file=0;} +} +char* smDtpFileR::getFirstFile(){return m.begin()->second.path;} +char* smDtpFileR::getLastFile(){return (--m.end())->second.path;} +char* smDtpFileR::getNextFile(const char* path) +{ + std::map::iterator i=m.find(std::string(path)); + if(i==m.end()||(++i)==m.end())return NULL; + return i->second.path; +} +char* smDtpFileR::getPrevFile(const char* path) +{ + std::map::iterator i=m.find(std::string(path)); + if(i==m.end()||i==m.begin())return NULL;--i; + return i->second.path; +} +char* smDtpFileR::getFilePtr(const char* path) +{ + std::string fns(path); + if(m.at(fns).data)return m.at(fns).data; + else + { + if(!m.at(fns).size){printf("error: empty file.\n");return NULL;} + if(!enmemory) + gzseek(file,m[fns].offset,SEEK_SET); + else + cp=bp+m[fns].offset; + m[fns].data=new char[m[fns].size]; + if(!enmemory) + { + int r=gzread(file,m[fns].data,m[fns].size); + if(rmsize){delete[] m[fns].data;printf("error: file size mismatch.\n");return m[fns].data=NULL;} + memcpy(m[fns].data,cp,m[fns].size); + } + DWORD crc=crc32(0,(Bytef*)m[fns].data,m[fns].size); + if(crc!=m[fns].crc) + {delete[] m[fns].data;printf("error: crc mismatch.\n");return m[fns].data=NULL;} + return m[fns].data; + } +} +void smDtpFileR::releaseFilePtr(const char* path) +{ + std::string fns(path); + if(m[fns].data) + { + delete[] m[fns].data; + m[fns].data=NULL; + } +} +DWORD smDtpFileR::getFileSize(const char* path) +{return m[std::string(path)].size;} + +smDtpFileW::smDtpFileW(){fcnt=0;} +bool smDtpFileW::addFile(const char* path,const char* realpath) +{ + FILE *pFile;DWORD size,rsize; + pFile=fopen(realpath,"rb"); + if(!pFile)return false; + fseek(pFile,0,SEEK_END);size=ftell(pFile);rewind(pFile); + if(!size)return false;files[fcnt].data=NULL; + files[fcnt].data=new char[size]; + if(!files[fcnt].data)return false; + files[fcnt].path=new char[strlen(path)+1]; + strcpy(files[fcnt].path,path); + rsize=fread(files[fcnt].data,1,size,pFile); + if(rsize!=size) + { + delete[] files[fcnt].data;files[fcnt].data=NULL; + delete[] files[fcnt].path;files[fcnt].path=NULL; + return false; + } + files[fcnt].size=size; + files[fcnt].crc=crc32(0,(Bytef*)files[fcnt].data,files[fcnt].size); + ++fcnt; + fclose(pFile); + return true; +} +bool smDtpFileW::writeDtp(const char* path) +{ + gzFile file=gzopen(path,"w"); + gzputs(file,"DTP");gzputc(file,fcnt); + int metasize=4; + for(int i=0;i