diff --git a/src/common/files.c b/src/common/files.c
index 792df2d1afc70188946e986328309447002732ff..8961c0377f4053cfa982baf708333b90c778dc6b 100644 (file)
--- a/src/common/files.c
+++ b/src/common/files.c
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);
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;
}
r->base.getpos = NULL;
r->base.setpos = NULL;
+ r->base.getlen = NULL;
r->base.read = NULL;
r->base.write = NULL;
r->fp = NULL;