Last Update: Nov.17,2006

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」でコンパイル出来ます。

■ ファイルの16進ダンプ

/*  mydump.c : ファイルの16進ダンプ
 *
 *  Copyright (c) 2000, 2006 AOK. 
 *  
 *      2000.04.13 - 初版
 *      2006.11.17 - 2版
 *      
 *      使い方: MYDUMP ファイル名
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifndef LSI_C /* Borland C++ 5.5 */
    #include <conio.h>
    #include <mbctype.h>
    #include <mbstring.h>
    #define chkctype(x, y)  _mbbtype(x, y)
    #define CT_ANK          _MBC_SINGLE
    #define CT_KJ1          _MBC_LEAD
    #define CT_KJ2          _MBC_TRAIL
    #define CT_ILGL         _MBC_ILLEGAL
    #define iskana(c)       _ismbbkana(c)
#else /* LSI C-86 */
    #include <jctype.h>
#endif

FILE *fin;      /* ファイルポインタ */
long pos = 0;   /* ファイルの現在位置 */
int mode = 0;   /* chkctype が返す値 */

void fillchar(char c, int n)
{
    while (n-- > 0) putchar(c);
}

void title(void)
{
    puts("**************************************************************************");
    puts("*     MYDUMP : 16進ダンプツール        Copyright (c) 2000, 2006 AOK.     *");
    puts("**************************************************************************");
}

int readline(void)
{
    unsigned char buf[18], str[80], byte[4];
    int n, i, f = 0;
    if ((n = fread(&buf, sizeof(char), 17, fin)) == 0)
        return 0;
    buf[n] = '\0';
    if (mode == CT_KJ1) f = 1; 
    sprintf(str, "%08X  ", pos);
    for (i = 0; i < min(n, 16); i++) {
        sprintf(byte, "%02X ", buf[i]);
        strcat(str, byte);
    }
    for (i = 0; i < min(n, 16); i++) {
        mode = chkctype(buf[i], mode);
        switch (mode) {
            case CT_ANK:
                if (!isprint(buf[i]) && !iskana(buf[i])) buf[i] = '.';
                break;
            case CT_ILGL:
                buf[i] = '.';
                break;
            default:
                break;
        }
    }
    if (mode != CT_KJ1) buf[16] = '\0';
    printf(str);
    if (n < 16) fillchar(' ', (16-n)*3);
    if (f) buf[0] = ' ';   
    puts(buf);
    fseek(fin, pos += 16, SEEK_SET);
    return n;
}

void dumploop(void)
{
    unsigned char ch;
    int i;
    while (1) {
        title();
        for (i = 0; i < 20; i++) {
            if (readline() == 0) {
                fillchar('\n', 17-i);
                return;
            }
        }
        printf("\n>選択して下さい. [ <Enter>:次頁  Q:終了 ]");
        while (1) {
            ch = getch();
            if (ch == 'Q' || ch == 'q')
                return;
            else if (ch == 0x0D)
                break;
        }
        printf("\n\n");
    }
}

int main(int argc, char **argv)
{
    if (argc != 2) {
        title();
        puts("\n【コマンドライン】 MYDUMP ファイル名");
        return 0;
    }

    if ((fin = fopen(*(argv+1), "rb")) != NULL) {
        dumploop();
        fclose(fin);
        puts("\n>16進ダンプ終了.");
    } else {
        title();
        fprintf(stderr, "\n エラー: %s を開けません.\n", *(argv+1));
    }
    
    return 0;
}