[PR]

水無瀬の部屋 > Programming > sample > dumptext > dumptext.cpp
最終更新日: 2007/03/29

   1: //*********************************************************
   2: // プロジェクト: dumptext
   3: //   ファイル名: dumptext.cpp
   4: //*********************************************************
   5: #include "dumptext.h"
   6: #include "mainbox.h"
   7: 
   8: 
   9: //---------------------------------------------------------
  10: // マクロ の 定義
  11: //---------------------------------------------------------
  12: #define HEAD_ADDRPART  "  address "
  13: #define HEAD_BYTEPART  "+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"
  14: #define HEAD_TEXTPART  "0123456789ABCDEF"
  15: #define iskana(c)      ((0xA1 <= (static_cast<unsigned char>(c))) && ((static_cast<unsigned char>(c)) <= 0xDF))
  16: 
  17: 
  18: //---------------------------------------------------------
  19: // ファイルスコープ関数 の 宣言
  20: //---------------------------------------------------------
  21: static bool dump( FILE *fw, FILE *fr, long start, long stop );
  22: 
  23: 
  24: //*********************************************************
  25: // ApplicationMainProc
  26: // dumptext のメイン関数
  27: // アプリケーション dumptext を起動する
  28: // アプリケーションの終了コードを返す
  29: //*********************************************************
  30: int
  31: ApplicationMainProc
  32: 	(
  33: 		HINSTANCE   hInstance,
  34: 		int         argc,
  35: 		char      **argv
  36: 	)
  37: {
  38: 	// パラメタの仮定
  39: 	ASSERT( IsValidInstanceHandle( hInstance ) );
  40: 	ASSERT( IsValidArgcArgv( argc, argv ) );
  41: 	ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
  42: 
  43: 	DUMPTEXT_t dt;
  44: 	memzero( &dt, sizeof( dt ) );
  45: 	dt.start = 0;
  46: 	dt.stop  = SHRT_MAX;
  47: 	if ( !MainBox( &dt ) )
  48: 	{
  49: 		return 0;
  50: 	}
  51: 
  52: 	ASSERT( IsValidLocalPathString( dt.datafile ) );
  53: 	ASSERT( IsValidLocalPathString( dt.dumpfile ) );
  54: 	if ( streqli( dt.datafile, dt.dumpfile ) )
  55: 	{
  56: 		return 0;
  57: 	}
  58: 
  59: 	FILE *fr = fopen( dt.datafile, "rb" );
  60: 	if ( fr )
  61: 	{
  62: 		FILE *fw = fopen( dt.dumpfile, "w" );
  63: 		if ( fw )
  64: 		{
  65: 			VERIFY( dump( fw, fr, dt.start, dt.stop ) );
  66: 			VERIFY( 0 == fclose( fw ) );
  67: 		}
  68: 		VERIFY( 0 == fclose( fr ) );
  69: 	}
  70: 
  71: 	return 0;
  72: }//ApplicationMainProc
  73: 
  74: 
  75: //******************************************************************************************************************
  76: // private
  77: //******************************************************************************************************************
  78: static bool dump_head( FILE *fw );
  79: static bool dump_body( FILE *fw, FILE *fr, long start, long stop );
  80: 
  81: 
  82: //*********************************************************
  83: // dump
  84: //   fw    出力先
  85: //   fr    読み込み元
  86: //   start 読み込み元のダンプ開始アドレス(16バイト単位)
  87: //   stop  読み込み元のダンプ終了アドレス
  88: //*********************************************************
  89: static
  90: bool
  91: dump
  92: 	(
  93: 		FILE *fw,
  94: 		FILE *fr,
  95: 		long  start,
  96: 		long  stop
  97: 	)
  98: {
  99: 	// パラメタの仮定
 100: 	ASSERT( IsValidFilePtr( fw ) );
 101: 	ASSERT( IsValidFilePtr( fr ) );
 102: 	ASSERT( 0 <= start );
 103: 	ASSERT( 0 <= stop  );
 104: 
 105: 	VERIFY( dump_head( fw ) );
 106: 	VERIFY( dump_body( fw, fr, start, stop ) );
 107: 
 108: 	return true;
 109: }//dump
 110: 
 111: 
 112: //******************************************************************************************************************
 113: // private - dump_head
 114: //******************************************************************************************************************
 115: static bool dump_head_addr_part( FILE *fw );
 116: static bool dump_head_byte_part( FILE *fw );
 117: static bool dump_head_text_part( FILE *fw );
 118: 
 119: 
 120: //*********************************************************
 121: // dump_head
 122: // ダンプのヘッダ
 123: //   fw    出力先
 124: //*********************************************************
 125: static
 126: bool
 127: dump_head
 128: 	(
 129: 		FILE *fw
 130: 	)
 131: {
 132: 	// パラメタの仮定
 133: 	ASSERT( IsValidFilePtr( fw ) );
 134: 
 135: 	VERIFY( dump_head_addr_part( fw ) );
 136: 	VERIFY( 0 <= fputs( "\t", fw ) );
 137: 	VERIFY( dump_head_byte_part( fw ) );
 138: 	VERIFY( 0 <= fputs( "\t", fw ) );
 139: 	VERIFY( dump_head_text_part( fw ) );
 140: 	VERIFY( 0 <= fputs( "\n", fw ) );
 141: 
 142: 	return true;
 143: }//dump_head
 144: 
 145: //*********************************************************
 146: // dump_head_addr_part
 147: //   fw    出力先
 148: //*********************************************************
 149: static
 150: bool
 151: dump_head_addr_part
 152: 	(
 153: 		FILE *fw
 154: 	)
 155: {
 156: 	// パラメタの仮定
 157: 	ASSERT( IsValidFilePtr( fw ) );
 158: 
 159: 	return 0 <= fputs( HEAD_ADDRPART, fw );
 160: }//dump_head_addr_part
 161: 
 162: //*********************************************************
 163: // dump_head_byte_part
 164: //   fw    出力先
 165: //*********************************************************
 166: static
 167: bool
 168: dump_head_byte_part
 169: 	(
 170: 		FILE *fw
 171: 	)
 172: {
 173: 	// パラメタの仮定
 174: 	ASSERT( IsValidFilePtr( fw ) );
 175: 
 176: 	return 0 <= fputs( HEAD_BYTEPART, fw );
 177: }//dump_head_byte_part
 178: 
 179: //*********************************************************
 180: // dump_head_text_part
 181: //   fw    出力先
 182: //*********************************************************
 183: static
 184: bool
 185: dump_head_text_part
 186: 	(
 187: 		FILE *fw
 188: 	)
 189: {
 190: 	// パラメタの仮定
 191: 	ASSERT( IsValidFilePtr( fw ) );
 192: 
 193: 	return 0 <= fputs( HEAD_TEXTPART, fw );
 194: }//dump_head_text_part
 195: 
 196: //******************************************************************************************************************
 197: // private - dump_body
 198: //******************************************************************************************************************
 199: static bool dump_body_line( FILE *fw, const BYTE *buffer, size_t size, size_t addr );
 200: static bool dump_body_addr_part( FILE *fw, const size_t addr );
 201: static bool dump_body_byte_part( FILE *fw, const BYTE *buffer, size_t size );
 202: static bool dump_body_text_part( FILE *fw, const BYTE *buffer, size_t size );
 203: 
 204: 
 205: //*********************************************************
 206: // dump_body
 207: //   fw    出力先
 208: //   fr    読み込み元
 209: //   start 読み込み元のダンプ開始アドレス(16バイト単位)
 210: //   stop  読み込み元のダンプ終了アドレス
 211: //*********************************************************
 212: static
 213: bool
 214: dump_body
 215: 	(
 216: 		FILE *fw,
 217: 		FILE *fr, 
 218: 		long  start,
 219: 		long  stop
 220: 	)
 221: {
 222: 	// パラメタの仮定
 223: 	ASSERT( IsValidFilePtr( fw ) );
 224: 	ASSERT( IsValidFilePtr( fr ) );
 225: 	ASSERT( 0 <= start );
 226: 	ASSERT( 0 <= stop  );
 227: 
 228: 	//
 229: 	start = (start & ~0x0F);
 230: 	VERIFY( 0 == fseek( fr, start, SEEK_SET ) );
 231: 
 232: 	// ファイルイメージの16進表示
 233: 	size_t size;                // 読み込んだデータのサイズ(バイト単位)
 234: 	BYTE buffer[ 16 ];          // 読み込んだデータ
 235: 	{for( size_t addr = start;  // データの読み込み位置(バイト単位)
 236: 		(addr < static_cast<size_t>( stop )) && (0 < (size = fread( buffer, 1, sizeof(buffer), fr )));
 237: 		addr+= size )
 238: 	{
 239: 		ASSERT( (0 <= addr) && (addr < static_cast<size_t>( stop )) );
 240: 
 241: 		VERIFY( dump_body_line( fw, buffer, size, addr ) );
 242: 	}}
 243: 
 244: 	return true;
 245: }//dump_body
 246: 
 247: //*********************************************************
 248: // dump_body_line
 249: //   fw     出力先
 250: //   buffer 出力データ
 251: //   size   データサイズ
 252: //   addr   データの存在位置
 253: //*********************************************************
 254: static
 255: bool
 256: dump_body_line
 257: 	(
 258: 		      FILE   *fw,
 259: 		const BYTE   *data,
 260: 		      size_t  size,
 261: 		      size_t  addr
 262: 	)
 263: {
 264: 	// パラメタの仮定
 265: 	ASSERT( IsValidFilePtr( fw ) );
 266: 	ASSERT( (0 < size) && (size <= 16) );
 267: 	ASSERT( IsValidReadPtr( data, size ) );
 268: 
 269: 	VERIFY( dump_body_addr_part( fw, addr ) );
 270: 	VERIFY( dump_body_byte_part( fw, data, size ) );
 271: 	VERIFY( dump_body_text_part( fw, data, size ) );
 272: 	VERIFY( 0 <= fputs( "\n", fw ) );
 273: 
 274: 	return true;
 275: }//dump_body_line
 276: 
 277: //*********************************************************
 278: // dump_body_addr_part
 279: //   fw   出力先
 280: //   addr アドレス
 281: //*********************************************************
 282: static
 283: bool
 284: dump_body_addr_part
 285: 	(
 286: 		FILE   *fw,
 287: 		size_t  addr
 288: 	)
 289: {
 290: 	// パラメタの仮定
 291: 	ASSERT( IsValidFilePtr( fw ) );
 292: 
 293: 	return 0 <= fprintf( fw, "0x%08IX\t", addr );
 294: }//dump_body_addr_part
 295: 
 296: //*********************************************************
 297: // dump_body_byte_part
 298: //   fw     出力先
 299: //   buffer 出力データ
 300: //   size   データサイズ
 301: //*********************************************************
 302: static
 303: bool
 304: dump_body_byte_part
 305: 	(
 306: 		      FILE   *fw,
 307: 		const BYTE   *data,
 308: 		      size_t  size
 309: 	)
 310: {
 311: 	// パラメタの仮定
 312: 	ASSERT( IsValidFilePtr( fw ) );
 313: 	ASSERT( (0 < size) && (size <= 16) );
 314: 	ASSERT( IsValidReadPtr( data, size ) );
 315: 
 316: 	//
 317: 	int pos = 0; // 出力位置
 318: 	const char *separator = ""; // バイトとバイトの区切り
 319: 	{for( ; 0 < size; --size )
 320: 	{
 321: 		const int c = *data++;
 322: 		const int n = fprintf( fw, "%s%02X", separator, c );
 323: 		pos += n;
 324: 		
 325: 		separator = " ";
 326: 	}}
 327: 
 328: 	//
 329: 	const size_t space = strlen( HEAD_BYTEPART ) - pos;
 330: 	fprintf( fw, "%*s\t", space, "" );
 331: 
 332: 	return true;
 333: }//dump_body_byte_part
 334: 
 335: //*********************************************************
 336: // dump_body_text_part
 337: //   fw    出力先
 338: //   data  出力データ
 339: //   size  データサイズ
 340: //*********************************************************
 341: static
 342: bool
 343: dump_body_text_part
 344: 	(
 345: 		      FILE   *fw,
 346: 		const BYTE   *data,
 347: 		      size_t  size
 348: 	)
 349: {
 350: 	// パラメタの仮定
 351: 	ASSERT( IsValidFilePtr( fw ) );
 352: 	ASSERT( (0 < size) && (size <= 16) );
 353: 	ASSERT( IsValidReadPtr( data, size ) );
 354: 
 355: 	//
 356: 	int jms  = 0; // jms の シフト状態(0=非シフト状態; 1=シフト状態;)
 357: 	int lead = 0; // jms の 先行バイト
 358: 	{for( ; 0 < size; --size )
 359: 	{
 360: 		const int c = *data++;
 361: 		if      ( (0 == jms) && isprint( c ) ) { fputc( c, fw );                     jms = 0; lead = 0; }
 362: 		else if ( (0 == jms) &&  iskana( c ) ) { fputc( c, fw );                     jms = 0; lead = 0; }
 363: 		else if ( (0 == jms) &&    jms1( c ) ) {                                     jms = 1; lead = c; }
 364: 		else if (  0 == jms                  ) { fputc( '.', fw );                   jms = 0; lead = 0; }
 365: 		else if ( (1 == jms) &&    jms2( c ) ) { fputjms( MAKEDBC(lead, c), fw );    jms = 0; lead = 0; }
 366: 		else if (  1 == jms                  ) { fputc( '.', fw ); fputc( '.', fw ); jms = 0; lead = 0; }
 367: 		else { UNREACHCODE( "遷移表に漏れ!" ); }  
 368: 
 369: 		ASSERT( ((0 == jms) && (0 == lead))
 370: 		     || ((0 != jms) && (0 != lead)) );
 371: 	}}
 372: 	ASSERT( 0 == size );
 373: 
 374: 	//
 375: 	if ( 1 == jms )
 376: 	{
 377: 		fputc( '.', fw );
 378: 	}
 379: 
 380: 	return true;
 381: }//dump_body_text_part
 382: 
 383: 
 384: //** end **

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > dumptext > dumptext.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/dumptext/dumptext_cpp.shtml
『新妻LOVELY×CATION』を応援しています!