X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fcommon%2Ffiles.c;h=f1eeb591f52abbaadbd93bcd9264d2786ef3b90c;hb=refs%2Fheads%2Frenders;hp=91789f638b829061d41efe480276582e8dea2286;hpb=6b61ca69e4085875215d30ef75df7703edb0ddd2;p=flatwaifu.git diff --git a/src/common/files.c b/src/common/files.c index 91789f6..f1eeb59 100644 --- a/src/common/files.c +++ b/src/common/files.c @@ -1,117 +1,95 @@ -#include "files.h" +#include "common/files.h" #include #include #include -static long FILE_Reader_GetPos (Reader *r) { - FILE_Reader *rd = (FILE_Reader*)r; +static long FILE_Stream_GetPos (Stream *r) { + long pos; + FILE_Stream *rd = (FILE_Stream*)r; assert(rd != NULL); assert(rd->fp != NULL); - long pos = ftell(rd->fp); + 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; +static void FILE_Stream_SetPos (Stream *r, long pos) { + int res; + FILE_Stream *rd = (FILE_Stream*)r; assert(rd != NULL); assert(rd->fp != NULL); assert(pos >= 0); - int res = fseek(rd->fp, pos, SEEK_SET); + res = fseek(rd->fp, pos, SEEK_SET); assert(res == 0); // fail } -static void FILE_Reader_Read (Reader *r, void *data, size_t size, size_t n) { - FILE_Reader *rd = (FILE_Reader*)r; +static long FILE_Stream_GetLen (Stream *r) { + int res; + long pos, len; + FILE_Stream *rd = (FILE_Stream*)r; assert(rd != NULL); assert(rd->fp != NULL); - size_t res = fread(data, size, n, rd->fp); + pos = ftell(rd->fp); + assert(pos != -1); // fail get cur pos + res = fseek(rd->fp, 0, SEEK_END); + assert(res == 0); // fail jump to end + len = ftell(rd->fp); + res = fseek(rd->fp, pos, SEEK_SET); + assert(res == 0); // fail return + assert(len != -1); // fail get length + return len; +} + +static void FILE_Stream_Read (Stream *r, void *data, size_t size, size_t n) { + size_t res; + FILE_Stream *rd = (FILE_Stream*)r; + assert(rd != NULL); + assert(rd->fp != NULL); + res = fread(data, size, n, rd->fp); + assert(res == n); // fail +} + +static void FILE_Stream_Write (Stream *w, const void *data, size_t size, size_t n) { + size_t res; + FILE_Stream *wr = (FILE_Stream*)w; + assert(wr != NULL); + assert(wr->fp != NULL); + res = fwrite(data, size, n, wr->fp); assert(res == n); // fail } -void FILE_AssignReader (FILE_Reader *r, FILE *fp) { +void FILE_Assign (FILE_Stream *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->base.getpos = FILE_Stream_GetPos; + r->base.setpos = FILE_Stream_SetPos; + r->base.getlen = FILE_Stream_GetLen; + r->base.read = FILE_Stream_Read; + r->base.write = FILE_Stream_Write; r->fp = fp; } -int FILE_OpenReader (FILE_Reader *r, const char *name) { +int FILE_Open (FILE_Stream *r, const char *name, const char *mode) { + FILE *fp; assert(r != NULL); assert(name != NULL); - FILE *fp = fopen(name, "rb"); + fp = fopen(name, mode); if (fp) { - FILE_AssignReader(r, fp); + FILE_Assign(r, fp); } return fp != NULL; } -void FILE_CloseReader (FILE_Reader *r) { +void FILE_Close (FILE_Stream *r) { assert(r != NULL); if (r->fp != NULL) { fclose(r->fp); } r->base.getpos = NULL; r->base.setpos = NULL; - r->base.read = NULL; + r->base.getlen = NULL; + r->base.read = NULL; + r->base.write = NULL; r->fp = NULL; } - -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); - assert(pos >= 0); - int res = fseek(wr->fp, pos, SEEK_SET); - assert(res == 0); // fail -} - -static void FILE_Writer_Write (Writer *w, const void *data, size_t size, size_t n) { - FILE_Writer *wr = (FILE_Writer*)w; - assert(wr != NULL); - assert(wr->fp != NULL); - size_t res = fwrite(data, size, n, wr->fp); - assert(res == n); // fail -} - -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; -} - -int FILE_OpenWriter (FILE_Writer *w, const char *name) { - assert(w != NULL); - assert(name != NULL); - FILE *fp = fopen(name, "wb"); - if (fp) { - FILE_AssignWriter(w, fp); - } - return fp != NULL; -} - -void FILE_CloseWriter (FILE_Writer *w) { - assert(w != NULL); - if (w->fp != NULL) { - fclose(w->fp); - } - w->base.getpos = NULL; - w->base.setpos = NULL; - w->base.write = NULL; - w->fp = NULL; -}