DEADSOFTWARE

8961c0377f4053cfa982baf708333b90c778dc6b
[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 long FILE_Stream_GetLen (Stream *r) {
26 FILE_Stream *rd = (FILE_Stream*)r;
27 assert(rd != NULL);
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
37 return len;
38 }
40 static void FILE_Stream_Read (Stream *r, void *data, size_t size, size_t n) {
41 FILE_Stream *rd = (FILE_Stream*)r;
42 assert(rd != NULL);
43 assert(rd->fp != NULL);
44 size_t res = fread(data, size, n, rd->fp);
45 assert(res == n); // fail
46 }
48 static void FILE_Stream_Write (Stream *w, const void *data, size_t size, size_t n) {
49 FILE_Stream *wr = (FILE_Stream*)w;
50 assert(wr != NULL);
51 assert(wr->fp != NULL);
52 size_t res = fwrite(data, size, n, wr->fp);
53 assert(res == n); // fail
54 }
56 void FILE_Assign (FILE_Stream *r, FILE *fp) {
57 assert(r != NULL);
58 assert(fp != NULL);
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;
64 r->fp = fp;
65 }
67 int FILE_Open (FILE_Stream *r, const char *name, const char *mode) {
68 assert(r != NULL);
69 assert(name != NULL);
70 FILE *fp = fopen(name, mode);
71 if (fp) {
72 FILE_Assign(r, fp);
73 }
74 return fp != NULL;
75 }
77 void FILE_Close (FILE_Stream *r) {
78 assert(r != NULL);
79 if (r->fp != NULL) {
80 fclose(r->fp);
81 }
82 r->base.getpos = NULL;
83 r->base.setpos = NULL;
84 r->base.getlen = NULL;
85 r->base.read = NULL;
86 r->base.write = NULL;
87 r->fp = NULL;
88 }