FreeCalypso > hg > ice1-trau-tester
diff ater/read_file.c @ 20:5405c1573027
ater: implement file reading
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 24 Jun 2024 08:50:29 +0000 |
parents | |
children | db39e8855f3d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ater/read_file.c Mon Jun 24 08:50:29 2024 +0000 @@ -0,0 +1,98 @@ +/* + * Here we implement the function that reads binary files + * in our ad hoc format for TRAU testing. + */ + +#include <sys/types.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <stdint.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "read_file.h" + +static int check_magic(const uint8_t *buf, unsigned nframes, bool *got_fr, + bool *got_efr) +{ + unsigned n; + + for (n = 0; n < nframes; n++) { + switch (*buf & 0xF0) { + case 0xC0: + *got_efr = true; + break; + case 0xD0: + *got_fr = true; + break; + default: + return -1; + } + buf += 34; + } + return 0; +} + +int read_binary_file(const char *filename, bool is_efr, uint8_t **bufret, + unsigned *size_ret) +{ + int fd, rc; + struct stat st; + uint8_t *buf; + unsigned nframes; + bool got_fr, got_efr; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror(filename); + return -1; + } + fstat(fd, &st); + if (!S_ISREG(st.st_mode)) { + close(fd); + fprintf(stderr, "error: %s is not a regular file\n", filename); + return -1; + } + if (!st.st_size) { + close(fd); + fprintf(stderr, "error: %s is an empty file\n", filename); + return -1; + } + if (st.st_size % 34) { + close(fd); + fprintf(stderr, + "error: size of %s is not a multiple of 34 bytes\n", + filename); + return -1; + } + buf = malloc(st.st_size); + if (!buf) { + close(fd); + fprintf(stderr, "unable to malloc buffer for %s\n", filename); + return -1; + } + read(fd, buf, st.st_size); + close(fd); + nframes = st.st_size / 34; + + got_fr = false; + got_efr = false; + rc = check_magic(buf, nframes, &got_fr, &got_efr); + if (rc < 0 || got_fr && got_efr) { + free(buf); + fprintf(stderr, "error: %s is not a valid TRAU-UL test file\n", + filename); + return -1; + } + if (is_efr != got_efr) { + free(buf); + fprintf(stderr, "error: %s is for the wrong codec\n", filename); + return -1; + } + *bufret = buf; + *size_ret = nframes; + return 0; +}