7 static long FILE_Stream_GetPos (Stream
*r
) {
8 FILE_Stream
*rd
= (FILE_Stream
*)r
;
10 assert(rd
->fp
!= NULL
);
11 long pos
= ftell(rd
->fp
);
12 assert(pos
!= -1); // fail
16 static void FILE_Stream_SetPos (Stream
*r
, long pos
) {
17 FILE_Stream
*rd
= (FILE_Stream
*)r
;
19 assert(rd
->fp
!= NULL
);
21 int res
= fseek(rd
->fp
, pos
, SEEK_SET
);
22 assert(res
== 0); // fail
25 static long FILE_Stream_GetLen (Stream
*r
) {
26 FILE_Stream
*rd
= (FILE_Stream
*)r
;
28 assert(rd
->fp
!= NULL
);
29 long pos
= ftell(rd
->fp
);
30 assert(pos
!= -1); // fail get cur pos
31 int res
= fseek(rd
->fp
, 0, SEEK_END
);
32 assert(res
== 0); // fail jump to end
33 long len
= ftell(rd
->fp
);
34 res
= fseek(rd
->fp
, pos
, SEEK_SET
);
35 assert(res
== 0); // fail return
36 assert(len
!= -1); // fail get length
40 static void FILE_Stream_Read (Stream
*r
, void *data
, size_t size
, size_t n
) {
41 FILE_Stream
*rd
= (FILE_Stream
*)r
;
43 assert(rd
->fp
!= NULL
);
44 size_t res
= fread(data
, size
, n
, rd
->fp
);
45 assert(res
== n
); // fail
48 static void FILE_Stream_Write (Stream
*w
, const void *data
, size_t size
, size_t n
) {
49 FILE_Stream
*wr
= (FILE_Stream
*)w
;
51 assert(wr
->fp
!= NULL
);
52 size_t res
= fwrite(data
, size
, n
, wr
->fp
);
53 assert(res
== n
); // fail
56 void FILE_Assign (FILE_Stream
*r
, FILE *fp
) {
59 r
->base
.getpos
= FILE_Stream_GetPos
;
60 r
->base
.setpos
= FILE_Stream_SetPos
;
61 r
->base
.getlen
= FILE_Stream_GetLen
;
62 r
->base
.read
= FILE_Stream_Read
;
63 r
->base
.write
= FILE_Stream_Write
;
67 int FILE_Open (FILE_Stream
*r
, const char *name
, const char *mode
) {
70 FILE *fp
= fopen(name
, mode
);
77 void FILE_Close (FILE_Stream
*r
) {
82 r
->base
.getpos
= NULL
;
83 r
->base
.setpos
= NULL
;
84 r
->base
.getlen
= NULL
;