水無瀬の部屋 > Programming > sample > exe2ico > exe2riff.cpp |
---|
1: //*********************************************************
2: // プロジェクト: exe2ico
3: // ファイル名: exe2riff.cpp
4: //*********************************************************
5: #include "exe2riff.h"
6: #include "cmdline.h"
7: #include "util.h"
8:
9:
10: //---------------------------------------------------------
11: // マクロ の 定義
12: //---------------------------------------------------------
13: #define DWORDALIGN(n) (((n) + 3) & (~3))
14: #define EXT_AVI ".avi"
15: #define EXT_WAV ".wav"
16: #define EXT_ANI ".ani"
17: #define TAG_RIFF "RIFF"
18: #define TAG_AVI "AVI "
19: #define TAG_WAV "WAVE"
20: #define TAG_ANI "ACON"
21: #define TYPE_AVI ( 1 )
22: #define TYPE_WAV ( 2 )
23: #define TYPE_ANI ( 3 )
24:
25:
26: //---------------------------------------------------------
27: // ファイルスコープ変数 の 定義
28: //---------------------------------------------------------
29: static const struct { char *tag; int type; char *ext; DWORD flag; } g_pair[] =
30: {
31: { TAG_AVI, TYPE_AVI, EXT_AVI, FLAG_NOAVI },
32: { TAG_WAV, TYPE_WAV, EXT_WAV, FLAG_NOWAV },
33: { TAG_ANI, TYPE_ANI, EXT_ANI, FLAG_NOANI },
34: };
35:
36:
37: //---------------------------------------------------------
38: // ファイルスコープ関数 の 宣言
39: //---------------------------------------------------------
40: static bool FindRiff( FILE *fr, int *read_byte );
41: static void *LoadRiff( FILE *fr, int *size, int *type, int max_size );
42: static bool IsValidRiffType( int rifftype );
43:
44:
45: //*********************************************************
46: // exe2riff
47: //*********************************************************
48: bool
49: exe2riff
50: (
51: const char *filename,
52: DWORD flags
53: )
54: {
55: // パラメタの仮定
56: ASSERT( IsPathExist( filename ) );
57:
58: const DWORD filesize = fsize( filename, null );
59: FILE *fr = fopen( filename, "rb" );
60: if ( !fr )
61: return false;
62:
63: int read_byte = 0;
64: int count[numof(g_pair)];
65: memzero( count, sizeof(count) );
66: while( FindRiff( fr, &read_byte ) )
67: {
68: const long pos = ftell( fr );
69:
70: int type, size;
71: void *riff = LoadRiff( fr, &size, &type, filesize-read_byte );
72: if ( riff )
73: {
74: for( int i = 0; i < numof(g_pair); i++ )
75: {
76: if ( (type == g_pair[i].type) && (0 == (flags & g_pair[i].flag)) )
77: {
78: if ( OutputResourceFile( riff, size, filename, g_pair[i].ext, count[i] ) )
79: count[i]++;
80: }
81: }
82: free( riff );
83: }
84:
85: VERIFY( 0 == fseek( fr, pos, SEEK_SET ) );
86: }
87: VERIFY( 0 == fclose( fr ) );
88: return true;
89: }//exe2riff
90:
91:
92: //******************************************************************************************************************
93: // private
94: //******************************************************************************************************************
95: static int GetRiffType( const BYTE *type );
96:
97:
98: //*********************************************************
99: // FindRiff
100: //*********************************************************
101: static
102: bool
103: FindRiff
104: (
105: FILE *fr,
106: int *read_byte
107: )
108: {
109: // パラメタの仮定
110: ASSERT( IsValidFilePtr( fr ) );
111:
112: int c;
113: int iMatch = 0;
114: while( EOF != (c = fgetc(fr)) )
115: {
116: //
117: (*read_byte)++;
118:
119: //
120: if ( c == TAG_RIFF[iMatch] )
121: {
122: if ( 4 <= ++iMatch )
123: {
124: return true;
125: }
126: }
127: else
128: {
129: iMatch = 0;
130: if ( c == TAG_RIFF[iMatch] )
131: iMatch++;
132: }
133: }
134: return false;
135: }//FindRiff
136:
137: //*********************************************************
138: // LoadRiff
139: //*********************************************************
140: static
141: void *
142: LoadRiff
143: (
144: FILE *fr,
145: int *size,
146: int *type,
147: int max_size
148: )
149: {
150: // パラメタの仮定
151: ASSERT( (0 < max_size) && (max_size < INT_MAX) );
152: ASSERT( IsValidFilePtr( fr ) );
153: ASSERT( IsValidPtr( size, sizeof(int) ) );
154: ASSERT( IsValidPtr( type, sizeof(int) ) );
155:
156: //
157: *size = 0;
158: *type = -1;
159:
160: //
161: BYTE buffer[8];
162: if ( 8 != fread( buffer, 1, 8, fr ) )
163: return null;
164:
165: //
166: int datasize = ( buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24) );
167: datasize = DWORDALIGN( datasize );
168: if ( (datasize <= 0) || (max_size < datasize) || (INT_MAX <= datasize) )
169: return null;
170:
171: //
172: const int rifftype = GetRiffType( 4 + buffer );
173: if ( !IsValidRiffType( rifftype ) )
174: return null;
175:
176: //
177: const int filesize = /*4 + */8 + datasize;
178: BYTE *data = (BYTE *)malloc( filesize );
179: if ( !data ) return null;
180: memzero( data, filesize );
181:
182: //
183: memmove( data, "RIFF", 4 ); //
184: memmove( 4 + data, buffer, 4 ); // size
185: memmove( 8 + data, 4 + buffer, 4 ); // TYPE
186: // if ( datasize != (int)fread( 12 + data, 1, datasize, fr ) ) // 計算が微妙
187: if ( datasize-8 > (int)fread( 12 + data, 1, datasize-4, fr ) ) // 計算が微妙
188: // if ( datasize-8 != (int)fread( 12 + data, 1, datasize-8, fr ) ) // 計算が微妙
189: {
190: free( data );
191: return null;
192: }
193:
194: //
195: *type = rifftype;
196: *size = filesize;
197: return data;
198: }//LoadRiff
199:
200: //*********************************************************
201: // GetRiffType
202: //*********************************************************
203: static
204: int
205: GetRiffType
206: (
207: const BYTE *tag
208: )
209: {
210: // パラメタの仮定
211: ASSERT( IsValidReadPtr( tag, 4 ) );
212:
213: {for( int i = 0; i < numof(g_pair); i++ )
214: {
215: if ( 0 == memcmp(tag, g_pair[i].tag, 4) )
216: return g_pair[i].type;
217: }}
218:
219: return -1;
220: }//GetRiffType
221:
222: //*********************************************************
223: // IsValidRiffType
224: //*********************************************************
225: static
226: bool
227: IsValidRiffType
228: (
229: int rifftype
230: )
231: {
232: {for( int i = 0; i < numof(g_pair); i++ )
233: {
234: if ( rifftype == g_pair[i].type )
235: return true;
236: }}
237:
238: return false;
239: }//IsValidRiffType
240:
241:
242: //** end **
参照:
水無瀬の部屋 > sample > exe2ico > exe2riff.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/exe2ico/exe2riff_cpp.shtml
同人ダウンロード販売|DL.Getchu.com