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; +} | 
