From 4765653cb3af905a9b20f1e5f2277e50d801c43b Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Sun, 20 Feb 2022 19:04:21 +0100 Subject: Add metadata header to media files The following properties are supported: - Sound: "loop". Must be either 0 or 1 - Images: "transparent". Must be either 0 or 1 These headers are only used for non-PS1 builds, since .TIM and .VAG files do already implement such information. --- src/header/CMakeLists.txt | 5 ++++ src/header/inc/header.h | 18 +++++++++++++ src/header/src/header.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 src/header/CMakeLists.txt create mode 100644 src/header/inc/header.h create mode 100644 src/header/src/header.c (limited to 'src/header') diff --git a/src/header/CMakeLists.txt b/src/header/CMakeLists.txt new file mode 100644 index 0000000..e23d4fd --- /dev/null +++ b/src/header/CMakeLists.txt @@ -0,0 +1,5 @@ +set(src "src/header.c") +set(inc "inc") + +add_library(header ${src}) +target_include_directories(header PUBLIC ${inc}) diff --git a/src/header/inc/header.h b/src/header/inc/header.h new file mode 100644 index 0000000..7514132 --- /dev/null +++ b/src/header/inc/header.h @@ -0,0 +1,18 @@ +#ifndef HEADER_H +#define HEADER_H + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +int header_load_bool(FILE *f, const char *key, bool *value); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_H */ diff --git a/src/header/src/header.c b/src/header/src/header.c new file mode 100644 index 0000000..bfc6534 --- /dev/null +++ b/src/header/src/header.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include + +int header_load_bool(FILE *const f, const char *const key, bool *const value) +{ + for (size_t i = 0; i < strlen(key); i++) + { + const int ci = fgetc(f); + + if (ferror(f) || ci != key[i]) + { + fprintf(stderr, "%s: failed to read property %s\n", + __func__, key); + return -1; + } + } + + { + const int ci = fgetc(f); + + if (ferror(f) || ci != '=') + { + fprintf(stderr, "%s: expected '=' on property %s\n", + __func__, key); + return -1; + } + } + + { + static const char exp[] = "1"; + char str[sizeof exp]; + + for (char *c = str; c - str < sizeof str; c++) + { + const int ci = fgetc(f); + + if (ferror(f) || ci == EOF) + { + fprintf(stderr, "%s: could not read value for property %s\n", + __func__, key); + return -1; + } + + *c = ci; + } + + errno = 0; + const unsigned long out = strtoul(str, NULL, 10); + + if (errno || (out != 0 && out != 1)) + { + fprintf(stderr, "%s: unexpected value for property %s: %lu\n", + __func__, key, out); + return -1; + } + + *value = out; + } + + return 0; +} -- cgit v1.2.3