From: Daniel Elstner Date: Sat, 26 Sep 2015 16:10:28 +0000 (+0200) Subject: resource: Move sr_file_get_size() to resource.c X-Git-Tag: libsigrok-0.4.0~239 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=7d89fd60e5bce5bbb3271a5ecd54c3c6c63dc6bf;p=libsigrok.git resource: Move sr_file_get_size() to resource.c --- diff --git a/src/input/input.c b/src/input/input.c index e93925d2..5e8f2129 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -403,43 +403,6 @@ SR_API int sr_input_scan_buffer(GString *buf, const struct sr_input **in) return ret; } -/** Retrieve the size of the open stream @a file. - * This function only works on seekable streams. However, the set of seekable - * streams is generally congruent with the set of streams that have a size. - * Code that needs to work with any type of stream (including pipes) should - * require neither seekability nor advance knowledge of the size. - * On failure, the return value is negative and errno is set. - * @param file An I/O stream opened in binary mode. - * @return The size of @a file in bytes, or a negative value on failure. - */ -SR_PRIV int64_t sr_file_get_size(FILE *file) -{ - off_t filepos, filesize; - - /* ftello() and fseeko() are not standard C, but part of POSIX.1-2001. - * Thus, if these functions are available at all, they can reasonably - * be expected to also conform to POSIX semantics. In particular, this - * means that ftello() after fseeko(..., SEEK_END) has a defined result - * and can be used to get the size of a seekable stream. - * On Windows, the result is fully defined only for binary streams. - */ - filepos = ftello(file); - if (filepos < 0) - return -1; - - if (fseeko(file, 0, SEEK_END) < 0) - return -1; - - filesize = ftello(file); - if (filesize < 0) - return -1; - - if (fseeko(file, filepos, SEEK_SET) < 0) - return -1; - - return filesize; -} - /** * Try to find an input module that can parse the given file. * diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 32f49197..f3b932b7 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -593,10 +593,6 @@ struct drv_context { GSList *instances; }; -/*--- input/input.c ---------------------------------------------------------*/ - -SR_PRIV int64_t sr_file_get_size(FILE *file); - /*--- log.c -----------------------------------------------------------------*/ #if defined(G_OS_WIN32) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) @@ -771,6 +767,8 @@ SR_PRIV int std_serial_dev_close(struct sr_dev_inst *sdi); /*--- resource.c ------------------------------------------------------------*/ +SR_PRIV int64_t sr_file_get_size(FILE *file); + SR_PRIV int sr_resource_open(struct sr_context *ctx, struct sr_resource *res, int type, const char *name) G_GNUC_WARN_UNUSED_RESULT; diff --git a/src/resource.c b/src/resource.c index b29be608..bcb7a191 100644 --- a/src/resource.c +++ b/src/resource.c @@ -35,6 +35,47 @@ * Access to resource files. */ +/** Retrieve the size of the open stream @a file. + * + * This function only works on seekable streams. However, the set of seekable + * streams is generally congruent with the set of streams that have a size. + * Code that needs to work with any type of stream (including pipes) should + * require neither seekability nor advance knowledge of the size. + * On failure, the return value is negative and errno is set. + * + * @param file An I/O stream opened in binary mode. + * @return The size of @a file in bytes, or a negative value on failure. + * + * @private + */ +SR_PRIV int64_t sr_file_get_size(FILE *file) +{ + off_t filepos, filesize; + + /* ftello() and fseeko() are not standard C, but part of POSIX.1-2001. + * Thus, if these functions are available at all, they can reasonably + * be expected to also conform to POSIX semantics. In particular, this + * means that ftello() after fseeko(..., SEEK_END) has a defined result + * and can be used to get the size of a seekable stream. + * On Windows, the result is fully defined only for binary streams. + */ + filepos = ftello(file); + if (filepos < 0) + return -1; + + if (fseeko(file, 0, SEEK_END) < 0) + return -1; + + filesize = ftello(file); + if (filesize < 0) + return -1; + + if (fseeko(file, filepos, SEEK_SET) < 0) + return -1; + + return filesize; +} + static FILE *try_open_file(const char *datadir, const char *subdir, const char *name) {