X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fcommon%2Ffiles.c;h=91789f638b829061d41efe480276582e8dea2286;hb=6b61ca69e4085875215d30ef75df7703edb0ddd2;hp=7443ca7c18c4f3a58a3a29e8f326de2b148aa84a;hpb=af5793147fa3dd30d2a8779732d64de4793d1c91;p=flatwaifu.git diff --git a/src/common/files.c b/src/common/files.c index 7443ca7..91789f6 100644 --- a/src/common/files.c +++ b/src/common/files.c @@ -4,7 +4,16 @@ #include #include -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;