shithub: pokecrystal

Download patch

ref: 0d1a029e818c295b7cd04bef6527a20f3178f439
parent: 313deab55253ee49ef3872491f6805a03b5ea36b
author: Rangi <[email protected]>
date: Wed Sep 1 21:21:15 EDT 2021

Rewrite tools/scan_includes.c to use common.h and factor out a parse_args function

--- a/tools/common.h
+++ b/tools/common.h
@@ -12,9 +12,10 @@
 #include <getopt.h>
 
 int getopt_long_index;
-#define getopt_long(c, v, s, l) getopt_long(c, v, s, l, &getopt_long_index)
+#define getopt_long(argc, argv, optstring, longopts) getopt_long(argc, argv, optstring, longopts, &getopt_long_index)
 
 void *malloc_verbose(size_t size) {
+	errno = 0;
 	void *m = malloc(size);
 	if (!m) {
 		fprintf(stderr, "Could not allocate %zu bytes: %s\n", size, strerror(errno));
@@ -25,6 +26,7 @@
 
 FILE *fopen_verbose(const char *filename, char rw) {
 	char mode[3] = {rw, 'b', '\0'};
+	errno = 0;
 	FILE *f = fopen(filename, mode);
 	if (!f) {
 		fprintf(stderr, "Could not open file \"%s\": %s\n", filename, strerror(errno));
@@ -34,6 +36,7 @@
 }
 
 void fread_verbose(uint8_t *data, size_t size, const char *filename, FILE *f) {
+	errno = 0;
 	if (fread(data, 1, size, f) != size) {
 		fprintf(stderr, "Could not read from file \"%s\": %s\n", filename, strerror(errno));
 		fclose(f);
@@ -42,6 +45,7 @@
 }
 
 void fwrite_verbose(const uint8_t *data, size_t size, const char *filename, FILE *f) {
+	errno = 0;
 	if (fwrite(data, 1, size, f) != size) {
 		fprintf(stderr, "Could not write to file \"%s\": %s\n", filename, strerror(errno));
 		fclose(f);
@@ -49,8 +53,9 @@
 	}
 }
 
-long file_size(const char *filename, FILE *f) {
-	long size = 0;
+long file_size_verbose(const char *filename, FILE *f) {
+	long size = -1;
+	errno = 0;
 	if (!fseek(f, 0, SEEK_END)) {
 		size = ftell(f);
 		if (size != -1) {
@@ -57,7 +62,7 @@
 			rewind(f);
 		}
 	}
-	if (errno) {
+	if (size == -1) {
 		fprintf(stderr, "Could not measure file \"%s\": %s\n", filename, strerror(errno));
 		exit(1);
 	}
@@ -66,7 +71,7 @@
 
 uint8_t *read_u8(const char *filename, long *size) {
 	FILE *f = fopen_verbose(filename, 'r');
-	*size = file_size(filename, f);
+	*size = file_size_verbose(filename, f);
 	uint8_t *data = malloc_verbose(*size);
 	fread_verbose(data, *size, filename, f);
 	fclose(f);
--- a/tools/png_dimensions.c
+++ b/tools/png_dimensions.c
@@ -1,7 +1,7 @@
 #include "common.h"
 
 void usage() {
-	fprintf(stderr, "Usage: png_dimensions in.png out.dimensions\n");
+	fputs("Usage: png_dimensions in.png out.dimensions\n", stderr);
 }
 
 uint8_t read_dimensions(const char *filename) {
@@ -19,6 +19,7 @@
 		usage();
 		exit(1);
 	}
+
 	uint8_t output_byte = read_dimensions(argv[1]);
 	write_u8(argv[2], &output_byte, 1);
 	return 0;
--- a/tools/scan_includes.c
+++ b/tools/scan_includes.c
@@ -1,29 +1,15 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-#include <getopt.h>
+#include "common.h"
 
 void usage(void) {
-	printf("Usage: scan_includes [-h] [-s] filename\n"
-	       "-h, --help\n"
-	       "    Print usage and exit\n"
-	       "-s, --strict\n"
-	       "    Fail if a file cannot be read\n");
+	fputs("Usage: scan_includes [-h|--help] [-s|--strict] filename.asm\n", stderr);
 }
 
-struct Options {
-	bool help;
-	bool strict;
-};
-
-struct Options Options = {0};
-
-void scan_file(char* filename) {
+void scan_file(const char *filename, bool strict) {
+	errno = 0;
 	FILE *f = fopen(filename, "rb");
 	if (!f) {
-		if (Options.strict) {
-			fprintf(stderr, "Could not open file: '%s'\n", filename);
+		if (strict) {
+			fprintf(stderr, "Could not open file \"%s\": %s\n", filename, strerror(errno));
 			exit(1);
 		} else {
 			return;
@@ -30,106 +16,90 @@
 		}
 	}
 
-	fseek(f, 0, SEEK_END);
-	long size = ftell(f);
-	rewind(f);
-
-	char *buffer = malloc(size + 1);
-	char *orig = buffer;
-	size = fread(buffer, 1, size, f);
-	buffer[size] = '\0';
+	long size = file_size_verbose(filename, f);
+	char *contents = malloc_verbose(size + 1);
+	fread_verbose((uint8_t *)contents, size, filename, f);
 	fclose(f);
+	contents[size] = '\0';
 
-	for (; buffer && (buffer - orig < size); buffer++) {
-		bool is_include = false;
-		bool is_incbin = false;
-		switch (*buffer) {
-			case ';':
-				buffer = strchr(buffer, '\n');
-				if (!buffer) {
-					fprintf(stderr, "%s: no newline at end of file\n", filename);
-					break;
-				}
+	for (char *ptr = contents; ptr && ptr - contents < size; ptr++) {
+		bool is_incbin = false, is_include = false;
+		switch (*ptr) {
+		case ';':
+			ptr = strchr(ptr, '\n');
+			if (!ptr) {
+				fprintf(stderr, "%s: no newline at end of file\n", filename);
 				break;
-
-			case '"':
-				buffer++;
-				buffer = strchr(buffer, '"');
-				if (!buffer) {
-					fprintf(stderr, "%s: unterminated string\n", filename);
+			}
+			break;
+		case '"':
+			ptr++;
+			ptr = strchr(ptr, '"');
+			if (!ptr) {
+				fprintf(stderr, "%s: unterminated string\n", filename);
+				break;
+			}
+			ptr++;
+			break;
+		case 'I':
+		case 'i':
+			is_incbin = !strncmp(ptr, "INCBIN", 6) || !strncmp(ptr, "incbin", 6);
+			is_include = !strncmp(ptr, "INCLUDE", 7) || !strncmp(ptr, "include", 7);
+			if (is_incbin || is_include) {
+				ptr = strchr(ptr, '"');
+				if (!ptr) {
 					break;
 				}
-				buffer++;
-				break;
-
-			case 'i':
-			case 'I':
-				if ((strncmp(buffer, "INCBIN", 6) == 0) || (strncmp(buffer, "incbin", 6) == 0)) {
-					is_incbin = true;
-				} else if ((strncmp(buffer, "INCLUDE", 7) == 0) || (strncmp(buffer, "include", 7) == 0)) {
-					is_include = true;
+				ptr++;
+				char *include_path = ptr;
+				size_t length = strcspn(ptr, "\"");
+				ptr += length + 1;
+				include_path[length] = '\0';
+				printf("%s ", include_path);
+				if (is_include) {
+					scan_file(include_path, strict);
 				}
-				if (is_incbin || is_include) {
-					buffer = strchr(buffer, '"');
-					if (!buffer) {
-						break;
-					}
-					buffer++;
-					int length = strcspn(buffer, "\"");
-					char *include = malloc(length + 1);
-					strncpy(include, buffer, length);
-					include[length] = '\0';
-					printf("%s ", include);
-					if (is_include) {
-						scan_file(include);
-					}
-					free(include);
-					buffer = strchr(buffer, '"');
-				}
-				break;
-
-		}
-		if (!buffer) {
+			}
 			break;
 		}
-
 	}
 
-	free(orig);
+	free(contents);
 }
 
-int main(int argc, char* argv[]) {
-	int i = 0;
+void parse_args(int argc, char *argv[], bool *strict) {
 	struct option long_options[] = {
 		{"strict", no_argument, 0, 's'},
 		{"help", no_argument, 0, 'h'},
 		{0}
 	};
-	int opt = -1;
-	while ((opt = getopt_long(argc, argv, "sh", long_options, &i)) != -1) {
+	for (int opt; (opt = getopt_long(argc, argv, "sh", long_options)) != -1;) {
 		switch (opt) {
 		case 's':
-			Options.strict = true;
+			*strict = true;
 			break;
 		case 'h':
-			Options.help = true;
+			usage();
+			exit(0);
 			break;
 		default:
 			usage();
 			exit(1);
-			break;
 		}
 	}
+}
+
+int main(int argc, char *argv[]) {
+	bool strict = false;
+	parse_args(argc, argv, &strict);
+
 	argc -= optind;
 	argv += optind;
-	if (Options.help) {
-		usage();
-		return 0;
-	}
 	if (argc < 1) {
 		usage();
 		exit(1);
 	}
-	scan_file(argv[0]);
+
+	scan_file(argv[0], strict);
 	return 0;
 }
--- a/tools/stadium.c
+++ b/tools/stadium.c
@@ -37,7 +37,7 @@
 uint8_t n64ps3[N64PS3SIZE] = {'N', '6', '4', 'P', 'S', '3'};
 
 static void usage(void) {
-	fprintf(stderr, "Usage: stadium [-h|--help] [-b|--base us|eu|dbg] romfile\n");
+	fputs("Usage: stadium [-h|--help] [-b|--base us|eu|dbg] romfile\n", stderr);
 }
 
 void parse_args(int argc, char *argv[], Base *b) {
@@ -46,8 +46,8 @@
 		{"help", no_argument, 0, 'h'},
 		{0}
 	};
-	for (int opt = 0; opt != -1;) {
-		switch (opt = getopt_long(argc, argv, "hb:", long_options)) {
+	for (int opt; (opt = getopt_long(argc, argv, "hb:", long_options)) != -1;) {
+		switch (opt) {
 		case 'h':
 			usage();
 			exit(0);
@@ -58,13 +58,9 @@
 				!strcmp(optarg, "dbg") ? BASE_DEBUG :
 				BASE_NONE;
 			break;
-		case 0:
-		case -1:
-			break;
 		default:
 			usage();
 			exit(1);
-			break;
 		}
 	}
 }
@@ -157,6 +153,5 @@
 	uint8_t *file = read_u8(filename, &filesize);
 	calculate_checksums(file, filesize, base);
 	write_u8(filename, file, filesize);
-
 	return 0;
 }