IFFRESULT IFFParser::IFFDescendChunk(IFFCHUNK* lpck) { lpck->flags = 0; // Read ULONG len = IFFReadChunkBytes(lpck, IFFCHUNKSIZE); if (len == 0) return IFF_EOF; else if (len != IFFCHUNKSIZE) return IFFERR_READWRITE; lpck->ckID = BigEndian32(lpck->ckID); lpck->ckSize = BigEndian32(lpck->ckSize); lpck->dataOffset = SetFilePos(0, IO::STREAM_SEEK_CUR); lpck->grpID = 0; if (lpck->ckID == ID_FORM) { if (IFFReadChunkBytes(&lpck->grpID, sizeof(ID)) != sizeof(ID)) return IFFERR_READWRITE; lpck->grpID = BigEndian32(lpck->grpID); return IFF_EOC; } return IFF_OK; }
uint8_t StringExtractorGDBRemote::GetError () { if (GetResponseType() == eError) { SetFilePos(1); return GetHexU8(255); } return 0; }
IFFRESULT IFFParser::IFFAscendChunk(IFFCHUNK* lpck) { ULONGLONG pos; pos = SetFilePos(0, IO::STREAM_SEEK_CUR); // Current position if (lpck->flags == 0) { int32 offset = lpck->ckSize-(pos-lpck->dataOffset); if (lpck->ckSize & 1) offset++; // Word-aligned chunks /*if (*/SetFilePos(offset, IO::STREAM_SEEK_CUR);// == 0xffffffff) /* return IFFERR_READWRITE; else return IFF_OK; */ } else { uint32 cksize = pos - lpck->dataOffset; if (lpck->ckSize == 0) // Unknown size data at time of chunk creation { lpck->ckSize = cksize; cksize = BigEndian32(cksize); SetFilePos(lpck->dataOffset-4, IO::STREAM_SEEK_SET); IFFWriteChunkBytes(&cksize, 4); // Write the chunk length SetFilePos(pos, IO::STREAM_SEEK_SET); } if (cksize & 1) { uint8 padbyte = 0; IFFWriteChunkBytes(&padbyte, 1); } } return IFF_OK; }
LONG IFFParser::IFFCreateChunk(IFFCHUNK* lpck) { lpck->flags = 1; // Created IFFCHUNK ck; ck.ckID = BigEndian32(lpck->ckID); ck.ckSize = BigEndian32(lpck->ckSize); m_stream->Write(&ck, IFFCHUNKSIZE); lpck->dataOffset = SetFilePos(0, IO::STREAM_SEEK_CUR); if (lpck->ckID == ID_FORM) { ULONG grpID = BigEndian32(lpck->grpID); m_stream->Write(&grpID, 4); } return IFF_OK; }