// Hdump
// Written by Nils Liaaen Corneliusen. Revised 2026.
// Info here: https://ignorantus.com/news/2026/#10-July-2026
// License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)
#include <stdio.h>
#include <string.h>

#define CNT 16

int main( int argc, char *argv[] )
{
    if( argc > 1 && !strcmp( argv[1], "-h" ) ) {
        printf( "Usage: %s <filename>\n", argv[0] );
        return 0;
    }

    FILE *fp = argc > 1 ? fopen( argv[1], "rb" ) : stdin;
    if( fp == NULL ) {
        printf( "Can't open %s!\n", argv[1] );
        return 1;
    }

    unsigned int offset = 0;
    while( 1 ) {
        unsigned char buf[CNT];
        int bytes = (int)fread( buf, 1, CNT, fp );
        if( bytes == 0 ) break;

        printf( "%08x ", offset );

        for( int i = 0; i < CNT; i++ )
            printf( i < bytes ? "%02x " : "   ", buf[i] );

        for( int i = 0; i < CNT; i++ )
            printf( i < bytes ? "%c" : " ", buf[i] >= 32 && buf[i] <= 126 ? buf[i] : '.' );

        printf( "\n" );
        offset += bytes;
    }
    printf( "%08x\n", offset );

    if( fp != stdin ) fclose( fp );
    return 0;
}
