X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fcommon%2Ffiles.c;h=8961c0377f4053cfa982baf708333b90c778dc6b;hb=a24e8116cca13337153f217bf595dd3ff63cffcb;hp=792df2d1afc70188946e986328309447002732ff;hpb=3d9acf8660ae1f0148c8578b8e9ca168795deec4;p=flatwaifu.git diff --git a/src/common/files.c b/src/common/files.c index 792df2d..8961c03 100644 --- a/src/common/files.c +++ b/src/common/files.c @@ -22,6 +22,21 @@ static void FILE_Stream_SetPos (Stream *r, long pos) { assert(res == 0); // fail } +static long FILE_Stream_GetLen (Stream *r) { + FILE_Stream *rd = (FILE_Stream*)r; + assert(rd != NULL); + assert(rd->fp != NULL); + long pos = ftell(rd->fp); + assert(pos != -1); // fail get cur pos + int res = fseek(rd->fp, 0, SEEK_END); + assert(res == 0); // fail jump to end + long 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) { FILE_Stream *rd = (FILE_Stream*)r; assert(rd != NULL); @@ -43,6 +58,7 @@ 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; @@ -65,6 +81,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;