S3M import: fix crash on Android

This commit is contained in:
tildearrow 2024-06-28 16:13:27 -05:00
parent d814aaebee
commit 8a8784dd5a
6 changed files with 75 additions and 20 deletions

View file

@ -230,7 +230,7 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) {
throw EndOfFileException(&reader,reader.tell());
}
ds.name=reader.readString(26);
ds.name=reader.readStringLatin1(26);
unsigned char hilight1=reader.readC();
unsigned char hilight2=reader.readC();
@ -381,7 +381,7 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) {
return false;
}
String dosName=reader.readString(12);
String dosName=reader.readStringLatin1(12);
reader.readC(); // 0
@ -441,7 +441,7 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) {
reader.readI();
}
ins->name=reader.readString(26);
ins->name=reader.readStringLatin1(26);
if (compatTracker<0x200) { // old format
// x
@ -554,7 +554,7 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) {
return false;
}
String dosName=reader.readString(12);
String dosName=reader.readStringLatin1(12);
reader.readC(); // 0
@ -562,7 +562,7 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) {
unsigned char flags=reader.readC();
defVol[i]=reader.readC();
s->name=reader.readString(26);
s->name=reader.readStringLatin1(26);
unsigned char convert=reader.readC();
unsigned char defPan=reader.readC();

View file

@ -96,7 +96,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) {
logD("couldn't seek to 0");
throw EndOfFileException(&reader,reader.tell());
}
ds.name=reader.readString(20);
ds.name=reader.readStringLatin1(20);
logI("%s",ds.name);
// samples
@ -105,7 +105,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) {
for (int i=0; i<insCount; i++) {
DivSample* sample=new DivSample;
sample->depth=DIV_SAMPLE_DEPTH_8BIT;
sample->name=reader.readString(22);
sample->name=reader.readStringLatin1(22);
logD("%d: %s",i+1,sample->name);
int slen=((unsigned short)reader.readS_BE())*2;
sampLens[i]=slen;

View file

@ -117,7 +117,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) {
return false;
}
ds.name=reader.readString(28);
ds.name=reader.readStringLatin1(28);
reader.readC(); // 0x1a
if (reader.readC()!=16) {
@ -366,7 +366,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) {
return false;
}
String name=reader.readString(28);
String name=reader.readStringLatin1(28);
ins->name=name;
ds.ins.push_back(ins);
@ -401,7 +401,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) {
}
}
String dosName=reader.readString(12);
String dosName=reader.readStringLatin1(12);
if (ins->type==DIV_INS_ES5506) {
unsigned int memSeg=0;
@ -434,7 +434,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) {
reader.readI();
reader.readI();
String name=reader.readString(28);
String name=reader.readStringLatin1(28);
s->name=dosName;
ins->name=name;
@ -581,7 +581,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) {
// x
reader.seek(12,SEEK_CUR);
String name=reader.readString(28);
String name=reader.readStringLatin1(28);
ins->name=name;
// "SCRI"

View file

@ -55,12 +55,12 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) {
throw EndOfFileException(&reader,reader.tell());
}
ds.name=reader.readString(20);
ds.name=reader.readStringLatin1(20);
// 0x1a
reader.readC();
String trackerName=reader.readString(20);
String trackerName=reader.readStringLatin1(20);
unsigned short trackerVer=reader.readS();
if (trackerName!="") logV("made with %s",trackerName);
@ -230,7 +230,7 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) {
headerSeek=reader.tell();
headerSeek+=reader.readI();
ins->name=reader.readString(22);
ins->name=reader.readStringLatin1(22);
ins->type=DIV_INS_AMIGA;
ins->amiga.useNoteMap=true;
@ -341,7 +341,7 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) {
reader.readC(); // reserved
s->name=reader.readString(22);
s->name=reader.readStringLatin1(22);
// load sample data
s->depth=(flags&4)?DIV_SAMPLE_DEPTH_16BIT:DIV_SAMPLE_DEPTH_8BIT;

View file

@ -229,7 +229,7 @@ double SafeReader::readD() {
}
#endif
String SafeReader::readString(size_t stlen) {
String SafeReader::readStringWithEncoding(DivStringEncoding encoding, size_t stlen) {
String ret;
#ifdef READ_DEBUG
logD("SR: reading string len %d at %x",stlen,curSeek);
@ -243,23 +243,67 @@ String SafeReader::readString(size_t stlen) {
if (c==0) {
zero=true;
}
if (!zero) ret.push_back(c);
if (!zero) {
if (encoding==DIV_ENCODING_LATIN1) {
if (c>=0x20) {
if (c&0x80) {
if (c>=0xa0) {
ret.push_back(0xc0|(c>>6));
ret.push_back(0x80|(c&63));
}
} else {
ret.push_back(c);
}
}
} else {
ret.push_back(c);
}
}
curPos++;
}
return ret;
}
String SafeReader::readString() {
String SafeReader::readStringWithEncoding(DivStringEncoding encoding) {
String ret;
unsigned char c;
if (isEOF()) throw EndOfFileException(this, len);
while (!isEOF() && (c=readC())!=0) {
if (encoding==DIV_ENCODING_LATIN1) {
if (c>=0x20) {
if (c&0x80) {
if (c>=0xa0) {
ret.push_back(0xc0|(c>>6));
ret.push_back(0x80|(c&63));
}
} else {
ret.push_back(c);
}
}
} else {
ret.push_back(c);
}
}
return ret;
}
String SafeReader::readString() {
return readStringWithEncoding(DIV_ENCODING_NONE);
}
String SafeReader::readString(size_t stlen) {
return readStringWithEncoding(DIV_ENCODING_NONE,stlen);
}
String SafeReader::readStringLatin1() {
return readStringWithEncoding(DIV_ENCODING_LATIN1);
}
String SafeReader::readStringLatin1(size_t stlen) {
return readStringWithEncoding(DIV_ENCODING_LATIN1,stlen);
}
String SafeReader::readStringLine() {
String ret;
unsigned char c;

View file

@ -29,6 +29,13 @@ enum Endianness {
BigEndian
};
enum DivStringEncoding {
DIV_ENCODING_NONE=0,
DIV_ENCODING_UTF8,
DIV_ENCODING_LATIN1,
DIV_ENCODING_SHIFT_JIS
};
class SafeReader;
struct EndOfFileException {
@ -64,8 +71,12 @@ class SafeReader {
float readF_BE();
double readD();
double readD_BE();
String readStringWithEncoding(DivStringEncoding encoding);
String readStringWithEncoding(DivStringEncoding encoding, size_t len);
String readString();
String readString(size_t len);
String readStringLatin1();
String readStringLatin1(size_t len);
String readStringLine();
String readStringToken(unsigned char delim, bool stripContiguous);
String readStringToken();