mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Use std::vector for rgbfix ROMX data
Statically links libstdc++ for 32-bit MinGW
This commit is contained in:
4
Makefile
4
Makefile
@@ -229,13 +229,13 @@ coverage:
|
|||||||
|
|
||||||
# Targets for the project maintainer to easily create Windows exes.
|
# Targets for the project maintainer to easily create Windows exes.
|
||||||
# This is not for Windows users!
|
# This is not for Windows users!
|
||||||
# If you're building on Windows with Cygwin or Mingw, just follow the Unix
|
# If you're building on Windows with Cygwin or MinGW, just follow the Unix
|
||||||
# install instructions instead.
|
# install instructions instead.
|
||||||
|
|
||||||
mingw32:
|
mingw32:
|
||||||
$Q${MAKE} all test/gfx/randtilegen test/gfx/rgbgfx_test \
|
$Q${MAKE} all test/gfx/randtilegen test/gfx/rgbgfx_test \
|
||||||
CXX=i686-w64-mingw32-g++ \
|
CXX=i686-w64-mingw32-g++ \
|
||||||
CXXFLAGS="-O3 -flto -DNDEBUG -static-libgcc" \
|
CXXFLAGS="-O3 -flto -DNDEBUG -static-libgcc -static-libstdc++" \
|
||||||
PKG_CONFIG="PKG_CONFIG_SYSROOT_DIR=/usr/i686-w64-mingw32 pkg-config"
|
PKG_CONFIG="PKG_CONFIG_SYSROOT_DIR=/usr/i686-w64-mingw32 pkg-config"
|
||||||
|
|
||||||
mingw64:
|
mingw64:
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "extern/getopt.hpp"
|
#include "extern/getopt.hpp"
|
||||||
|
|
||||||
@@ -806,7 +807,7 @@ static ssize_t readBytes(int fd, uint8_t *buf, size_t len)
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t writeBytes(int fd, void *buf, size_t len)
|
static ssize_t writeBytes(int fd, uint8_t *buf, size_t len)
|
||||||
{
|
{
|
||||||
// POSIX specifies that lengths greater than SSIZE_MAX yield implementation-defined results
|
// POSIX specifies that lengths greater than SSIZE_MAX yield implementation-defined results
|
||||||
assert(len <= SSIZE_MAX);
|
assert(len <= SSIZE_MAX);
|
||||||
@@ -975,11 +976,11 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
|
|
||||||
uint16_t globalSum = 0;
|
uint16_t globalSum = 0;
|
||||||
|
|
||||||
// To keep file sizes fairly reasonable, we'll cap the amount of banks at 65536
|
// To keep file sizes fairly reasonable, we'll cap the amount of banks at 65536.
|
||||||
// Official mappers only go up to 512 banks, but at least the TPP1 spec allows up to
|
// Official mappers only go up to 512 banks, but at least the TPP1 spec allows up to
|
||||||
// 65536 banks = 1 GiB.
|
// 65536 banks = 1 GiB.
|
||||||
// This should be reasonable for the time being, and may be extended later.
|
// This should be reasonable for the time being, and may be extended later.
|
||||||
uint8_t *romx = NULL; // Pointer to ROMX banks when they've been buffered
|
std::vector<uint8_t> romx; // Buffer of ROMX bank data
|
||||||
uint32_t nbBanks = 1; // Number of banks *targeted*, including ROM0
|
uint32_t nbBanks = 1; // Number of banks *targeted*, including ROM0
|
||||||
size_t totalRomxLen = 0; // *Actual* size of ROMX data
|
size_t totalRomxLen = 0; // *Actual* size of ROMX data
|
||||||
uint8_t bank[BANK_SIZE]; // Temp buffer used to store a whole bank's worth of data
|
uint8_t bank[BANK_SIZE]; // Temp buffer used to store a whole bank's worth of data
|
||||||
@@ -999,14 +1000,8 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
} else if (rom0Len == BANK_SIZE) {
|
} else if (rom0Len == BANK_SIZE) {
|
||||||
// Copy ROMX when reading a pipe, and we're not at EOF yet
|
// Copy ROMX when reading a pipe, and we're not at EOF yet
|
||||||
for (;;) {
|
for (;;) {
|
||||||
romx = (uint8_t *)realloc(romx, nbBanks * BANK_SIZE);
|
romx.resize(nbBanks * BANK_SIZE);
|
||||||
if (!romx) {
|
ssize_t bankLen = readBytes(input, &romx[(nbBanks - 1) * BANK_SIZE], BANK_SIZE);
|
||||||
report("FATAL: Failed to realloc ROMX buffer: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ssize_t bankLen = readBytes(input, &romx[(nbBanks - 1) * BANK_SIZE],
|
|
||||||
BANK_SIZE);
|
|
||||||
|
|
||||||
// Update bank count, ONLY IF at least one byte was read
|
// Update bank count, ONLY IF at least one byte was read
|
||||||
if (bankLen) {
|
if (bankLen) {
|
||||||
@@ -1014,7 +1009,7 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
static_assert(0x10000 * BANK_SIZE <= SSIZE_MAX, "Max input file size too large for OS");
|
static_assert(0x10000 * BANK_SIZE <= SSIZE_MAX, "Max input file size too large for OS");
|
||||||
if (nbBanks == 0x10000) {
|
if (nbBanks == 0x10000) {
|
||||||
report("FATAL: \"%s\" has more than 65536 banks\n", name);
|
report("FATAL: \"%s\" has more than 65536 banks\n", name);
|
||||||
goto cleanup;
|
return;
|
||||||
}
|
}
|
||||||
nbBanks++;
|
nbBanks++;
|
||||||
|
|
||||||
@@ -1081,11 +1076,11 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
// Pipes have already read ROMX and updated globalSum, but not regular files
|
// Pipes have already read ROMX and updated globalSum, but not regular files
|
||||||
if (input == output) {
|
if (input == output) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ssize_t romxLen = readBytes(input, bank, sizeof(bank));
|
ssize_t bankLen = readBytes(input, bank, sizeof(bank));
|
||||||
|
|
||||||
for (uint16_t i = 0; i < romxLen; i++)
|
for (uint16_t i = 0; i < bankLen; i++)
|
||||||
globalSum += bank[i];
|
globalSum += bank[i];
|
||||||
if (romxLen != sizeof(bank))
|
if (bankLen != sizeof(bank))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1105,7 +1100,7 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
if (input == output) {
|
if (input == output) {
|
||||||
if (lseek(output, 0, SEEK_SET) == (off_t)-1) {
|
if (lseek(output, 0, SEEK_SET) == (off_t)-1) {
|
||||||
report("FATAL: Failed to rewind \"%s\": %s\n", name, strerror(errno));
|
report("FATAL: Failed to rewind \"%s\": %s\n", name, strerror(errno));
|
||||||
goto cleanup;
|
return;
|
||||||
}
|
}
|
||||||
// If modifying the file in-place, we only need to edit the header
|
// If modifying the file in-place, we only need to edit the header
|
||||||
// However, padding may have modified ROM0 (added padding), so don't in that case
|
// However, padding may have modified ROM0 (added padding), so don't in that case
|
||||||
@@ -1116,25 +1111,25 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
|
|
||||||
if (writeLen == -1) {
|
if (writeLen == -1) {
|
||||||
report("FATAL: Failed to write \"%s\"'s ROM0: %s\n", name, strerror(errno));
|
report("FATAL: Failed to write \"%s\"'s ROM0: %s\n", name, strerror(errno));
|
||||||
goto cleanup;
|
return;
|
||||||
} else if (writeLen < rom0Len) {
|
} else if (writeLen < rom0Len) {
|
||||||
report("FATAL: Could only write %jd of \"%s\"'s %jd ROM0 bytes\n",
|
report("FATAL: Could only write %jd of \"%s\"'s %jd ROM0 bytes\n",
|
||||||
(intmax_t)writeLen, name, (intmax_t)rom0Len);
|
(intmax_t)writeLen, name, (intmax_t)rom0Len);
|
||||||
goto cleanup;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output ROMX if it was buffered
|
// Output ROMX if it was buffered
|
||||||
if (romx) {
|
if (!romx.empty()) {
|
||||||
// The value returned is either -1, or smaller than `totalRomxLen`,
|
// The value returned is either -1, or smaller than `totalRomxLen`,
|
||||||
// so it's fine to cast to `size_t`
|
// so it's fine to cast to `size_t`
|
||||||
writeLen = writeBytes(output, romx, totalRomxLen);
|
writeLen = writeBytes(output, romx.data(), totalRomxLen);
|
||||||
if (writeLen == -1) {
|
if (writeLen == -1) {
|
||||||
report("FATAL: Failed to write \"%s\"'s ROMX: %s\n", name, strerror(errno));
|
report("FATAL: Failed to write \"%s\"'s ROMX: %s\n", name, strerror(errno));
|
||||||
goto cleanup;
|
return;
|
||||||
} else if ((size_t)writeLen < totalRomxLen) {
|
} else if ((size_t)writeLen < totalRomxLen) {
|
||||||
report("FATAL: Could only write %jd of \"%s\"'s %zu ROMX bytes\n",
|
report("FATAL: Could only write %jd of \"%s\"'s %zu ROMX bytes\n",
|
||||||
(intmax_t)writeLen, name, totalRomxLen);
|
(intmax_t)writeLen, name, totalRomxLen);
|
||||||
goto cleanup;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1144,7 +1139,7 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
if (lseek(output, 0, SEEK_END) == (off_t)-1) {
|
if (lseek(output, 0, SEEK_END) == (off_t)-1) {
|
||||||
report("FATAL: Failed to seek to end of \"%s\": %s\n",
|
report("FATAL: Failed to seek to end of \"%s\": %s\n",
|
||||||
name, strerror(errno));
|
name, strerror(errno));
|
||||||
goto cleanup;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memset(bank, padValue, sizeof(bank));
|
memset(bank, padValue, sizeof(bank));
|
||||||
@@ -1165,9 +1160,6 @@ static void processFile(int input, int output, char const *name, off_t fileSize)
|
|||||||
len -= thisLen;
|
len -= thisLen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
|
||||||
free(romx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool processFilename(char const *name)
|
static bool processFilename(char const *name)
|
||||||
|
|||||||
Reference in New Issue
Block a user