水無瀬の部屋 > Programming > sample > dumptext > dumptext.cpp |
---|
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 **
参照:
水無瀬の部屋 > sample > dumptext > dumptext.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/dumptext/dumptext_cpp.shtml