diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/mex.c | 86 |
3 files changed, 89 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1d0015f --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +bin/mex: src/mex.c + gcc $^ -o $@ 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; +} |