DEADSOFTWARE

map: use streams for map loader
[flatwaifu.git] / src / common / files.c
index 7443ca7c18c4f3a58a3a29e8f326de2b148aa84a..91789f638b829061d41efe480276582e8dea2286 100644 (file)
@@ -4,7 +4,16 @@
 #include <stdint.h>
 #include <assert.h>
 
-static void FILE_Reader_SetPos (Reader *r, int pos) {
+static long FILE_Reader_GetPos (Reader *r) {
+  FILE_Reader *rd = (FILE_Reader*)r;
+  assert(rd != NULL);
+  assert(rd->fp != NULL);
+  long pos = ftell(rd->fp);
+  assert(pos != -1); // fail
+  return pos;
+}
+
+static void FILE_Reader_SetPos (Reader *r, long pos) {
   FILE_Reader *rd = (FILE_Reader*)r;
   assert(rd != NULL);
   assert(rd->fp != NULL);
@@ -24,6 +33,7 @@ static void FILE_Reader_Read (Reader *r, void *data, size_t size, size_t n) {
 void FILE_AssignReader (FILE_Reader *r, FILE *fp) {
   assert(r != NULL);
   assert(fp != NULL);
+  r->base.getpos = FILE_Reader_GetPos;
   r->base.setpos = FILE_Reader_SetPos;
   r->base.read = FILE_Reader_Read;
   r->fp = fp;
@@ -44,12 +54,22 @@ void FILE_CloseReader (FILE_Reader *r) {
   if (r->fp != NULL) {
     fclose(r->fp);
   }
+  r->base.getpos = NULL;
   r->base.setpos = NULL;
   r->base.read = NULL;
   r->fp = NULL;
 }
 
-static void FILE_Writer_SetPos (Writer *w, int pos) {
+static long FILE_Writer_GetPos (Writer *w) {
+  FILE_Writer *wr = (FILE_Writer*)w;
+  assert(wr != NULL);
+  assert(wr->fp != NULL);
+  long pos = ftell(wr->fp);
+  assert(pos != -1); // fail
+  return pos;
+}
+
+static void FILE_Writer_SetPos (Writer *w, long pos) {
   FILE_Writer *wr = (FILE_Writer*)w;
   assert(wr != NULL);
   assert(wr->fp != NULL);
@@ -69,6 +89,7 @@ static void FILE_Writer_Write (Writer *w, const void *data, size_t size, size_t
 void FILE_AssignWriter (FILE_Writer *w, FILE *fp) {
   assert(w != NULL);
   assert(fp != NULL);
+  w->base.getpos = FILE_Writer_GetPos;
   w->base.setpos = FILE_Writer_SetPos;
   w->base.write = FILE_Writer_Write;
   w->fp = fp;
@@ -89,6 +110,7 @@ void FILE_CloseWriter (FILE_Writer *w) {
   if (w->fp != NULL) {
     fclose(w->fp);
   }
+  w->base.getpos = NULL;
   w->base.setpos = NULL;
   w->base.write = NULL;
   w->fp = NULL;