DEADSOFTWARE

files: add abstract streams
[flatwaifu.git] / src / common / files.c
1 #include "files.h"
3 #include <stdio.h>
4 #include <stdint.h>
5 #include <assert.h>
7 static void FILE_Reader_SetPos (Reader *r, int pos) {
8 FILE_Reader *rd = (FILE_Reader*)r;
9 assert(rd != NULL);
10 assert(rd->fp != NULL);
11 assert(pos >= 0);
12 int res = fseek(rd->fp, pos, SEEK_SET);
13 assert(res == 0); // fail
14 }
16 static void FILE_Reader_Read (Reader *r, void *data, size_t size, size_t n) {
17 FILE_Reader *rd = (FILE_Reader*)r;
18 assert(rd != NULL);
19 assert(rd->fp != NULL);
20 size_t res = fread(data, size, n, rd->fp);
21 assert(res == n); // fail
22 }
24 void FILE_AssignReader (FILE_Reader *r, FILE *fp) {
25 assert(r != NULL);
26 assert(fp != NULL);
27 r->base.setpos = FILE_Reader_SetPos;
28 r->base.read = FILE_Reader_Read;
29 r->fp = fp;
30 }
32 int FILE_OpenReader (FILE_Reader *r, const char *name) {
33 assert(r != NULL);
34 assert(name != NULL);
35 FILE *fp = fopen(name, "rb");
36 if (fp) {
37 FILE_AssignReader(r, fp);
38 }
39 return fp != NULL;
40 }
42 void FILE_CloseReader (FILE_Reader *r) {
43 assert(r != NULL);
44 if (r->fp != NULL) {
45 fclose(r->fp);
46 }
47 r->base.setpos = NULL;
48 r->base.read = NULL;
49 r->fp = NULL;
50 }
52 static void FILE_Writer_SetPos (Writer *w, int pos) {
53 FILE_Writer *wr = (FILE_Writer*)w;
54 assert(wr != NULL);
55 assert(wr->fp != NULL);
56 assert(pos >= 0);
57 int res = fseek(wr->fp, pos, SEEK_SET);
58 assert(res == 0); // fail
59 }
61 static void FILE_Writer_Write (Writer *w, const void *data, size_t size, size_t n) {
62 FILE_Writer *wr = (FILE_Writer*)w;
63 assert(wr != NULL);
64 assert(wr->fp != NULL);
65 size_t res = fwrite(data, size, n, wr->fp);
66 assert(res == n); // fail
67 }
69 void FILE_AssignWriter (FILE_Writer *w, FILE *fp) {
70 assert(w != NULL);
71 assert(fp != NULL);
72 w->base.setpos = FILE_Writer_SetPos;
73 w->base.write = FILE_Writer_Write;
74 w->fp = fp;
75 }
77 int FILE_OpenWriter (FILE_Writer *w, const char *name) {
78 assert(w != NULL);
79 assert(name != NULL);
80 FILE *fp = fopen(name, "wb");
81 if (fp) {
82 FILE_AssignWriter(w, fp);
83 }
84 return fp != NULL;
85 }
87 void FILE_CloseWriter (FILE_Writer *w) {
88 assert(w != NULL);
89 if (w->fp != NULL) {
90 fclose(w->fp);
91 }
92 w->base.setpos = NULL;
93 w->base.write = NULL;
94 w->fp = NULL;
95 }