diff options
author | Ian Moffett <industrial.reformer@gmail.com> | 2024-04-12 20:20:54 -0400 |
---|---|---|
committer | Ian Moffett <industrial.reformer@gmail.com> | 2024-04-12 20:20:54 -0400 |
commit | cbd974f40ecc75a8573d27e890ee34c060372416 (patch) | |
tree | 0467d50627dbb33995f2e5fe2b04e9544612ad0b /src/mex.c |
Initial commit
Signed-off-by: Ian Moffett <industrial.reformer@gmail.com>
Diffstat (limited to 'src/mex.c')
-rw-r--r-- | src/mex.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/mex.c b/src/mex.c new file mode 100644 index 0000000..2c0af0c --- /dev/null +++ b/src/mex.c @@ -0,0 +1,86 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <unistd.h> + +#define LINE_LEN 16 + +static void +dump_line(const char *line, size_t len) +{ + /* The amount of bytes we write */ + const uint8_t BYTE_COUNT = 2; + + for (size_t i = 0; i < LINE_LEN; ++i) { + /* Add padding if needed */ + if (i >= (len*BYTE_COUNT)+1) { + printf(" "); + continue; + } + + if (i >= len) { + /* Don't print any more bytes */ + continue; + } + + printf("%02X", line[i] & 0xFF); + if (((i + 1) % BYTE_COUNT) == 0) { + printf(" "); + } + } + + printf(" "); + for (size_t i = 0; i < len; ++i) { + if (line[i] > 31 && line[i] < 127) { + printf("%c", line[i]); + } else { + printf("."); + } + } + + printf("\n"); +} + +static void +dump_file(FILE *fp) +{ + char *buf = malloc(LINE_LEN * sizeof(char)); + ssize_t count; + size_t offset = 0; + + for (;;) { + count = fread(buf, sizeof(char), LINE_LEN, fp); + if (count <= 0) { + break; + } + + printf("%08X: ", offset); + offset += LINE_LEN*2; + dump_line(buf, count); + } + + free(buf); +} + +int +main(int argc, char **argv) +{ + FILE *fp; + + if (argc < 2 || argc > 2) { + printf("Usage: %s <filename>\n", argv[0]); + return 1; + } + + fp = fopen(argv[1], "rb"); + + if (fp == NULL) { + perror("fopen"); + return -1; + } + + dump_file(fp); + fclose(fp); + + return 0; +} |