@@ -148,16 +148,18 @@ bool sc_commit(sc_file* f)
148148
149149 // write main chunk
150150 const uint32_t sc_magic = SC_CHUNK;
151- const uint32_t sc_size = 0 ; // doesn't matter
152- sx_file_write_var (&writer, sc_magic);
153- sx_file_write_var (&writer, sc_size);
151+ uint32_t sc_size = 0 ; // place holder
152+
153+ sc_size += sx_file_write_var (&writer, sc_magic);
154+ const uint32_t sc_size_offset = sizeof (sc_magic);
155+ sc_size += sx_file_write_var (&writer, sc_size);
154156
155157 sc_chunk sc_header;
156158 sc_header.major = f->major_ver ;
157159 sc_header.minor = f->minor_ver ;
158160 sc_header.lang = f->lang ;
159161 sc_header.profile_ver = f->profile_ver ;
160- sx_file_write_var (&writer, sc_header);
162+ sc_size += sx_file_write_var (&writer, sc_header);
161163
162164 // write stages
163165 for (int i = 0 ; i < sx_array_count (f->stages ); i++) {
@@ -174,34 +176,38 @@ bool sc_commit(sc_file* f)
174176
175177 // `STAG`
176178 const uint32_t _stage = SC_CHUNK_STAG;
177- sx_file_write_var (&writer, _stage);
178- sx_file_write_var (&writer, stage_size);
179- sx_file_write_var (&writer, s->stage );
179+ sc_size += sx_file_write_var (&writer, _stage);
180+ sc_size += sx_file_write_var (&writer, stage_size);
181+ sc_size += sx_file_write_var (&writer, s->stage );
180182
181183 if (code_size) {
182184 // `CODE`
183185 const uint32_t _code = SC_CHUNK_CODE;
184186 const uint32_t code_size = sx_strlen (s->code ) + 1 ;
185- sx_file_write_var (&writer, _code);
186- sx_file_write_var (&writer, code_size);
187- sx_file_write (&writer, s->code , code_size);
187+ sc_size += sx_file_write_var (&writer, _code);
188+ sc_size += sx_file_write_var (&writer, code_size);
189+ sc_size += sx_file_write (&writer, s->code , code_size);
188190 } else if (data_size) {
189191 // `DATA`
190192 const uint32_t _data = SC_CHUNK_DATA;
191- sx_file_write_var (&writer, _data);
192- sx_file_write_var (&writer, s->data_size );
193- sx_file_write (&writer, s->data , s->data_size );
193+ sc_size += sx_file_write_var (&writer, _data);
194+ sc_size += sx_file_write_var (&writer, s->data_size );
195+ sc_size += sx_file_write (&writer, s->data , s->data_size );
194196 }
195197
196198 // `REFL`
197199 if (s->refl ) {
198200 const uint32_t _refl = SC_CHUNK_REFL;
199- sx_file_write_var (&writer, _refl);
200- sx_file_write_var (&writer, s->refl_size );
201- sx_file_write (&writer, s->refl , s->refl_size );
201+ sc_size += sx_file_write_var (&writer, _refl);
202+ sc_size += sx_file_write_var (&writer, s->refl_size );
203+ sc_size += sx_file_write (&writer, s->refl , s->refl_size );
202204 }
203205 }
204206
207+ // finish sc size
208+ sx_file_seekw (&writer, sc_size_offset, SX_WHENCE_BEGIN);
209+ sx_file_write_var (&writer, sc_size);
210+
205211 sx_file_close_writer (&writer);
206212
207213 return true ;
0 commit comments