DEADSOFTWARE

792df2d1afc70188946e986328309447002732ff
[flatwaifu.git] / src / common / files.c
1 #include "files.h"
3 #include <stdio.h>
4 #include <stdint.h>
5 #include <assert.h>
7 static long FILE_Stream_GetPos (Stream *r) {
8 FILE_Stream *rd = (FILE_Stream*)r;
9 assert(rd != NULL);
10 assert(rd->fp != NULL);
11 long pos = ftell(rd->fp);
12 assert(pos != -1); // fail
13 return pos;
14 }
16 static void FILE_Stream_SetPos (Stream *r, long pos) {
17 FILE_Stream *rd = (FILE_Stream*)r;
18 assert(rd != NULL);
19 assert(rd->fp != NULL);
20 assert(pos >= 0);
21 int res = fseek(rd->fp, pos, SEEK_SET);
22 assert(res == 0); // fail
23 }
25 static void FILE_Stream_Read (Stream *r, void *data, size_t size, size_t n) {
26 FILE_Stream *rd = (FILE_Stream*)r;
27 assert(rd != NULL);
28 assert(rd->fp != NULL);
29 size_t res = fread(data, size, n, rd->fp);
30 assert(res == n); // fail
31 }
33 static void FILE_Stream_Write (Stream *w, const void *data, size_t size, size_t n) {
34 FILE_Stream *wr = (FILE_Stream*)w;
35 assert(wr != NULL);
36 assert(wr->fp != NULL);
37 size_t res = fwrite(data, size, n, wr->fp);
38 assert(res == n); // fail
39 }
41 void FILE_Assign (FILE_Stream *r, FILE *fp) {
42 assert(r != NULL);
43 assert(fp != NULL);
44 r->base.getpos = FILE_Stream_GetPos;
45 r->base.setpos = FILE_Stream_SetPos;
46 r->base.read = FILE_Stream_Read;
47 r->base.write = FILE_Stream_Write;
48 r->fp = fp;
49 }
51 int FILE_Open (FILE_Stream *r, const char *name, const char *mode) {
52 assert(r != NULL);
53 assert(name != NULL);
54 FILE *fp = fopen(name, mode);
55 if (fp) {
56 FILE_Assign(r, fp);
57 }
58 return fp != NULL;
59 }
61 void FILE_Close (FILE_Stream *r) {
62 assert(r != NULL);
63 if (r->fp != NULL) {
64 fclose(r->fp);
65 }
66 r->base.getpos = NULL;
67 r->base.setpos = NULL;
68 r->base.read = NULL;
69 r->base.write = NULL;
70 r->fp = NULL;
71 }