REWise/src/wiseoverlay.c

96 lines
2.6 KiB
C

/* This file is part of REWise.
*
* REWise is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* REWise is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include "wiseoverlay.h"
#include "reader.h"
#include "print.h"
REWError readWiseOverlayHeader(FILE * fp, WiseOverlayHeader * dest) {
REWError status;
int ch;
// Init structure
//dest->dllName = NULL; // We skip this
dest->initTextLen = 0;
dest->initTexts = NULL;
// Read dllNameLen
ch = fgetc(fp);
if (ch == EOF) {
printError("Failed to read dllNameLen (EOF).\n");
return REWERR_EOF;
}
dest->dllNameLen = (unsigned char)ch;
printDebug("dllNameLen: %d\n", dest->dllNameLen);
// Skip dllName (string) and dllSize (int)
if (dest->dllNameLen > 0) {
if (fseek(fp, (long)(dest->dllNameLen + 4), SEEK_CUR) != 0) {
printError("Failed to skip dllName.\n");
return REWERR_ERRNO;
}
}
// Read crcFlags (int32)
if ((status = readInt32(fp, &dest->crcFlags)) != REWERR_OK) {
printError("Failed to read crcFlags. %d\n", status);
return status;
}
// Read 86 unknown bytes
if ((status = readBytesInto(fp, dest->unknown_86, 86)) != REWERR_OK) {
printError("Failed to read 86 unknown bytes\n");
return status;
}
// Read initTextLen
ch = fgetc(fp);
if (ch == EOF) {
printError("Failed to read initTextLen (EOF).\n");
return REWERR_EOF;
}
dest->initTextLen = (unsigned char)ch;
// Init texts
printDebug("Read init texts, len: %d\n", dest->initTextLen);
unsigned char * initTexts = malloc(sizeof(unsigned char) * dest->initTextLen);
if (initTexts == NULL) {
printError("Failed allocate memory for initTexts. Out of memory!\n");
return REWERR_ERRNO;
}
if ((status = readBytesInto(fp, initTexts, dest->initTextLen)) != REWERR_OK) {
printError("Failed to read initTexts. %d\n", status);
free(initTexts);
return status;
}
dest->initTexts = initTexts;
return REWERR_OK;
}
void freeWiseOverlayHeader(WiseOverlayHeader * data) {
if (data->initTexts != NULL) {
free(data->initTexts);
data->initTexts = NULL;
}
}