summaryrefslogtreecommitdiffstats
path: root/src/H5Fstdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Fstdio.c')
-rw-r--r--src/H5Fstdio.c398
1 files changed, 0 insertions, 398 deletions
diff --git a/src/H5Fstdio.c b/src/H5Fstdio.c
deleted file mode 100644
index 94ab0d1..0000000
--- a/src/H5Fstdio.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright (C) 1997 NCSA
- * All rights reserved.
- *
- * Programmer: Robb Matzke <matzke@llnl.gov>
- * Wednesday, October 22, 1997
- *
- * Purpose: This is the Posix stdio.h I/O subclass of H5Flow.
- */
-#include <H5private.h>
-#include <H5private.h>
-#include <H5Eprivate.h>
-#include <H5Fprivate.h>
-#include <H5MMprivate.h>
-
-#define PABLO_MASK H5Fstdio_mask
-static intn interface_initialize_g = 0;
-#define INTERFACE_INIT NULL
-
-static H5F_low_t *H5F_stdio_open(const char *name,
- const H5F_access_t *access_parms, uintn flags,
- H5F_search_t *key/*out*/);
-static herr_t H5F_stdio_close(H5F_low_t *lf, const H5F_access_t *access_parms);
-static herr_t H5F_stdio_read(H5F_low_t *lf, const H5F_access_t *access_parms,
- const H5F_xfer_t *xfer_parms, haddr_t addr,
- size_t size, uint8_t *buf/*out*/);
-static herr_t H5F_stdio_write(H5F_low_t *lf, const H5F_access_t *access_parms,
- const H5F_xfer_t *xfer_parms, haddr_t addr,
- size_t size, const uint8_t *buf);
-static herr_t H5F_stdio_flush(H5F_low_t *lf, const H5F_access_t *access_parms);
-
-const H5F_low_class_t H5F_LOW_STDIO_g[1] = {{
- NULL, /* use default access(2) func */
- H5F_stdio_open, /* open method */
- H5F_stdio_close, /* close method */
- H5F_stdio_read, /* read method */
- H5F_stdio_write, /* write method */
- H5F_stdio_flush, /* flush method */
- NULL, /* extend method */
- NULL, /* alloc method */
-}};
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_stdio_open
- *
- * Purpose: Opens a file with name NAME. The FLAGS are a bit field with
- * the possible values defined in H5F_low_open().
- *
- * Bugs: H5F_ACC_EXCL has a race condition.
- *
- * Errors:
- * IO CANTOPENFILE File doesn't exist and CREAT wasn't
- * specified.
- * IO CANTOPENFILE Fopen failed.
- * IO FILEEXISTS File exists but CREAT and EXCL were
- * specified.
- *
- * Return: Success: Low-level file pointer
- *
- * Failure: NULL
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static H5F_low_t *
-H5F_stdio_open(const char *name, const H5F_access_t UNUSED *access_parms,
- uintn flags, H5F_search_t *key/*out*/)
-{
- H5F_low_t *lf = NULL;
- FILE *f = NULL;
- struct stat sb;
-
- FUNC_ENTER(H5F_stdio_open, NULL);
-
- if (HDaccess(name, F_OK) < 0) {
- if ((flags & H5F_ACC_CREAT) && (flags & H5F_ACC_RDWR)) {
- f = HDfopen(name, "wb+");
- } else {
- HRETURN_ERROR(H5E_IO, H5E_CANTOPENFILE, NULL,
- "file doesn't exist and CREAT wasn't specified");
- }
-
- } else if ((flags & H5F_ACC_CREAT) && (flags & H5F_ACC_EXCL)) {
- HRETURN_ERROR(H5E_IO, H5E_FILEEXISTS, NULL,
- "file exists but CREAT and EXCL were specified");
-
- } else if (flags & H5F_ACC_RDWR) {
- if (flags & H5F_ACC_TRUNC)
- f = HDfopen(name, "wb+");
- else
- f = HDfopen(name, "rb+");
-
- } else {
- f = HDfopen(name, "rb");
- }
- if (!f)
- HRETURN_ERROR(H5E_IO, H5E_CANTOPENFILE, NULL, "fopen failed");
-
- /* Build the return value */
- if (NULL==(lf = H5MM_calloc(sizeof(H5F_low_t)))) {
- HRETURN_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
- "memory allocation failed");
- }
- lf->u.stdio.f = f;
- lf->u.stdio.op = H5F_OP_SEEK;
- lf->u.stdio.cur = 0;
- lf->eof = 0;
- if (HDfseek(lf->u.stdio.f, 0, SEEK_END) < 0) {
- lf->u.stdio.op = H5F_OP_UNKNOWN;
- } else {
- hssize_t x = HDftell (lf->u.stdio.f);
- assert (x>=0);
- lf->eof += (hsize_t)x;
- }
-
- /* The unique key */
- if (key) {
- HDfstat(fileno(f), &sb);
- key->dev = sb.st_dev;
- key->ino = sb.st_ino;
- }
- FUNC_LEAVE(lf);
-}
-
-/*-------------------------------------------------------------------------
- * Function: H5F_stdio_close
- *
- * Purpose: Closes a file.
- *
- * Errors:
- * IO CLOSEERROR Fclose failed.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5F_stdio_close(H5F_low_t *lf, const H5F_access_t UNUSED *access_parms)
-{
- FUNC_ENTER(H5F_stdio_close, FAIL);
-
- if (HDfclose(lf->u.stdio.f) < 0) {
- HRETURN_ERROR(H5E_IO, H5E_CLOSEERROR, FAIL, "fclose failed");
- }
- lf->u.stdio.f = NULL;
-
- FUNC_LEAVE(SUCCEED);
-}
-
-/*-------------------------------------------------------------------------
- * Function: H5F_stdio_read
- *
- * Purpose: Reads SIZE bytes beginning at address ADDR in file LF and
- * places them in buffer BUF. Reading past the logical or
- * physical end of file returns zeros instead of failing.
- *
- * Errors:
- * IO READERROR Fread failed.
- * IO SEEKERROR Fseek failed.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- * Albert Cheng, 1998-06-02
- * Added XFER_MODE argument.
- *
- * Robb Matzke, 1999-07-28
- * The ADDR argument is passed by value.
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5F_stdio_read(H5F_low_t *lf, const H5F_access_t UNUSED *access_parms,
- const H5F_xfer_t UNUSED *xfer_parms, haddr_t addr,
- size_t size, uint8_t *buf/*out*/)
-{
- size_t n;
- uint64_t mask;
-#ifdef HAVE_FSEEK64
- int64_t offset;
-#else
- long offset;
-#endif
-
- FUNC_ENTER(H5F_stdio_read, FAIL);
-
- /* Check for overflow */
- mask = (uint64_t)1 << (8*sizeof(offset)-1);
- if (addr >= mask ||
- addr + size < addr ||
- addr+size >= mask) {
- HRETURN_ERROR (H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed");
- }
-#ifdef HAVE_FSEEK64
- offset = (int64_t)(addr); /*checked for overflow*/
-#else
- offset = (long)(addr); /*checked for overflow*/
-#endif
-
- /* Check easy cases */
- if (0 == size) HRETURN(SUCCEED);
- if ((uint64_t)offset >= lf->eof) {
- HDmemset(buf, 0, size);
- HRETURN(SUCCEED);
- }
-
- /*
- * Seek to the correct file position.
- */
- if (!H5F_OPT_SEEK ||
- lf->u.stdio.op != H5F_OP_READ ||
- lf->u.stdio.cur != offset) {
-#ifdef HAVE_FSEEK64
- if (fseek64 (lf->u.stdio.f, offset, SEEK_SET)<0) {
- HRETURN_ERROR (H5E_IO, H5E_SEEKERROR, FAIL, "fseek64 failed");
- }
-#else
- if (HDfseek(lf->u.stdio.f, offset, SEEK_SET) < 0) {
- HRETURN_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "fseek failed");
- }
-#endif
- lf->u.stdio.cur = offset;
- }
-
- /*
- * Read zeros past the logical end of file (physical is handled below)
- */
- if ((size_t) offset + size > lf->eof) {
- size_t nbytes = (size_t) offset + size - lf->eof;
- HDmemset(buf + size - nbytes, 0, nbytes);
- size -= nbytes;
- }
-
- /*
- * Read the data. Since we're reading single-byte values, a partial read
- * will advance the file position by N. If N is negative or an error
- * occurs then the file position is undefined.
- */
- n = HDfread(buf, 1, size, lf->u.stdio.f);
- if (n <= 0 && HDferror(lf->u.stdio.f)) {
- lf->u.stdio.op = H5F_OP_UNKNOWN;
- HRETURN_ERROR(H5E_IO, H5E_READERROR, FAIL, "fread failed");
- } else if (n < size) {
- HDmemset(buf + n, 0, size - n);
- }
-
- /*
- * Update the file position data.
- */
- lf->u.stdio.op = H5F_OP_READ;
-#ifdef HAVE_FSEEK64
- lf->u.stdio.cur = (int64_t)(offset+n); /*checked for overflow above*/
-#else
- lf->u.stdio.cur = (off_t)(offset+n); /*checked for overflow above*/
-#endif
- FUNC_LEAVE(SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_stdio_write
- *
- * Purpose: Writes SIZE bytes from the beginning of BUF into file LF at
- * file address ADDR.
- *
- * Errors:
- * IO SEEKERROR Fseek failed.
- * IO WRITEERROR Fwrite failed.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- * Albert Cheng, 1998-06-02
- * Added XFER_MODE argument.
- *
- * Robb Matzke, 1999-07-28
- * The ADDR argument is passed by value.
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5F_stdio_write(H5F_low_t *lf, const H5F_access_t UNUSED *access_parms,
- const H5F_xfer_t UNUSED *xfer_parms, haddr_t addr,
- size_t size, const uint8_t *buf)
-{
- uint64_t mask;
-#ifdef HAVE_FSEEK64
- int64_t offset;
- uint64_t n;
-#else
- long offset;
- size_t n;
-#endif
-
- FUNC_ENTER(H5F_stdio_write, FAIL);
-
- /* Check for overflow */
- mask = (uint64_t)1 << (8*sizeof(offset)-1);
- if (addr >= mask ||
- addr+size < addr ||
- addr+size >= mask) {
- HRETURN_ERROR (H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed");
- }
-#ifdef HAVE_FSEEK64
- offset = (int64_t)(addr); /*checked for overflow*/
- n = size; /*checked for overflow*/
-#else
- offset = (long)(addr); /*checked for overflow*/
- n = size; /*checked for overflow*/
-#endif
-
- /*
- * Seek to the correct file position.
- */
- if (!H5F_OPT_SEEK ||
- lf->u.stdio.op != H5F_OP_WRITE ||
- lf->u.stdio.cur != offset) {
-#ifdef HAVE_FSEEK64
- if (fseek64 (lf->u.stdio.f, offset, SEEK_SET)<0) {
- HRETURN_ERROR (H5E_IO, H5E_SEEKERROR, FAIL, "fseek64 failed");
- }
-#else
- if (HDfseek(lf->u.stdio.f, offset, SEEK_SET) < 0) {
- HRETURN_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "fseek failed");
- }
-#endif
- lf->u.stdio.cur = offset;
- }
-
- /*
- * Write the buffer. On successful return, the file position will be
- * advanced by the number of bytes read. Otherwise nobody knows where it
- * is.
- */
- if (n != HDfwrite(buf, 1, size, lf->u.stdio.f)) {
- lf->u.stdio.op = H5F_OP_UNKNOWN;
- HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "fwrite failed");
- }
-
- /*
- * Update seek optimizing data.
- */
- lf->u.stdio.op = H5F_OP_WRITE;
- lf->u.stdio.cur = offset + (int64_t)n;
- FUNC_LEAVE(SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_stdio_flush
- *
- * Purpose: Makes sure that all data is on disk.
- *
- * Errors:
- * IO WRITEERROR Fflush failed.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5F_stdio_flush(H5F_low_t *lf, const H5F_access_t UNUSED *access_parms)
-{
- FUNC_ENTER(H5F_stdio_flush, FAIL);
-
- /*
- * What happens to the file position? Is it guaranteed to be the same
- * after the fflush() as it was before?
- */
- lf->u.stdio.op = H5F_OP_UNKNOWN;
-
- /*
- * Flush
- */
- if (HDfflush(lf->u.stdio.f) < 0) {
- HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "fflush failed");
- }
- FUNC_LEAVE(SUCCEED);
-}