summaryrefslogtreecommitdiffstats
path: root/tools/h5jam
diff options
context:
space:
mode:
authorAllen Byrne <byrn@hdfgroup.org>2011-05-11 20:45:54 (GMT)
committerAllen Byrne <byrn@hdfgroup.org>2011-05-11 20:45:54 (GMT)
commitf49dc381271ac53a508628856787463668789772 (patch)
treed424cac8fb50120d9080086d54fd8d98a0977d03 /tools/h5jam
parent2e7d42a43c60753d99d3bed37d121ca30ac5db1c (diff)
downloadhdf5-f49dc381271ac53a508628856787463668789772.zip
hdf5-f49dc381271ac53a508628856787463668789772.tar.gz
hdf5-f49dc381271ac53a508628856787463668789772.tar.bz2
[svn-r20796] Refactor print_data_region_blocks/ponts to remove context passed in by value. The print functions needed an independent context with only the current indent level passed in by argument. Also synched the two routines logical flows and corrected a mem_space error.
h5dump (and h5stat, h5jam/h5unjam) help option not tested. Added h5dump parse_command_line technique for h5stat and h5jam/unjam and created testfiles. Tested: local linux
Diffstat (limited to 'tools/h5jam')
-rw-r--r--tools/h5jam/CMakeLists.txt35
-rw-r--r--tools/h5jam/h5jam.c440
-rw-r--r--tools/h5jam/h5unjam.c179
-rw-r--r--tools/h5jam/testfiles/h5jam-help.txt9
-rw-r--r--tools/h5jam/testfiles/h5unjam-help.txt7
5 files changed, 394 insertions, 276 deletions
diff --git a/tools/h5jam/CMakeLists.txt b/tools/h5jam/CMakeLists.txt
index 979a1f3..0f63234 100644
--- a/tools/h5jam/CMakeLists.txt
+++ b/tools/h5jam/CMakeLists.txt
@@ -56,6 +56,8 @@ IF (BUILD_TESTING)
u511.txt
u512.txt
u513.txt
+ h5jam-help.txt
+ h5unjam-help.txt
)
SET (HDF5_REFERENCE_TEST_FILES
tall.h5
@@ -92,6 +94,37 @@ IF (BUILD_TESTING)
##############################################################################
##############################################################################
+ MACRO (ADD_HELP_TEST testname resultcode)
+ # If using memchecker add tests without using scripts
+ IF (HDF5_ENABLE_USING_MEMCHECKER)
+ ADD_TEST (NAME H5JAM-${testname} COMMAND $<TARGET_FILE:h5jam> ${ARGN})
+ ADD_TEST (NAME H5JAM-UNJAM-${testname} COMMAND $<TARGET_FILE:h5unjam> ${ARGN})
+ ELSE (HDF5_ENABLE_USING_MEMCHECKER)
+ ADD_TEST (
+ NAME H5JAM-${testname}
+ COMMAND "${CMAKE_COMMAND}"
+ -D "TEST_PROGRAM=$<TARGET_FILE:h5jam>"
+ -D "TEST_ARGS=${ARGN}"
+ -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+ -D "TEST_OUTPUT=jam-${testname}.out"
+ -D "TEST_EXPECT=${resultcode}"
+ -D "TEST_REFERENCE=jam-${testname}.txt"
+ -P "${HDF5_RESOURCES_DIR}/runTest.cmake"
+ )
+ ADD_TEST (
+ NAME H5JAM-UNJAM-${testname}
+ COMMAND "${CMAKE_COMMAND}"
+ -D "TEST_PROGRAM=$<TARGET_FILE:h5unjam>"
+ -D "TEST_ARGS=${ARGN}"
+ -D "TEST_FOLDER=${PROJECT_BINARY_DIR}"
+ -D "TEST_OUTPUT=unjam-${testname}.out"
+ -D "TEST_EXPECT=${resultcode}"
+ -D "TEST_REFERENCE=unjam-${testname}.txt"
+ -P "${HDF5_RESOURCES_DIR}/runTest.cmake"
+ )
+ ENDIF (HDF5_ENABLE_USING_MEMCHECKER)
+ ENDMACRO (ADD_HELP_TEST)
+
MACRO (CLEANUP testname)
ADD_TEST (
NAME H5JAM-CLEANUP-${testname}-clear-objects
@@ -309,6 +342,8 @@ IF (BUILD_TESTING)
##############################################################################
##############################################################################
+ ADD_HELP_TEST(help 0 -h)
+
JAMTEST (tall_u10 u10.txt tall.h5 ta2.h5)
CHECKFILE (tall_u10 tall.h5 ta2.h5)
# CLEANUP (tall_u10 ta2.h5)
diff --git a/tools/h5jam/h5jam.c b/tools/h5jam/h5jam.c
index 5eaa26a..b300583 100644
--- a/tools/h5jam/h5jam.c
+++ b/tools/h5jam/h5jam.c
@@ -38,14 +38,14 @@ char *ub_file = NULL;
* parameters. The long-named ones can be partially spelled. When
* adding more, make sure that they don't clash with each other.
*/
-static const char *s_opts = "hi:u:o:c:V"; /* add more later ? */
+static const char *s_opts = "hi:u:o:c:V"; /* add more later ? */
static struct long_options l_opts[] = {
{"help", no_arg, 'h'},
{"hel", no_arg, 'h'},
- {"i", require_arg, 'i'}, /* input file */
- {"u", require_arg, 'u'}, /* user block file */
- {"o", require_arg, 'o'}, /* output file */
- {"clobber", no_arg, 'c'}, /* clobber existing UB */
+ {"i", require_arg, 'i'}, /* input file */
+ {"u", require_arg, 'u'}, /* user block file */
+ {"o", require_arg, 'o'}, /* output file */
+ {"clobber", no_arg, 'c'}, /* clobber existing UB */
{"clobbe", no_arg, 'c'},
{"clobb", no_arg, 'c'},
{"clob", no_arg, 'c'},
@@ -72,11 +72,11 @@ usage (const char *prog)
{
fflush (stdout);
fprintf (stdout,
- "usage: %s -u user_block_file -i h5_file [-o ofile | --clobber] \n",
- prog);
+ "usage: %s -u user_block_file -i h5_file [-o ofile | --clobber] \n",
+ prog);
fprintf (stdout, " Add 'user_block_file' to front of \n");
fprintf (stdout,
- " 'h5_file', pad so 'h5_file' starts on proper\n");
+ " 'h5_file', pad so 'h5_file' starts on proper\n");
fprintf (stdout, " byte.\n");
fprintf (stdout, "\n");
fprintf (stdout, " %s -h \n", prog);
@@ -86,6 +86,31 @@ usage (const char *prog)
}
+
+/*-------------------------------------------------------------------------
+ * Function: leave
+ *
+ * Purpose: Shutdown and call exit()
+ *
+ * Return: Does not return
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+ if (ub_file)
+ HDfree (ub_file);
+ if (input_file)
+ HDfree (input_file);
+ if (output_file)
+ HDfree (output_file);
+
+ h5tools_close();
+
+ exit(ret);
+}
+
/*-------------------------------------------------------------------------
* Function: parse_command_line
*
@@ -111,30 +136,30 @@ parse_command_line (int argc, const char *argv[])
while ((opt = get_option (argc, argv, s_opts, l_opts)) != EOF)
{
switch ((char) opt)
- {
- case 'o':
- output_file = HDstrdup (opt_arg);
- break;
- case 'i':
- input_file = HDstrdup (opt_arg);
- break;
- case 'u':
- ub_file = HDstrdup (opt_arg);
- break;
- case 'c':
- do_clobber = TRUE;
- break;
- case 'h':
- usage (h5tools_getprogname());
- exit (EXIT_SUCCESS);
- case 'V':
- print_version (h5tools_getprogname());
- exit (EXIT_SUCCESS);
- case '?':
- default:
- usage (h5tools_getprogname());
- exit (EXIT_FAILURE);
- }
+ {
+ case 'o':
+ output_file = HDstrdup (opt_arg);
+ break;
+ case 'i':
+ input_file = HDstrdup (opt_arg);
+ break;
+ case 'u':
+ ub_file = HDstrdup (opt_arg);
+ break;
+ case 'c':
+ do_clobber = TRUE;
+ break;
+ case 'h':
+ usage (h5tools_getprogname());
+ leave (EXIT_SUCCESS);
+ case 'V':
+ print_version (h5tools_getprogname());
+ leave (EXIT_SUCCESS);
+ case '?':
+ default:
+ usage (h5tools_getprogname());
+ leave (EXIT_FAILURE);
+ }
}
}
@@ -155,204 +180,197 @@ parse_command_line (int argc, const char *argv[])
int
main (int argc, const char *argv[])
{
- int ufid;
- int h5fid;
- int ofid;
- void *edata;
- H5E_auto2_t func;
- hid_t ifile;
- hid_t plist;
- herr_t status;
- htri_t testval;
- hsize_t usize;
- hsize_t h5fsize;
- hsize_t startub;
- hsize_t where;
- hsize_t newubsize;
- off_t fsize;
- h5_stat_t sbuf;
- h5_stat_t sbuf2;
- int res;
-
- h5tools_setprogname(PROGRAMNAME);
- h5tools_setstatus(EXIT_SUCCESS);
-
- /* Disable error reporting */
- H5Eget_auto2(H5E_DEFAULT, &func, &edata);
- H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
-
- parse_command_line (argc, argv);
-
- if (ub_file == NULL)
- {
- /* no user block */
- error_msg("no user block file name\n");
- usage (h5tools_getprogname());
- exit (EXIT_FAILURE);
+ int ufid = -1;
+ int h5fid = -1;
+ int ofid = -1;
+ void *edata;
+ H5E_auto2_t func;
+ hid_t ifile = -1;
+ hid_t plist = -1;
+ herr_t status;
+ htri_t testval;
+ hsize_t usize;
+ hsize_t h5fsize;
+ hsize_t startub;
+ hsize_t where;
+ hsize_t newubsize;
+ off_t fsize;
+ h5_stat_t sbuf;
+ h5_stat_t sbuf2;
+ int res;
+
+ h5tools_setprogname(PROGRAMNAME);
+ h5tools_setstatus(EXIT_SUCCESS);
+
+ /* Disable error reporting */
+ H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+ H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+ parse_command_line (argc, argv);
+
+ if (ub_file == NULL) {
+ /* no user block */
+ error_msg("no user block file name\n");
+ usage (h5tools_getprogname());
+ leave (EXIT_FAILURE);
}
- if (input_file == NULL)
- {
- /* no user block */
- error_msg("no HDF5 file\n");
- usage (h5tools_getprogname());
- exit (EXIT_FAILURE);
+ if (input_file == NULL) {
+ /* no user block */
+ error_msg("no HDF5 file\n");
+ usage (h5tools_getprogname());
+ leave (EXIT_FAILURE);
}
- testval = H5Fis_hdf5 (input_file);
+ testval = H5Fis_hdf5 (input_file);
- if (testval <= 0)
- {
- error_msg("Input HDF5 file is not HDF \"%s\"\n", input_file);
- exit (EXIT_FAILURE);
+ if (testval <= 0) {
+ error_msg("Input HDF5 file is not HDF \"%s\"\n", input_file);
+ leave (EXIT_FAILURE);
}
- ifile = H5Fopen (input_file, H5F_ACC_RDONLY, H5P_DEFAULT);
+ ifile = H5Fopen (input_file, H5F_ACC_RDONLY, H5P_DEFAULT);
- if (ifile < 0)
- {
- error_msg("Can't open input HDF5 file \"%s\"\n", input_file);
- exit (EXIT_FAILURE);
+ if (ifile < 0) {
+ error_msg("Can't open input HDF5 file \"%s\"\n", input_file);
+ leave (EXIT_FAILURE);
}
- plist = H5Fget_create_plist (ifile);
- if (plist < 0)
- {
- error_msg("Can't get file creation plist for file \"%s\"\n",
- input_file);
- exit (EXIT_FAILURE);
+ plist = H5Fget_create_plist (ifile);
+ if (plist < 0) {
+ error_msg("Can't get file creation plist for file \"%s\"\n", input_file);
+ H5Fclose(ifile);
+ leave (EXIT_FAILURE);
}
- status = H5Pget_userblock (plist, &usize);
- if (status < 0)
- {
- error_msg("Can't get user block for file \"%s\"\n",
- input_file);
- exit (EXIT_FAILURE);
+ status = H5Pget_userblock (plist, &usize);
+ if (status < 0) {
+ error_msg("Can't get user block for file \"%s\"\n", input_file);
+ H5Pclose(plist);
+ H5Fclose(ifile);
+ leave (EXIT_FAILURE);
}
- H5Pclose(plist);
- H5Fclose(ifile);
+ H5Pclose(plist);
+ H5Fclose(ifile);
- ufid = HDopen(ub_file, O_RDONLY, 0);
- if(ufid < 0) {
- error_msg("unable to open user block file \"%s\"\n",
- ub_file);
- exit (EXIT_FAILURE);
+ ufid = HDopen(ub_file, O_RDONLY, 0);
+ if(ufid < 0) {
+ error_msg("unable to open user block file \"%s\"\n", ub_file);
+ leave (EXIT_FAILURE);
}
- res = HDfstat(ufid, &sbuf);
- if(res < 0) {
- error_msg("Can't stat file \"%s\"\n", ub_file);
- exit (EXIT_FAILURE);
+ res = HDfstat(ufid, &sbuf);
+ if(res < 0) {
+ error_msg("Can't stat file \"%s\"\n", ub_file);
+ HDclose (ufid);
+ leave (EXIT_FAILURE);
}
- fsize = sbuf.st_size;
+ fsize = sbuf.st_size;
- h5fid = HDopen(input_file, O_RDONLY, 0);
- if(h5fid < 0) {
- error_msg("unable to open HDF5 file for read \"%s\"\n",
- input_file);
- exit (EXIT_FAILURE);
+ h5fid = HDopen(input_file, O_RDONLY, 0);
+ if(h5fid < 0) {
+ error_msg("unable to open HDF5 file for read \"%s\"\n", input_file);
+ HDclose (ufid);
+ leave (EXIT_FAILURE);
}
- res = HDfstat(h5fid, &sbuf2);
- if(res < 0) {
- error_msg("Can't stat file \"%s\"\n", input_file);
- exit (EXIT_FAILURE);
+ res = HDfstat(h5fid, &sbuf2);
+ if(res < 0) {
+ error_msg("Can't stat file \"%s\"\n", input_file);
+ HDclose (h5fid);
+ HDclose (ufid);
+ leave (EXIT_FAILURE);
}
- h5fsize = sbuf2.st_size;
+ h5fsize = sbuf2.st_size;
- if (output_file == NULL)
- {
- ofid = HDopen (input_file, O_WRONLY, 0);
-
- if (ofid < 0)
- {
- error_msg("unable to open output file \"%s\"\n",
- output_file);
- exit (EXIT_FAILURE);
- }
+ if (output_file == NULL) {
+ ofid = HDopen (input_file, O_WRONLY, 0);
+
+ if (ofid < 0) {
+ error_msg("unable to open output file \"%s\"\n", output_file);
+ HDclose (h5fid);
+ HDclose (ufid);
+ leave (EXIT_FAILURE);
+ }
}
- else
- {
- ofid = HDopen (output_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-
- if (ofid < 0)
- {
- error_msg("unable to create output file \"%s\"\n",
- output_file);
- exit (EXIT_FAILURE);
- }
+ else {
+ ofid = HDopen (output_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+
+ if (ofid < 0) {
+ error_msg("unable to create output file \"%s\"\n", output_file);
+ HDclose (h5fid);
+ HDclose (ufid);
+ leave (EXIT_FAILURE);
+ }
}
- newubsize = compute_user_block_size ((hsize_t) fsize);
-
- startub = usize;
-
- if (usize > 0)
- {
- if (do_clobber == TRUE)
- {
- /* where is max of the current size or the new UB */
- if (usize > newubsize)
- {
- newubsize = usize;
- }
- startub = 0; /*blast the old */
- }
- else
- {
- /* add new ub to current ublock, pad to new offset */
- newubsize += usize;
- newubsize = compute_user_block_size ((hsize_t) newubsize);
- }
+ newubsize = compute_user_block_size ((hsize_t) fsize);
+
+ startub = usize;
+
+ if (usize > 0) {
+ if (do_clobber == TRUE) {
+ /* where is max of the current size or the new UB */
+ if (usize > newubsize) {
+ newubsize = usize;
+ }
+ startub = 0; /*blast the old */
+ }
+ else {
+ /* add new ub to current ublock, pad to new offset */
+ newubsize += usize;
+ newubsize = compute_user_block_size ((hsize_t) newubsize);
+ }
}
- /* copy the HDF5 from starting at usize to starting at newubsize:
- * makes room at 'from' for new ub */
- /* if no current ub, usize is 0 */
- copy_some_to_file (h5fid, ofid, usize, newubsize,
- (ssize_t) (h5fsize - usize));
+ /* copy the HDF5 from starting at usize to starting at newubsize:
+ * makes room at 'from' for new ub */
+ /* if no current ub, usize is 0 */
+ copy_some_to_file (h5fid, ofid, usize, newubsize, (ssize_t) (h5fsize - usize));
- /* copy the old ub to the beginning of the new file */
- if (!do_clobber)
- {
- where =
- copy_some_to_file (h5fid, ofid, (hsize_t) 0, (hsize_t) 0,
- (ssize_t) usize);
+ /* copy the old ub to the beginning of the new file */
+ if (!do_clobber) {
+ where = copy_some_to_file (h5fid, ofid, (hsize_t) 0, (hsize_t) 0, (ssize_t) usize);
}
- /* copy the new ub to the end of the ub */
- where = copy_some_to_file (ufid, ofid, (hsize_t) 0, startub, (ssize_t) - 1);
-
- /* pad the ub */
- where = write_pad (ofid, where);
+ /* copy the new ub to the end of the ub */
+ where = copy_some_to_file (ufid, ofid, (hsize_t) 0, startub, (ssize_t) - 1);
+ /* pad the ub */
+ where = write_pad (ofid, where);
- HDclose (ufid);
- HDclose (h5fid);
- HDclose (ofid);
+ if (ub_file)
+ HDfree (ub_file);
+ if (input_file)
+ HDfree (input_file);
+ if (output_file)
+ HDfree (output_file);
+
+ if (ufid >= 0) HDclose (ufid);
+ if (h5fid >= 0) HDclose (h5fid);
+ if (ofid >= 0) HDclose (ofid);
- return h5tools_getstatus();
+ return h5tools_getstatus();
}
/*-------------------------------------------------------------------------
* Function: copy_some_to_file
*
* Purpose: Copy part of the input file to output.
- * infid: fd of file to read
- * outfid: fd of file to write
- * startin: offset of where to read from infid
- * startout: offset of where to write to outfid
- * limit: bytes to read/write
+ * infid: fd of file to read
+ * outfid: fd of file to write
+ * startin: offset of where to read from infid
+ * startout: offset of where to write to outfid
+ * limit: bytes to read/write
*
- * If limit is < 0, the entire input file is copied.
+ * If limit is < 0, the entire input file is copied.
*
- * Note: this routine can be used to copy within
- * the same file, i.e., infid and outfid can be the
- * same file.
+ * Note: this routine can be used to copy within
+ * the same file, i.e., infid and outfid can be the
+ * same file.
*
* Return: Success: last byte written in the output.
* Failure: Exits program with EXIT_FAILURE value.
@@ -365,7 +383,7 @@ main (int argc, const char *argv[])
*/
hsize_t
copy_some_to_file (int infid, int outfid, hsize_t startin, hsize_t startout,
- ssize_t limit)
+ ssize_t limit)
{
char buf[1024];
h5_stat_t sbuf;
@@ -390,9 +408,9 @@ copy_some_to_file (int infid, int outfid, hsize_t startin, hsize_t startout,
if(limit < 0) {
res = HDfstat(infid, &sbuf);
if(res < 0) {
- error_msg("Can't stat file \n");
- exit (EXIT_FAILURE);
- }
+ error_msg("Can't stat file \n");
+ exit (EXIT_FAILURE);
+ }
howmuch = sbuf.st_size;
}
@@ -424,19 +442,19 @@ copy_some_to_file (int infid, int outfid, hsize_t startin, hsize_t startout,
HDlseek (infid, (off_t) from, SEEK_SET);
if (howmuch > 512)
- {
- nchars = HDread (infid, buf, (unsigned) 512);
- }
+ {
+ nchars = HDread (infid, buf, (unsigned) 512);
+ }
else
- {
- nchars = HDread (infid, buf, (unsigned)howmuch);
- }
+ {
+ nchars = HDread (infid, buf, (unsigned)howmuch);
+ }
if (nchars <= 0)
- {
- printf ("huh? \n");
- exit (EXIT_FAILURE);
- }
+ {
+ printf ("huh? \n");
+ exit (EXIT_FAILURE);
+ }
/*ncw = */ HDwrite (outfid, buf, (unsigned) nchars);
/* assert (ncw == nchars) */
@@ -444,15 +462,15 @@ copy_some_to_file (int infid, int outfid, hsize_t startin, hsize_t startout,
tot += nchars;
howmuch -= nchars;
if (howmuch > 512)
- {
- to -= nchars;
- from -= nchars;
- }
+ {
+ to -= nchars;
+ from -= nchars;
+ }
else
- {
- to -= howmuch;
- from -= howmuch;
- }
+ {
+ to -= howmuch;
+ from -= howmuch;
+ }
}
/* assert howmuch == 0 */
@@ -467,10 +485,10 @@ copy_some_to_file (int infid, int outfid, hsize_t startin, hsize_t startout,
*
* Purpose: Find the offset of the HDF5 header after the user block:
* align at 0, 512, 1024, etc.
- * ublock_size: the size of the user block (bytes).
+ * ublock_size: the size of the user block (bytes).
*
* Return: Success: the location of the header == the size of the
- * padded user block.
+ * padded user block.
* Failure: none
*
* Return: Success: last byte written in the output.
@@ -520,6 +538,6 @@ write_pad(int ofile, hsize_t where)
for(i = 0; i < psize; i++)
HDwrite (ofile, buf, 1);
- return(where + psize); /* the new size of the file. */
+ return(where + psize); /* the new size of the file. */
}
diff --git a/tools/h5jam/h5unjam.c b/tools/h5jam/h5unjam.c
index bfebc6c..d3b36a9 100644
--- a/tools/h5jam/h5unjam.c
+++ b/tools/h5jam/h5unjam.c
@@ -42,10 +42,10 @@ static const char *s_opts = "hu:i:o:d:V";
static struct long_options l_opts[] = {
{ "help", no_arg, 'h' },
{ "hel", no_arg, 'h' },
- {"i", require_arg, 'i'}, /* input file */
- {"u", require_arg, 'u'}, /* user block file */
- {"o", require_arg, 'o'}, /* output file */
- {"delete", no_arg, 'd'}, /* delete ub */
+ {"i", require_arg, 'i'}, /* input file */
+ {"u", require_arg, 'u'}, /* user block file */
+ {"o", require_arg, 'o'}, /* output file */
+ {"delete", no_arg, 'd'}, /* delete ub */
{"delet", no_arg, 'd'},
{"dele", no_arg, 'd'},
{"del", no_arg, 'd'},
@@ -81,6 +81,30 @@ usage(const char *prog)
}
/*-------------------------------------------------------------------------
+ * Function: leave
+ *
+ * Purpose: Shutdown and call exit()
+ *
+ * Return: Does not return
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+ if (ub_file)
+ HDfree (ub_file);
+ if (input_file)
+ HDfree (input_file);
+ if (output_file)
+ HDfree (output_file);
+
+ h5tools_close();
+
+ exit(ret);
+}
+
+/*-------------------------------------------------------------------------
* Function: parse_command_line
*
* Purpose: Parse the command line for the h5dumper.
@@ -99,33 +123,33 @@ usage(const char *prog)
static void
parse_command_line(int argc, const char *argv[])
{
- int opt = FALSE;
+ int opt = FALSE;
/* 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;
- case 'i':
- input_file = HDstrdup (opt_arg);
- break;
- case 'u':
- ub_file = HDstrdup (opt_arg);
- break;
- case 'd':
- do_delete = TRUE;
- break;
- case 'h':
- usage(h5tools_getprogname());
- exit(EXIT_SUCCESS);
- case 'V':
- print_version (h5tools_getprogname());
- exit (EXIT_SUCCESS);
- case '?':
- default:
- usage(h5tools_getprogname());
- exit(EXIT_FAILURE);
+ switch ((char) opt) {
+ case 'o':
+ output_file = HDstrdup (opt_arg);
+ break;
+ case 'i':
+ input_file = HDstrdup (opt_arg);
+ break;
+ case 'u':
+ ub_file = HDstrdup (opt_arg);
+ break;
+ case 'd':
+ do_delete = TRUE;
+ break;
+ case 'h':
+ usage(h5tools_getprogname());
+ leave(EXIT_SUCCESS);
+ case 'V':
+ print_version(h5tools_getprogname());
+ leave(EXIT_SUCCESS);
+ case '?':
+ default:
+ usage(h5tools_getprogname());
+ leave(EXIT_FAILURE);
}
}
@@ -156,19 +180,19 @@ parse_command_line(int argc, const char *argv[])
int
main(int argc, const char *argv[])
{
- int ifid;
- int ufid;
- int h5fid;
+ int ifid = -1;
+ int ufid = -1;
+ int h5fid = -1;
void *edata;
- H5E_auto2_t func;
- hid_t ifile;
- off_t fsize;
- hsize_t usize;
- htri_t testval;
- herr_t status;
- hid_t plist;
- int res;
- h5_stat_t sbuf;
+ H5E_auto2_t func;
+ hid_t ifile = -1;
+ hid_t plist = -1;
+ off_t fsize;
+ hsize_t usize;
+ htri_t testval;
+ herr_t status;
+ int res;
+ h5_stat_t sbuf;
h5tools_setprogname(PROGRAMNAME);
h5tools_setstatus(EXIT_SUCCESS);
@@ -183,63 +207,75 @@ main(int argc, const char *argv[])
if (testval <= 0) {
error_msg("Input HDF5 file is not HDF \"%s\"\n", input_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
ifile = H5Fopen(input_file, H5F_ACC_RDONLY , H5P_DEFAULT);
if (ifile < 0) {
error_msg("Can't open input HDF5 file \"%s\"\n", input_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
plist = H5Fget_create_plist(ifile);
if (plist < 0) {
error_msg("Can't get file creation plist for file \"%s\"\n", input_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
- status = H5Pget_userblock(plist, & usize );
+ status = H5Pget_userblock(plist, & usize);
if (status < 0) {
error_msg("Can't get user block for file \"%s\"\n", input_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
+ H5Pclose(plist);
+ H5Fclose(ifile);
+
if (usize == 0) {
- /* no user block to remove: message? */
+ /* no user block to remove: message? */
error_msg("\"%s\" has no user block: no change to file\n", input_file);
- exit(EXIT_SUCCESS);
-
+ h5tools_setstatus(EXIT_SUCCESS);
+ goto done;
}
ifid = HDopen(input_file,O_RDONLY,0);
if(ifid < 0) {
error_msg("unable to open input HDF5 file \"%s\"\n", input_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
res = HDfstat(ifid, &sbuf);
if(res < 0) {
error_msg("Can't stat file \"%s\"\n", input_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
fsize = sbuf.st_size;
if (do_delete && (ub_file != NULL)) {
- error_msg("??\"%s\"\n", ub_file);
- exit(EXIT_FAILURE);
+ error_msg("??\"%s\"\n", ub_file);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
if (ub_file == NULL) {
- /* write to sdtout */
- ufid = HDdup(1);
- } else {
+ /* 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);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
}
@@ -248,23 +284,27 @@ main(int argc, const char *argv[])
if (h5fid < 0) {
error_msg("unable to open output HDF5 file \"%s\"\n", input_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
- } else {
+ }
+ 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);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
}
/* 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(ifid, ufid, 0, (ssize_t) usize) < 0) {
error_msg("unable to copy user block to output file \"%s\"\n", ub_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
}
@@ -273,13 +313,22 @@ main(int argc, const char *argv[])
*/
if(copy_to_file(ifid, h5fid, (ssize_t) usize, (ssize_t)(fsize - (ssize_t)usize)) < 0) {
error_msg("unable to copy hdf5 data to output file \"%s\"\n", output_file);
- exit(EXIT_FAILURE);
+ h5tools_setstatus(EXIT_FAILURE);
+ goto done;
}
+done:
+ if (ub_file) {
+ HDfree (ub_file);
+ if (ufid >= 0) HDclose(ufid);
+ }
+ if (input_file)
+ HDfree (input_file);
+ if (output_file)
+ HDfree (output_file);
- HDclose(ufid);
- HDclose(h5fid);
- HDclose(ifid);
+ if (h5fid >= 0) HDclose(h5fid);
+ if (ifid >= 0) HDclose(ifid);
return h5tools_getstatus();
}
diff --git a/tools/h5jam/testfiles/h5jam-help.txt b/tools/h5jam/testfiles/h5jam-help.txt
new file mode 100644
index 0000000..f5d1f19
--- /dev/null
+++ b/tools/h5jam/testfiles/h5jam-help.txt
@@ -0,0 +1,9 @@
+usage: h5jam -u user_block_file -i h5_file [-o ofile | --clobber]
+ Add 'user_block_file' to front of
+ 'h5_file', pad so 'h5_file' starts on proper
+ byte.
+
+ h5jam -h
+ Print a usage message and exit
+ h5jam -V
+ Print HDF5 library version and exit
diff --git a/tools/h5jam/testfiles/h5unjam-help.txt b/tools/h5jam/testfiles/h5unjam-help.txt
new file mode 100644
index 0000000..3eb73c5
--- /dev/null
+++ b/tools/h5jam/testfiles/h5unjam-help.txt
@@ -0,0 +1,7 @@
+usage: h5unjam -i h5_file -o user_block_file_out -o h5_file_out [-d | --delete]
+ Extract user block from 'h5_file' into 'user_block_file'
+ and HDF5 file into 'h5_file_out'
+ h5unjam -h
+ Print a usage message and exit
+ h5unjam -V
+ Print HDF5 library version and exit