mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-09-09 09:51:34 -07:00
80888726b9
malloc can always fail. Check to avoid null dereference. malloc(0) is well defined but leads to an eventual crash on some systems. Check it too.
99 lines
1.7 KiB
C
99 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <getopt.h>
|
|
|
|
void usage(void) {
|
|
printf("Usage: palette palfile\n");
|
|
exit(1);
|
|
}
|
|
|
|
void print_rgb(uint16_t word) {
|
|
int r, g, b;
|
|
r = word & 0x1f;
|
|
g = (word >> 5) & 0x1f;
|
|
b = (word >> 10) & 0x1f;
|
|
printf("\tRGB %2d, %2d, %2d\n", r, g, b);
|
|
}
|
|
|
|
void print_pokemon_palette(char* palette_filename) {
|
|
FILE* f;
|
|
uint8_t bytes[4];
|
|
|
|
f = fopen(palette_filename, "rb");
|
|
if (f == NULL) {
|
|
fprintf(stderr, "failed to open file %s\n", palette_filename);
|
|
exit(1);
|
|
}
|
|
|
|
fseek(f, 2, SEEK_SET);
|
|
fread(bytes, 1, 4, f);
|
|
fclose(f);
|
|
|
|
print_rgb((bytes[1] << 8) | bytes[0]);
|
|
print_rgb((bytes[3] << 8) | bytes[2]);
|
|
}
|
|
|
|
void print_palette(char* palette_filename) {
|
|
FILE* f;
|
|
uint8_t* bytes;
|
|
long size;
|
|
int i;
|
|
|
|
f = fopen(palette_filename, "rb");
|
|
if (f == NULL) {
|
|
fprintf(stderr, "failed to open file %s\n", palette_filename);
|
|
exit(1);
|
|
}
|
|
|
|
fseek(f, 0, SEEK_END);
|
|
size = ftell(f);
|
|
if (!size) {
|
|
fprintf(stderr, "empty file %s\n", palette_filename);
|
|
exit(1);
|
|
}
|
|
rewind(f);
|
|
|
|
bytes = malloc(size);
|
|
if (!bytes) {
|
|
fprintf(stderr, "malloc failure\n");
|
|
exit(1);
|
|
}
|
|
|
|
fseek(f, 0, SEEK_SET);
|
|
fread(bytes, 1, size, f);
|
|
fclose(f);
|
|
|
|
for (i = 0; i + 1 < size; i += 2) {
|
|
print_rgb((bytes[i + 1] << 8) | bytes[i]);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char* argv[]) {
|
|
int ch;
|
|
bool pokemon = false;
|
|
|
|
while ((ch = getopt(argc, argv, "p")) != -1) {
|
|
switch (ch) {
|
|
case 'p':
|
|
pokemon = true;
|
|
break;
|
|
default:
|
|
usage();
|
|
}
|
|
}
|
|
argc -= optind;
|
|
argv += optind;
|
|
if (argc < 1) {
|
|
usage();
|
|
}
|
|
if (pokemon) {
|
|
print_pokemon_palette(argv[0]);
|
|
} else {
|
|
print_palette(argv[0]);
|
|
}
|
|
return 0;
|
|
}
|