sprites 256c, shadow oam, sprite transforms, sinlut
[gbajam21] / tools / mmutil / files.c
1 /****************************************************************************
2  *                                                          __              *
3  *                ____ ___  ____ __  ______ ___  ____  ____/ /              *
4  *               / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __  /               *
5  *              / / / / / / /_/ />  </ / / / / / /_/ / /_/ /                *
6  *             /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/                 *
7  *                                                                          *
8  *         Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org)         *
9  *                                                                          *
10  * Permission to use, copy, modify, and/or distribute this software for any *
11  * purpose with or without fee is hereby granted, provided that the above   *
12  * copyright notice and this permission notice appear in all copies.        *
13  *                                                                          *
14  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
15  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF         *
16  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR  *
17  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   *
18  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN    *
19  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF  *
20  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.           *
21  ****************************************************************************/
22
23 #include "defs.h"
24 #include "files.h"
25
26 FILE *fin;
27 FILE *fout;
28
29 int file_byte_count;
30
31 bool file_exists( char* filename )
32 {
33         fin = fopen( filename, "rb" );
34         if( !fin )
35                 return false;
36         file_close_read();
37         return true;
38 }
39
40 int file_size( char* filename )
41 {
42         FILE* f;
43         int a;
44         f = fopen( filename, "rb" );
45         if( !f )
46                 return 0;
47         fseek( f, 0, SEEK_END );
48         a = ftell( f );
49         fclose( f );
50         return a;
51 }
52
53 int file_open_read( char* filename )
54 {
55         fin = fopen( filename, "rb" );
56         if( !fin )
57                 return FILE_OPEN_ERROR;
58         return FILE_OPEN_OKAY;
59 }
60
61 int file_open_write( char* filename )
62 {
63         fout = fopen( filename, "wb" );
64         if( !fout )
65                 return FILE_OPEN_ERROR;
66         return FILE_OPEN_OKAY;
67 }
68
69 int file_open_write_end( char* filename )
70 {
71         fout = fopen( filename, "r+b" );
72         if( !fout )
73                 return FILE_OPEN_ERROR;
74         fseek( fout, 0, SEEK_END );
75         return FILE_OPEN_OKAY;
76 }
77
78 void file_close_read( void )
79 {
80         fclose( fin );
81 }
82
83 void file_close_write( void )
84 {
85         fclose( fout );
86 }
87
88 int file_seek_read( int offset, int mode )
89 {
90         return fseek( fin, offset, mode );
91 }
92
93 int file_seek_write( int offset, int mode )
94 {
95         return fseek( fout, offset, mode );
96 }
97
98 int file_tell_read( void )
99 {
100         return ftell( fin );
101 }
102
103 int file_tell_write( void )
104 {
105         return ftell( fout );
106 }
107
108 int file_tell_size( void )
109 {
110         int pos = ftell(fin);
111         fseek( fin, 0, SEEK_END );
112         int size = ftell(fin);
113         fseek(fin, pos, SEEK_SET );
114         return size;
115 }
116
117 u8 read8( void )
118 {
119         u8 a;
120         fread( &a, 1, 1, fin );
121         return a;
122 }
123
124 u16 read16( void )
125 {
126         u16 a;
127         a  =    read8();
128         a |=    ((u16)read8()) << 8;
129         return a;
130 }
131
132 u32 read24( void )
133 {
134         u32 a;
135         a  =    read8();
136         a |=    ((u32)read8())<<8;
137         a |=    ((u32)read8())<<16;
138         return a;
139 }
140
141 u32 read32( void )
142 {
143         u32 a;
144         a  =    read16();
145         a |=    ((u32)read16()) << 16;
146         return a;
147 }
148
149 u8 read8f( FILE* p_fin )
150 {
151         u8 a;
152         fread( &a, 1, 1, p_fin );
153         return a;
154 }
155
156 u16 read16f( FILE* p_fin )
157 {
158         u16 a;
159         a  =    read8f( p_fin );
160         a |=    ((u16)read8f( p_fin )) << 8;
161         return a;
162 }
163
164 u32 read32f( FILE* p_fin )
165 {
166         u32 a;
167         a  =    read16f( p_fin );
168         a |=    ((u32)read16f( p_fin )) << 16;
169         return a;
170 }
171
172 void write8( u8 p_v )
173 {
174         fwrite( &p_v, 1, 1, fout );
175         file_byte_count++;
176 }
177
178 void write16( u16 p_v )
179 {
180         write8( (u8)(p_v & 0xFF) );
181         write8( (u8)(p_v >> 8) );
182         file_byte_count += 2;
183 }
184
185 void write24( u32 p_v )
186 {
187         write8( (u8)(p_v & 0xFF) );
188         write8( (u8)((p_v >> 8) & 0xFF) );
189         write8( (u8)((p_v >> 16) & 0xFF) );
190         file_byte_count += 3;
191 }
192
193 void write32( u32 p_v )
194 {
195         write16( (u16)(p_v & 0xFFFF) );
196         write16( (u16)(p_v >> 16) );
197         file_byte_count += 4;
198 }
199
200 void align16( void )
201 {
202         if( ftell( fout ) & 1 )
203                 write8( BYTESMASHER );
204 }
205
206 void align32( void )
207 {
208         if( ftell( fout ) & 3 )
209                 write8( BYTESMASHER );
210         if( ftell( fout ) & 3 )
211                 write8( BYTESMASHER );
212         if( ftell( fout ) & 3 )
213                 write8( BYTESMASHER );
214 }
215
216 void align32f( FILE* p_file )
217 {
218         if( ftell( p_file ) & 3 )
219                 write8( BYTESMASHER );
220         if( ftell( p_file ) & 3 )
221                 write8( BYTESMASHER );
222         if( ftell( p_file ) & 3 )
223                 write8( BYTESMASHER );
224 }
225
226 void skip8( u32 count )
227 {
228         fseek( fin, count, SEEK_CUR );
229 //      while( count )
230 //      {
231 //              //read8();
232 //              count--;
233 //      }
234 }
235
236 void skip8f( u32 count, FILE* p_file )
237 {
238         fseek( p_file, count, SEEK_CUR );
239 //      while( count )          // this was a major slowdown!
240 //      {
241 //              //read8f( p_file );     
242 //              
243 //              count--;
244 //      }
245 }
246  
247 void file_delete( char* filename )
248 {
249         if( file_exists( filename ) )
250                 remove( filename );
251 }
252
253 int file_get_byte_count( )
254 {
255         int a = file_byte_count;
256         file_byte_count = 0;
257         return a;
258 }