■ ファイルの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;
}