summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2026-03-09 17:04:17 -0300
committerGitHub <noreply@github.com>2026-03-09 21:04:17 +0100
commitbc6d153a21e3fc7a729ea2154f2ff16111d5e704 (patch)
tree639455495082c3830f7caffc9881b470f99eba21 /tools
parente66e6f8f1da067260ced7ec9abd415011cfab8bc (diff)
Allow `atblgen` to process `sequence_order.in` with empty lines in between lines for building on Macos (#2718)
The present changes are a direct copy-paste from https://github.com/zeldaret/mm/pull/1850 This fixes building on macos due to a kinda specific issue with Apple clang. When trying to build on Macos (specifically MacOS 12, Monteray with Apple clang 13.0.0 (clang-1300.0.29.30), idk if other versions have this issue too) `make` stops with the following error from `atblgen`: ``` Failed to match line 1: "" regexec error: "regexec() failed to match" Error: Malformed build/n64-us/assets/audio/sequence_order.in? ``` `atblgen` makes the assumption that the `sequence_order.in` file has no extra data, spaces, empty lines, etc. but the file somehow ends up having empty lines between each line on macos. This file is created by using the C preprocessor to process `include/tables/sequence_table.h`. In normal circumstances this file should look like this snip, ``` (Sequence_0,NA_BGM_GENERAL_SFX) (Sequence_1,NA_BGM_AMBIENCE) (Sequence_2,NA_BGM_TERMINA_FIELD) (Sequence_3,NA_BGM_CHASE) (Sequence_4,NA_BGM_MAJORAS_THEME) ``` but it ends up looking like this instead ``` (Sequence_0,NA_BGM_GENERAL_SFX) (Sequence_1,NA_BGM_AMBIENCE) (Sequence_2,NA_BGM_TERMINA_FIELD) (Sequence_3,NA_BGM_CHASE) (Sequence_4,NA_BGM_MAJORAS_THEME) ``` which `atblgen` doesn't like. I believe this happens because there are lines with comments between each macro in [`sequence_table.h`](https://github.com/zeldaret/mm/blob/0877ce4adf28a8e73e05c3c58682273b8bf28749/include/tables/sequence_table.h) and for some reason this Apple clang version decided to preserve those empty lines The fix just makes `atblgen` skip empty lines. I threw `atblgen` to valgrind to check the fix was working as intended and noted a bunch of memory that was being free before exit, so I fixed them. I also noted the tools/audio makefile was not using `OPTFLAGS` when building those tools, so I fixed that too.
Diffstat (limited to 'tools')
-rw-r--r--tools/audio/Makefile2
-rw-r--r--tools/audio/aifc.c16
-rw-r--r--tools/audio/audio_tablegen.c39
3 files changed, 48 insertions, 9 deletions
diff --git a/tools/audio/Makefile b/tools/audio/Makefile
index fa74b8c8a..b44e8db0f 100644
--- a/tools/audio/Makefile
+++ b/tools/audio/Makefile
@@ -46,7 +46,7 @@ sfc_LDFLAGS := $(XML_LDFLAGS)
define COMPILE =
$(1): $($1_SOURCES)
- $(CC) $(CFLAGS) $($1_CFLAGS) $$^ $($1_LDFLAGS) -o $$@
+ $(CC) $(CFLAGS) $(OPTFLAGS) $($1_CFLAGS) $$^ $($1_LDFLAGS) -o $$@
endef
$(foreach p,$(PROGRAMS),$(eval $(call COMPILE,$(p))))
diff --git a/tools/audio/aifc.c b/tools/audio/aifc.c
index cadad5ae2..e0c65cfb6 100644
--- a/tools/audio/aifc.c
+++ b/tools/audio/aifc.c
@@ -96,8 +96,12 @@ f64_to_f80(double f64, uint8_t *f80)
} f80tmp;
// get f64 bits
-
- uint64_t f64_bits = *(uint64_t *)&f64;
+ union {
+ double f;
+ uint64_t u;
+ } tp;
+ tp.f = f64;
+ uint64_t f64_bits = tp.u;
int f64_sgn = F64_GET_SGN(f64_bits);
int f64_exponent = F64_GET_EXP(f64_bits);
@@ -155,8 +159,12 @@ f80_to_f64(double *f64, uint8_t *f80)
((uint64_t)f64_mantissa_hi << 32) | ((uint64_t)f64_mantissa_lo);
// write double
-
- *f64 = *(double *)&f64_bits;
+ union {
+ double f;
+ uint64_t u;
+ } tp;
+ tp.u = f64_bits;
+ *f64 = tp.f;
}
static void
diff --git a/tools/audio/audio_tablegen.c b/tools/audio/audio_tablegen.c
index a95557021..13ecb33e4 100644
--- a/tools/audio/audio_tablegen.c
+++ b/tools/audio/audio_tablegen.c
@@ -300,14 +300,25 @@ read_seq_order(struct seq_order *order, const char *path)
UNUSED size_t data_size;
char *filedata = util_read_whole_file(path, &data_size);
- // We expect one entry per line, gather the total length
+ // We expect one entry per line (with the exception of empty lines), gather the total length
size_t total_size = 0;
- for (char *p = filedata; *p != '\0'; p++) {
+ char *p = filedata;
+ // Skip empty lines at the beginning of the file
+ while (*p == '\n') {
+ p++;
+ }
+ while (*p != '\0') {
if (*p == '\n') {
total_size++;
+ // Skip empty lines
+ while (*p == '\n') {
+ p++;
+ }
} else if (isspace(*p)) {
// There should be no whitespace in the input file besides newlines
goto malformed;
+ } else {
+ p++;
}
}
@@ -334,6 +345,10 @@ read_seq_order(struct seq_order *order, const char *path)
char *lstart = filedata;
for (size_t i = 0; i < total_size; i++) {
+ // find next nonempty line
+ while (*lstart == '\n') {
+ lstart++;
+ }
// find end of line
char *p = lstart;
while (*p != '\n') {
@@ -369,6 +384,7 @@ read_seq_order(struct seq_order *order, const char *path)
lstart = lend + 1;
}
assert(*lstart == '\0');
+ regfree(&re);
// Write results
order->num_sequences = total_size;
@@ -379,9 +395,16 @@ malformed:
error("Malformed %s?", path);
}
+static void
+free_seq_order(struct seq_order *order)
+{
+ free(order->entries);
+ free(order->filedata);
+}
+
struct seqdata {
- const char *elf_path;
- const char *name;
+ char *elf_path;
+ char *name;
uint32_t font_section_offset;
size_t font_section_size;
};
@@ -566,6 +589,14 @@ tablegen_sequences(const char *seq_font_tbl_out, const char *seq_order_path, con
fprintf(out, ".balign 16\n");
fclose(out);
+ free(final_seqdata);
+ for (int i = 0; i < num_sequence_files; i++) {
+ free(file_data[i].name);
+ free(file_data[i].elf_path);
+ }
+ free(file_data);
+ free_seq_order(&order);
+
return EXIT_SUCCESS;
}