@@ -106,22 +106,15 @@ void mpack_reader_set_skip(mpack_reader_t* reader, mpack_reader_skip_t skip) {
106
106
}
107
107
108
108
#if MPACK_STDIO
109
- typedef struct mpack_file_reader_t {
110
- FILE * file ;
111
- char buffer [MPACK_BUFFER_SIZE ];
112
- } mpack_file_reader_t ;
113
-
114
109
static size_t mpack_file_reader_fill (mpack_reader_t * reader , char * buffer , size_t count ) {
115
- mpack_file_reader_t * file_reader = (mpack_file_reader_t * )reader -> context ;
116
- return fread ((void * )buffer , 1 , count , file_reader -> file );
110
+ return fread ((void * )buffer , 1 , count , (FILE * )reader -> context );
117
111
}
118
112
119
113
#if !MPACK_OPTIMIZE_FOR_SIZE
120
114
static void mpack_file_reader_skip (mpack_reader_t * reader , size_t count ) {
121
- mpack_file_reader_t * file_reader = (mpack_file_reader_t * )reader -> context ;
122
115
if (mpack_reader_error (reader ) != mpack_ok )
123
116
return ;
124
- FILE * file = file_reader -> file ;
117
+ FILE * file = ( FILE * ) reader -> context ;
125
118
126
119
// We call ftell() to test whether the stream is seekable
127
120
// without causing a file error.
@@ -142,36 +135,40 @@ static void mpack_file_reader_skip(mpack_reader_t* reader, size_t count) {
142
135
#endif
143
136
144
137
static void mpack_file_reader_teardown (mpack_reader_t * reader ) {
145
- mpack_file_reader_t * file_reader = (mpack_file_reader_t * )reader -> context ;
138
+ FILE * file = (FILE * )reader -> context ;
146
139
147
- if (file_reader -> file ) {
148
- int ret = fclose (file_reader -> file );
149
- file_reader -> file = NULL ;
140
+ if (file ) {
141
+ int ret = fclose (file );
142
+ reader -> context = NULL ;
150
143
if (ret != 0 )
151
144
mpack_reader_flag_error (reader , mpack_error_io );
152
145
}
153
146
154
- MPACK_FREE (file_reader );
147
+ MPACK_FREE (reader -> buffer );
148
+ reader -> buffer = NULL ;
149
+ reader -> size = 0 ;
150
+ reader -> fill = NULL ;
155
151
}
156
152
157
153
void mpack_reader_init_file (mpack_reader_t * reader , const char * filename ) {
158
154
mpack_assert (filename != NULL , "filename is NULL" );
159
155
160
- mpack_file_reader_t * file_reader = (mpack_file_reader_t * ) MPACK_MALLOC (sizeof (mpack_file_reader_t ));
161
- if (file_reader == NULL ) {
156
+ size_t capacity = MPACK_BUFFER_SIZE ;
157
+ char * buffer = (char * )MPACK_MALLOC (capacity );
158
+ if (buffer == NULL ) {
162
159
mpack_reader_init_error (reader , mpack_error_memory );
163
160
return ;
164
161
}
165
162
166
- file_reader -> file = fopen (filename , "rb" );
167
- if (file_reader -> file == NULL ) {
163
+ FILE * file = fopen (filename , "rb" );
164
+ if (file == NULL ) {
165
+ MPACK_FREE (buffer );
168
166
mpack_reader_init_error (reader , mpack_error_io );
169
- MPACK_FREE (file_reader );
170
167
return ;
171
168
}
172
169
173
- mpack_reader_init (reader , file_reader -> buffer , sizeof ( file_reader -> buffer ) , 0 );
174
- mpack_reader_set_context (reader , file_reader );
170
+ mpack_reader_init (reader , buffer , capacity , 0 );
171
+ mpack_reader_set_context (reader , file );
175
172
mpack_reader_set_fill (reader , mpack_file_reader_fill );
176
173
#if !MPACK_OPTIMIZE_FOR_SIZE
177
174
mpack_reader_set_skip (reader , mpack_file_reader_skip );
0 commit comments