resource: Move sr_file_get_size() to resource.c

This commit is contained in:
Daniel Elstner 2015-09-26 18:10:28 +02:00
parent bee246665b
commit 7d89fd60e5
3 changed files with 43 additions and 41 deletions

View File

@ -403,43 +403,6 @@ SR_API int sr_input_scan_buffer(GString *buf, const struct sr_input **in)
return ret; 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. * Try to find an input module that can parse the given file.
* *

View File

@ -593,10 +593,6 @@ struct drv_context {
GSList *instances; GSList *instances;
}; };
/*--- input/input.c ---------------------------------------------------------*/
SR_PRIV int64_t sr_file_get_size(FILE *file);
/*--- log.c -----------------------------------------------------------------*/ /*--- log.c -----------------------------------------------------------------*/
#if defined(G_OS_WIN32) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) #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 ------------------------------------------------------------*/ /*--- resource.c ------------------------------------------------------------*/
SR_PRIV int64_t sr_file_get_size(FILE *file);
SR_PRIV int sr_resource_open(struct sr_context *ctx, SR_PRIV int sr_resource_open(struct sr_context *ctx,
struct sr_resource *res, int type, const char *name) struct sr_resource *res, int type, const char *name)
G_GNUC_WARN_UNUSED_RESULT; G_GNUC_WARN_UNUSED_RESULT;

View File

@ -35,6 +35,47 @@
* Access to resource files. * 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, static FILE *try_open_file(const char *datadir, const char *subdir,
const char *name) const char *name)
{ {