rgbfix: use mkstemp() instead of tmpnam() and fix coding style issues

Signed-off-by: Vegard Nossum <vegard.nossum@gmail.com>
This commit is contained in:
Vegard Nossum
2009-06-11 08:59:03 +02:00
parent bc6b2fe005
commit c6d8069eed

View File

@@ -13,10 +13,10 @@
* *
*/ */
#define OPTF_DEBUG 0x01L #define OPTF_DEBUG 0x01L
#define OPTF_PAD 0x02L #define OPTF_PAD 0x02L
#define OPTF_VALIDATE 0x04L #define OPTF_VALIDATE 0x04L
#define OPTF_TITLE 0x08L #define OPTF_TITLE 0x08L
#define OPTF_TRUNCATE 0x10L #define OPTF_TRUNCATE 0x10L
unsigned long ulOptions; unsigned long ulOptions;
@@ -27,12 +27,12 @@ unsigned long ulOptions;
*/ */
unsigned char NintendoChar[48] = { unsigned char NintendoChar[48] = {
0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83, 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B,
0x00, 0x0C, 0x00, 0x0D, 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D,
0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E, 0xDC, 0xCC, 0x6E, 0xE6, 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,
0xDD, 0xDD, 0xD9, 0x99, 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99,
0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC,
0xBB, 0xB9, 0x33, 0x3E 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E,
}; };
/* /*
@@ -42,19 +42,18 @@ unsigned char NintendoChar[48] = {
void PrintUsage(void) void PrintUsage(void)
{ {
printf("RGBFix v" RGBFIX_VERSION " (part of ASMotor " ASMOTOR_VERSION printf("RGBFix v" RGBFIX_VERSION
")\n\n"); " (part of ASMotor " ASMOTOR_VERSION ")\n\n");
printf("Usage: rgbfix [options] image[.gb]\n"); printf("Usage: rgbfix [options] image[.gb]\n");
printf("Options:\n"); printf("Options:\n");
printf("\t-h\t\tThis text\n"); printf("\t-h\t\tThis text\n");
printf("\t-d\t\tDebug: Don't change image\n"); printf("\t-d\t\tDebug: Don't change image\n");
printf printf("\t-p\t\tPad image to valid size\n\t\t\tPads to 32/64/128/256/512kB as appropriate\n");
("\t-p\t\tPad image to valid size\n\t\t\tPads to 32/64/128/256/512kB as appropriate\n"); printf("\t-r\t\ttRuncate image to valid size\n\t\t\tTruncates to 32/64/128/256/512kB as appropriate\n");
printf
("\t-r\t\ttRuncate image to valid size\n\t\t\tTruncates to 32/64/128/256/512kB as appropriate\n");
printf("\t-t<name>\tChange cartridge title field (16 characters)\n"); printf("\t-t<name>\tChange cartridge title field (16 characters)\n");
printf printf("\t-v\t\tValidate header\n\t\t\tCorrects - Nintendo Character Area (0x0104)\n\t\t\t\t - ROM type (0x0147)\n\t\t\t\t - ROM size (0x0148)\n\t\t\t\t - Checksums (0x014D-0x014F)\n");
("\t-v\t\tValidate header\n\t\t\tCorrects - Nintendo Character Area (0x0104)\n\t\t\t\t - ROM type (0x0147)\n\t\t\t\t - ROM size (0x0148)\n\t\t\t\t - Checksums (0x014D-0x014F)\n");
exit(0); exit(0);
} }
@@ -136,267 +135,267 @@ int main(int argc, char *argv[])
if (!FileExists(filename)) if (!FileExists(filename))
strcat(filename, ".gb"); strcat(filename, ".gb");
if ((f = fopen(filename, "rb+")) != NULL) { f = fopen(filename, "rb+");
/* if (!f)
* -d (Debug) option code FatalError("Unable to open file");
*
*/
if (ulOptions & OPTF_DEBUG) { /*
printf("-d (Debug) option enabled...\n"); * -d (Debug) option code
} *
*/
if (ulOptions & OPTF_DEBUG) {
printf("-d (Debug) option enabled...\n");
}
/*
* -p (Pad) option code
*
*/
if (ulOptions & OPTF_PAD) {
long size, padto;
long bytesadded = 0;
size = FileSize(f);
padto = 0x8000L;
while (size > padto)
padto *= 2;
printf("Padding to %ldkB:\n", padto / 1024);
/* /*
* -p (Pad) option code if( padto<=0x80000L )
* {
*/ */
if (size != padto) {
if (ulOptions & OPTF_PAD) {
long size, padto;
long bytesadded = 0;
size = FileSize(f);
padto = 0x8000L;
while (size > padto)
padto *= 2;
printf("Padding to %ldkB:\n", padto / 1024);
/*
if( padto<=0x80000L )
{
*/
if (size != padto) {
fflush(stdout);
fseek(f, 0, SEEK_END);
while (size < padto) {
size += 1;
if ((ulOptions & OPTF_DEBUG) == 0)
fputc(0, f);
bytesadded += 1;
}
fflush(f);
printf("\tAdded %ld bytes\n", bytesadded);
} else
printf("\tNo padding needed\n");
/*
}
else
FatalError( "Image size exceeds 512kB" );
*/
}
/*
* -r (Truncate) option code
*
*/
if (ulOptions & OPTF_TRUNCATE) {
long size, padto;
char tempfile[512];
FILE *tf;
size = FileSize(f);
padto = 256 * 32768;
while (size < padto)
padto /= 2;
printf("Truncating to %ldkB:\n", padto / 1024);
tmpnam(tempfile);
if ((ulOptions & OPTF_DEBUG) == 0) {
if ((tf = fopen(tempfile, "wb")) != NULL) {
fseek(f, 0, SEEK_SET);
while (padto--) {
fputc(fgetc(f), tf);
}
fclose(f);
fclose(tf);
remove(filename);
rename(tempfile, filename);
f = fopen(filename, "rb+");
}
}
}
/*
* -t (Set carttitle) option code
*
*/
if (ulOptions & OPTF_TITLE) {
printf("Setting cartridge title:\n");
if ((ulOptions & OPTF_DEBUG) == 0) {
fflush(f);
fseek(f, 0x0134L, SEEK_SET);
fwrite(cartname, 16, 1, f);
fflush(f);
}
printf("\tTitle set to %s\n", cartname);
}
/*
* -v (Validate header) option code
*
*/
if (ulOptions & OPTF_VALIDATE) {
long i, byteschanged = 0;
long cartromsize, calcromsize = 0, filesize;
long carttype;
unsigned short cartchecksum = 0, calcchecksum = 0;
unsigned char cartcompchecksum = 0, calccompchecksum =
0;
int ch;
printf("Validating header:\n");
fflush(stdout); fflush(stdout);
/* Nintendo Character Area */ fseek(f, 0, SEEK_END);
while (size < padto) {
fflush(f); size += 1;
fseek(f, 0x0104L, SEEK_SET); if ((ulOptions & OPTF_DEBUG) == 0)
fputc(0, f);
for (i = 0; i < 48; i += 1) { bytesadded += 1;
int ch;
ch = fgetc(f);
if (ch == EOF)
ch = 0x00;
if (ch != NintendoChar[i]) {
byteschanged += 1;
if ((ulOptions & OPTF_DEBUG) == 0) {
fseek(f, -1, SEEK_CUR);
fputc(NintendoChar[i], f);
fflush(f);
}
}
} }
fflush(f); fflush(f);
if (byteschanged) printf("\tAdded %ld bytes\n", bytesadded);
printf } else
("\tChanged %ld bytes in the Nintendo Character Area\n", printf("\tNo padding needed\n");
byteschanged); /*
else }
printf("\tNintendo Character Area is OK\n"); else
FatalError( "Image size exceeds 512kB" );
*/
}
/* ROM size */ /*
* -r (Truncate) option code
*
*/
if (ulOptions & OPTF_TRUNCATE) {
long size, padto;
char tempfile[] = "/tmp/rgbfix-XXXXXX";
FILE *tf;
size = FileSize(f);
padto = 256 * 32768;
while (size < padto)
padto /= 2;
printf("Truncating to %ldkB:\n", padto / 1024);
mkstemp(tempfile);
if ((ulOptions & OPTF_DEBUG) == 0) {
if ((tf = fopen(tempfile, "wb")) != NULL) {
fseek(f, 0, SEEK_SET);
while (padto--) {
fputc(fgetc(f), tf);
}
fclose(f);
fclose(tf);
remove(filename);
rename(tempfile, filename);
f = fopen(filename, "rb+");
}
}
}
/*
* -t (Set carttitle) option code
*
*/
if (ulOptions & OPTF_TITLE) {
printf("Setting cartridge title:\n");
if ((ulOptions & OPTF_DEBUG) == 0) {
fflush(f); fflush(f);
fseek(f, 0x0148L, SEEK_SET); fseek(f, 0x0134L, SEEK_SET);
cartromsize = fgetc(f); fwrite(cartname, 16, 1, f);
if (cartromsize == EOF) fflush(f);
cartromsize = 0x00; }
filesize = FileSize(f); printf("\tTitle set to %s\n", cartname);
while (filesize > (0x8000L << calcromsize)) }
calcromsize += 1;
/*
* -v (Validate header) option code
*
*/
if (ulOptions & OPTF_VALIDATE) {
long i, byteschanged = 0;
long cartromsize, calcromsize = 0, filesize;
long carttype;
unsigned short cartchecksum = 0, calcchecksum = 0;
unsigned char cartcompchecksum = 0, calccompchecksum =
0;
int ch;
printf("Validating header:\n");
fflush(stdout);
/* Nintendo Character Area */
fflush(f);
fseek(f, 0x0104L, SEEK_SET);
for (i = 0; i < 48; i += 1) {
int ch;
ch = fgetc(f);
if (ch == EOF)
ch = 0x00;
if (ch != NintendoChar[i]) {
byteschanged += 1;
if (calcromsize != cartromsize) {
if ((ulOptions & OPTF_DEBUG) == 0) { if ((ulOptions & OPTF_DEBUG) == 0) {
fseek(f, -1, SEEK_CUR); fseek(f, -1, SEEK_CUR);
fputc(calcromsize, f); fputc(NintendoChar[i], f);
fflush(f);
}
}
}
fflush(f);
if (byteschanged)
printf
("\tChanged %ld bytes in the Nintendo Character Area\n",
byteschanged);
else
printf("\tNintendo Character Area is OK\n");
/* ROM size */
fflush(f);
fseek(f, 0x0148L, SEEK_SET);
cartromsize = fgetc(f);
if (cartromsize == EOF)
cartromsize = 0x00;
filesize = FileSize(f);
while (filesize > (0x8000L << calcromsize))
calcromsize += 1;
if (calcromsize != cartromsize) {
if ((ulOptions & OPTF_DEBUG) == 0) {
fseek(f, -1, SEEK_CUR);
fputc(calcromsize, f);
fflush(f);
}
printf("\tChanged ROM size byte from 0x%02lX (%ldkB) to 0x%02lX (%ldkB)\n",
cartromsize,
(0x8000L << cartromsize) / 1024,
calcromsize,
(0x8000L << calcromsize) / 1024);
} else
printf("\tROM size byte is OK\n");
/* Cartridge type */
fflush(f);
fseek(f, 0x0147L, SEEK_SET);
carttype = fgetc(f);
if (carttype == EOF)
carttype = 0x00;
if (FileSize(f) > 0x8000L) {
/* carttype byte must != 0x00 */
if (carttype == 0x00) {
if ((ulOptions & OPTF_DEBUG) == 0) {
fseek(f, -1, SEEK_CUR);
fputc(0x01, f);
fflush(f); fflush(f);
} }
printf printf
("\tChanged ROM size byte from 0x%02lX (%ldkB) to 0x%02lX (%ldkB)\n", ("\tCartridge type byte changed to 0x01\n");
cartromsize,
(0x8000L << cartromsize) / 1024,
calcromsize,
(0x8000L << calcromsize) / 1024);
} else } else
printf("\tROM size byte is OK\n");
/* Cartridge type */
fflush(f);
fseek(f, 0x0147L, SEEK_SET);
carttype = fgetc(f);
if (carttype == EOF)
carttype = 0x00;
if (FileSize(f) > 0x8000L) {
/* carttype byte must != 0x00 */
if (carttype == 0x00) {
if ((ulOptions & OPTF_DEBUG) == 0) {
fseek(f, -1, SEEK_CUR);
fputc(0x01, f);
fflush(f);
}
printf
("\tCartridge type byte changed to 0x01\n");
} else
printf("\tCartridge type byte is OK\n");
} else {
/* carttype byte can be anything? */
printf("\tCartridge type byte is OK\n"); printf("\tCartridge type byte is OK\n");
} } else {
/* carttype byte can be anything? */
/* Checksum */ printf("\tCartridge type byte is OK\n");
fflush(f);
fseek(f, 0, SEEK_SET);
for (i = 0; i < (0x8000L << calcromsize); i += 1) {
ch = fgetc(f);
if (ch == EOF)
ch = 0;
if (i < 0x0134L)
calcchecksum += ch;
else if (i < 0x014DL) {
calccompchecksum += ch;
calcchecksum += ch;
} else if (i == 0x014DL)
cartcompchecksum = ch;
else if (i == 0x014EL)
cartchecksum = ch << 8;
else if (i == 0x014FL)
cartchecksum |= ch;
else
calcchecksum += ch;
}
calccompchecksum = 0xE7 - calccompchecksum;
calcchecksum += calccompchecksum;
if (cartchecksum != calcchecksum) {
fflush(f);
fseek(f, 0x014EL, SEEK_SET);
if ((ulOptions & OPTF_DEBUG) == 0) {
fputc(calcchecksum >> 8, f);
fputc(calcchecksum & 0xFF, f);
}
fflush(f);
printf
("\tChecksum changed from 0x%04lX to 0x%04lX\n",
(long)cartchecksum, (long)calcchecksum);
} else
printf("\tChecksum is OK\n");
if (cartcompchecksum != calccompchecksum) {
fflush(f);
fseek(f, 0x014DL, SEEK_SET);
if ((ulOptions & OPTF_DEBUG) == 0)
fputc(calccompchecksum, f);
fflush(f);
printf
("\tCompChecksum changed from 0x%02lX to 0x%02lX\n",
(long)cartcompchecksum,
(long)calccompchecksum);
} else
printf("\tCompChecksum is OK\n");
} }
fclose(f);
} else { /* Checksum */
FatalError("Unable to open file");
fflush(f);
fseek(f, 0, SEEK_SET);
for (i = 0; i < (0x8000L << calcromsize); i += 1) {
ch = fgetc(f);
if (ch == EOF)
ch = 0;
if (i < 0x0134L)
calcchecksum += ch;
else if (i < 0x014DL) {
calccompchecksum += ch;
calcchecksum += ch;
} else if (i == 0x014DL)
cartcompchecksum = ch;
else if (i == 0x014EL)
cartchecksum = ch << 8;
else if (i == 0x014FL)
cartchecksum |= ch;
else
calcchecksum += ch;
}
calccompchecksum = 0xE7 - calccompchecksum;
calcchecksum += calccompchecksum;
if (cartchecksum != calcchecksum) {
fflush(f);
fseek(f, 0x014EL, SEEK_SET);
if ((ulOptions & OPTF_DEBUG) == 0) {
fputc(calcchecksum >> 8, f);
fputc(calcchecksum & 0xFF, f);
}
fflush(f);
printf
("\tChecksum changed from 0x%04lX to 0x%04lX\n",
(long)cartchecksum, (long)calcchecksum);
} else
printf("\tChecksum is OK\n");
if (cartcompchecksum != calccompchecksum) {
fflush(f);
fseek(f, 0x014DL, SEEK_SET);
if ((ulOptions & OPTF_DEBUG) == 0)
fputc(calccompchecksum, f);
fflush(f);
printf
("\tCompChecksum changed from 0x%02lX to 0x%02lX\n",
(long)cartcompchecksum,
(long)calccompchecksum);
} else
printf("\tCompChecksum is OK\n");
} }
fclose(f);
return (0); return (0);
} }