X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fcommon%2Ffiles.c;h=f1eeb591f52abbaadbd93bcd9264d2786ef3b90c;hb=a46dd0ed1c212f4710124bc16e2da53374a352c8;hp=792df2d1afc70188946e986328309447002732ff;hpb=65130d9f6581e4bd39ceae50d820c9774e4972a9;p=flatwaifu.git diff --git a/src/common/files.c b/src/common/files.c index 792df2d..f1eeb59 100644 --- a/src/common/files.c +++ b/src/common/files.c @@ -1,40 +1,61 @@ -#include "files.h" +#include "common/files.h" #include #include #include 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_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 long FILE_Stream_GetLen (Stream *r) { + int res; + long pos, len; + FILE_Stream *rd = (FILE_Stream*)r; + assert(rd != NULL); + assert(rd->fp != NULL); + 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); - size_t res = fread(data, size, n, rd->fp); + 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); - size_t res = fwrite(data, size, n, wr->fp); + res = fwrite(data, size, n, wr->fp); assert(res == n); // fail } @@ -43,15 +64,17 @@ void FILE_Assign (FILE_Stream *r, FILE *fp) { assert(fp != NULL); 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_Open (FILE_Stream *r, const char *name, const char *mode) { + FILE *fp; assert(r != NULL); assert(name != NULL); - FILE *fp = fopen(name, mode); + fp = fopen(name, mode); if (fp) { FILE_Assign(r, fp); } @@ -65,6 +88,7 @@ void FILE_Close (FILE_Stream *r) { } r->base.getpos = NULL; r->base.setpos = NULL; + r->base.getlen = NULL; r->base.read = NULL; r->base.write = NULL; r->fp = NULL;