DEADSOFTWARE

portability: avoid errors on some compilers
[flatwaifu.git] / src / common / files.c
1 #include "common/files.h"
3 #include <stdio.h>
4 #include <stdint.h>
5 #include <assert.h>
7 static long FILE_Stream_GetPos (Stream *r) {
8 long pos;
9 FILE_Stream *rd = (FILE_Stream*)r;
10 assert(rd != NULL);
11 assert(rd->fp != NULL);
12 pos = ftell(rd->fp);
13 assert(pos != -1); // fail
14 return pos;
15 }
17 static void FILE_Stream_SetPos (Stream *r, long pos) {
18 int res;
19 FILE_Stream *rd = (FILE_Stream*)r;
20 assert(rd != NULL);
21 assert(rd->fp != NULL);
22 assert(pos >= 0);
23 res = fseek(rd->fp, pos, SEEK_SET);
24 assert(res == 0); // fail
25 }
27 static long FILE_Stream_GetLen (Stream *r) {
28 int res;
29 long pos, len;
30 FILE_Stream *rd = (FILE_Stream*)r;
31 assert(rd != NULL);
32 assert(rd->fp != NULL);
33 pos = ftell(rd->fp);
34 assert(pos != -1); // fail get cur pos
35 res = fseek(rd->fp, 0, SEEK_END);
36 assert(res == 0); // fail jump to end
37 len = ftell(rd->fp);
38 res = fseek(rd->fp, pos, SEEK_SET);
39 assert(res == 0); // fail return
40 assert(len != -1); // fail get length
41 return len;
42 }
44 static void FILE_Stream_Read (Stream *r, void *data, size_t size, size_t n) {
45 size_t res;
46 FILE_Stream *rd = (FILE_Stream*)r;
47 assert(rd != NULL);
48 assert(rd->fp != NULL);
49 res = fread(data, size, n, rd->fp);
50 assert(res == n); // fail
51 }
53 static void FILE_Stream_Write (Stream *w, const void *data, size_t size, size_t n) {
54 size_t res;
55 FILE_Stream *wr = (FILE_Stream*)w;
56 assert(wr != NULL);
57 assert(wr->fp != NULL);
58 res = fwrite(data, size, n, wr->fp);
59 assert(res == n); // fail
60 }
62 void FILE_Assign (FILE_Stream *r, FILE *fp) {
63 assert(r != NULL);
64 assert(fp != NULL);
65 r->base.getpos = FILE_Stream_GetPos;
66 r->base.setpos = FILE_Stream_SetPos;
67 r->base.getlen = FILE_Stream_GetLen;
68 r->base.read = FILE_Stream_Read;
69 r->base.write = FILE_Stream_Write;
70 r->fp = fp;
71 }
73 int FILE_Open (FILE_Stream *r, const char *name, const char *mode) {
74 FILE *fp;
75 assert(r != NULL);
76 assert(name != NULL);
77 fp = fopen(name, mode);
78 if (fp) {
79 FILE_Assign(r, fp);
80 }
81 return fp != NULL;
82 }
84 void FILE_Close (FILE_Stream *r) {
85 assert(r != NULL);
86 if (r->fp != NULL) {
87 fclose(r->fp);
88 }
89 r->base.getpos = NULL;
90 r->base.setpos = NULL;
91 r->base.getlen = NULL;
92 r->base.read = NULL;
93 r->base.write = NULL;
94 r->fp = NULL;
95 }