summaryrefslogtreecommitdiffstats
path: root/tools/h5jam
diff options
context:
space:
mode:
authorAllen Byrne <byrn@hdfgroup.org>2013-08-12 19:54:49 (GMT)
committerAllen Byrne <byrn@hdfgroup.org>2013-08-12 19:54:49 (GMT)
commita003143ded20bc0d3cc0da3b04170bf2a9602482 (patch)
treec71ec5b50a81aa721f6384eef5bc98c1e92655d5 /tools/h5jam
parentca0bd915dbfac669f7fd962196846724d89982d2 (diff)
downloadhdf5-a003143ded20bc0d3cc0da3b04170bf2a9602482.zip
hdf5-a003143ded20bc0d3cc0da3b04170bf2a9602482.tar.gz
hdf5-a003143ded20bc0d3cc0da3b04170bf2a9602482.tar.bz2
[svn-r23992] HDFFV-8490 and H5UNJAM file handling. Merge from trunk.
Tested: local linux
Diffstat (limited to 'tools/h5jam')
-rw-r--r--tools/h5jam/h5unjam.c149
1 files changed, 58 insertions, 91 deletions
diff --git a/tools/h5jam/h5unjam.c b/tools/h5jam/h5unjam.c
index 691e2f2..40358c6 100644
--- a/tools/h5jam/h5unjam.c
+++ b/tools/h5jam/h5unjam.c
@@ -27,7 +27,7 @@
hsize_t write_pad( int , hsize_t );
hsize_t compute_pad( hsize_t );
-herr_t copy_to_file( int , int , ssize_t, ssize_t );
+herr_t copy_to_file( FILE *, FILE * , ssize_t, ssize_t );
int do_delete = FALSE;
char *output_file = NULL;
@@ -137,20 +137,28 @@ static int
parse_command_line(int argc, const char *argv[])
{
int opt = FALSE;
-
- /* parse command line options */
+
+ /* parse command line options */
while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
switch((char)opt) {
case 'o':
output_file = HDstrdup(opt_arg);
- break;
+ if (output_file)
+ h5tools_set_data_output_file(output_file, 1);
+ break;
case 'i':
input_file = HDstrdup(opt_arg);
- break;
+ if (input_file)
+ h5tools_set_input_file(input_file, 1);
+ break;;
case 'u':
ub_file = HDstrdup(opt_arg);
+ if (ub_file)
+ h5tools_set_output_file(ub_file, 1);
+ else
+ rawoutstream = stdout;
break;
case 'd':
@@ -205,9 +213,6 @@ done:
int
main(int argc, const char *argv[])
{
- int ifid = -1;
- int ufid = -1;
- int h5fid = -1;
void *edata;
H5E_auto2_t func;
hid_t ifile = -1;
@@ -222,24 +227,24 @@ main(int argc, const char *argv[])
h5tools_setprogname(PROGRAMNAME);
h5tools_setstatus(EXIT_SUCCESS);
- /* Disable error reporting */
+ /* Disable error reporting */
H5Eget_auto2(H5E_DEFAULT, &func, &edata);
H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
- /* Initialize h5tools lib */
+ /* Initialize h5tools lib */
h5tools_init();
if(EXIT_FAILURE == parse_command_line(argc, argv))
goto done;
if (input_file == NULL) {
- /* no user block */
+ /* no user block */
error_msg("missing arguemnt for HDF5 file input.\n");
help_ref_msg(stderr);
h5tools_setstatus(EXIT_FAILURE);
goto done;
}
-
+
testval = H5Fis_hdf5(input_file);
if (testval <= 0) {
@@ -283,14 +288,7 @@ main(int argc, const char *argv[])
goto done;
}
- ifid = HDopen(input_file,O_RDONLY,0);
- if(ifid < 0) {
- error_msg("unable to open input HDF5 file \"%s\"\n", input_file);
- h5tools_setstatus(EXIT_FAILURE);
- goto done;
- }
-
- res = HDfstat(ifid, &sbuf);
+ res = HDfstat(HDfileno(rawinstream), &sbuf);
if(res < 0) {
error_msg("Can't stat file \"%s\"\n", input_file);
h5tools_setstatus(EXIT_FAILURE);
@@ -305,43 +303,15 @@ main(int argc, const char *argv[])
goto done;
}
- if (ub_file == NULL) {
- /* write to sdtout */
- ufid = HDdup(1);
- }
- else {
- ufid = HDopen(ub_file,O_WRONLY|O_CREAT|O_TRUNC, 0644 );
-
- if (ufid < 0) {
- error_msg("unable to open user block file for output\"%s\"\n", ub_file);
- h5tools_setstatus(EXIT_FAILURE);
- goto done;
- }
- }
-
if (output_file == NULL) {
- h5fid = HDopen(input_file,O_WRONLY, 0);
-
- if (h5fid < 0) {
error_msg("unable to open output HDF5 file \"%s\"\n", input_file);
h5tools_setstatus(EXIT_FAILURE);
goto done;
- }
}
- else {
- h5fid = HDopen(output_file,O_WRONLY|O_CREAT|O_TRUNC, 0644 );
-
- if (h5fid < 0) {
- error_msg("unable to open output HDF5 file \"%s\"\n", output_file);
- h5tools_setstatus(EXIT_FAILURE);
- goto done;
- }
- }
-
- /* copy from 0 to 'usize - 1' into ufid */
+ /* copy from 0 to 'usize - 1' into ufid */
if (!do_delete) {
- if(copy_to_file(ifid, ufid, 0, (ssize_t) usize) < 0) {
+ if(copy_to_file(rawinstream, rawoutstream, 0, (ssize_t) usize) < 0) {
error_msg("unable to copy user block to output file \"%s\"\n", ub_file);
h5tools_setstatus(EXIT_FAILURE);
goto done;
@@ -349,34 +319,25 @@ main(int argc, const char *argv[])
}
/* copy from usize to end of file into h5fid,
- * starting at end of user block if present
- */
- if(copy_to_file(ifid, h5fid, (ssize_t) usize, (ssize_t)(fsize - (ssize_t)usize)) < 0) {
+ * starting at end of user block if present */
+ if(copy_to_file(rawinstream, rawdatastream, (ssize_t) usize, (ssize_t)(fsize - (ssize_t)usize)) < 0) {
error_msg("unable to copy hdf5 data to output file \"%s\"\n", output_file);
h5tools_setstatus(EXIT_FAILURE);
goto done;
}
-
+
done:
if(input_file)
HDfree(input_file);
+
if(output_file)
HDfree(output_file);
+
if(ub_file) {
HDfree(ub_file);
- if(ufid >= 0)
- status = HDclose(ufid);
- HDassert(status >= 0);
- }
-
- if(h5fid >= 0) {
- status = HDclose(h5fid);
- HDassert(status >= 0);
- }
- if(ifid >= 0) {
- status = HDclose(ifid);
- HDassert(status >= 0);
}
+
+ h5tools_close();
return h5tools_getstatus();
}
@@ -388,54 +349,60 @@ done:
* Returns 0 on success, -1 on failure.
*/
herr_t
-copy_to_file( int infid, int ofid, ssize_t where, ssize_t how_much )
+copy_to_file( FILE *infid, FILE *ofid, ssize_t _where, ssize_t how_much )
{
static char buf[COPY_BUF_SIZE];
+ off_t where = (off_t)_where;
off_t to;
off_t from;
- ssize_t nchars = -1;
- ssize_t wnchars = -1;
herr_t ret_value = 0;
/* nothing to copy */
if(how_much <= 0)
goto done;
+ /* rewind */
+ HDfseek(infid, 0L, 0);
+
from = where;
to = 0;
-
while(how_much > 0) {
- /* Seek to correct position in input file */
- HDlseek(infid,from,SEEK_SET);
+ size_t bytes_in = 0; /* # of bytes to read */
+ size_t bytes_read = 0; /* # of bytes actually read */
+ size_t bytes_wrote = 0; /* # of bytes written */
- /* Read data to buffer */
if (how_much > COPY_BUF_SIZE)
- nchars = HDread(infid,buf,(unsigned)COPY_BUF_SIZE);
+ bytes_in = COPY_BUF_SIZE;
else
- nchars = HDread(infid,buf,(unsigned)how_much);
- if(nchars < 0) {
+ bytes_in = how_much;
+
+ /* Seek to correct position in input file */
+ HDfseek(infid, from, SEEK_SET);
+
+ /* Read data to buffer */
+ bytes_read = HDfread(buf, (size_t)1, bytes_in, infid);
+ if(0 == bytes_read && HDferror(infid)) {
ret_value = -1;
goto done;
} /* end if */
+ if(0 == bytes_read && HDfeof(infid)) {
+ goto done;
+ } /* end if */
/* Seek to correct position in output file */
- HDlseek(ofid,to,SEEK_SET);
+ HDfseek(ofid, to, SEEK_SET);
/* Update positions/size */
- how_much -= nchars;
- from += nchars;
- to += nchars;
-
- /* Write nchars bytes to output file */
- wnchars = nchars;
- while(nchars > 0) {
- wnchars = HDwrite(ofid,buf,(unsigned)nchars);
- if(wnchars < 0) {
- ret_value = -1;
- goto done;
- } /* end if */
- nchars -= wnchars;
- } /* end while */
+ how_much -= bytes_read;
+ from += bytes_read;
+ to += bytes_read;
+
+ /* Write nchars bytes to output file */
+ bytes_wrote = HDfwrite(buf, (size_t)1, bytes_read, ofid);
+ if(bytes_wrote != bytes_read || (0 == bytes_wrote && HDferror(ofid))) { /* error */
+ ret_value = -1;
+ goto done;
+ } /* end if */
} /* end while */
done: