- i64 fsize = vg_file_size( f );
- void *buf = malloc( fsize + reserve_end );
-
- if( buf )
- {
- /* Invalid / corrupt read */
- if( fread( buf, 1, fsize, f ) != fsize )
- {
- free( buf );
- buf = NULL;
- }
- }
-
- *size = fsize;
-
+ void *buffer = vg_linear_alloc( lin_alloc, 0 );
+ u64 current = 0;
+
+ /* read in chunks */
+ for( u32 i=0; 1; i++ )
+ {
+ buffer = vg_linear_extend( lin_alloc, buffer, VG_FILE_IO_CHUNK_SIZE );
+
+ u64 l = fread( buffer + current, 1, VG_FILE_IO_CHUNK_SIZE, f );
+ current += l;
+
+ if( l != VG_FILE_IO_CHUNK_SIZE )
+ {
+ if( feof( f ) )
+ {
+ break;
+ }
+ else
+ {
+ if( ferror( f ) )
+ {
+ fclose(f);
+ vg_fatal_exit_loop( "read error" );
+ }
+ else
+ {
+ fclose(f);
+ vg_fatal_exit_loop( "unknown error codition" );
+ }
+ }
+ }
+ }
+
+ buffer = vg_linear_resize( lin_alloc, buffer, current );