summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/h5repack/h5repack.c28
-rw-r--r--tools/h5repack/h5repack.h2
-rwxr-xr-xtools/h5repack/h5repack.sh.in4
-rw-r--r--tools/h5repack/h5repack_copy.c175
-rw-r--r--tools/h5repack/h5repack_main.c28
-rw-r--r--tools/h5repack/h5repacktst.c89
6 files changed, 310 insertions, 16 deletions
diff --git a/tools/h5repack/h5repack.c b/tools/h5repack/h5repack.c
index febf7d7..3809377 100644
--- a/tools/h5repack/h5repack.c
+++ b/tools/h5repack/h5repack.c
@@ -384,8 +384,12 @@ static int check_options(pack_opt_t *options)
is present with other objects\n");
return -1;
}
-
- /* check options for the latest format */
+
+ /*-------------------------------------------------------------------------
+ * check options for the latest format
+ *-------------------------------------------------------------------------
+ */
+
if (options->grp_compact < 0) {
error_msg(progname, "invalid maximum number of links to store as header messages\n");
return -1;
@@ -404,6 +408,26 @@ static int check_options(pack_opt_t *options)
return -1;
}
}
+
+
+ /*-------------------------------------------------------------------------
+ * verify new user userblock options
+ *-------------------------------------------------------------------------
+ */
+ if ( options->ublock_filename != NULL && options->ublock_size == 0 )
+ {
+ error_msg(progname, "user block size missing for file %s\n",
+ options->ublock_filename);
+ return -1;
+ }
+
+ if ( options->ublock_filename == NULL && options->ublock_size != 0 )
+ {
+ error_msg(progname, "file name missing for user block\n",
+ options->ublock_filename);
+ return -1;
+ }
+
return 0;
}
diff --git a/tools/h5repack/h5repack.h b/tools/h5repack/h5repack.h
index 80fb1b0..42b9bbc 100644
--- a/tools/h5repack/h5repack.h
+++ b/tools/h5repack/h5repack.h
@@ -106,6 +106,8 @@ typedef struct {
int grp_indexed; /* Set the minimum number of links to store in the indexed format */
int msg_size[8]; /* Minumum size of shared messages: dataspace,
datatype, fill value, filter pipleline, attribute */
+ const char *ublock_filename; /* user block file name */
+ int ublock_size; /* user block size */
} pack_opt_t;
diff --git a/tools/h5repack/h5repack.sh.in b/tools/h5repack/h5repack.sh.in
index 0d3c7d4..fdd93da 100755
--- a/tools/h5repack/h5repack.sh.in
+++ b/tools/h5repack/h5repack.sh.in
@@ -490,6 +490,10 @@ else
TOOLTEST0 $arg
fi
+# add a userblock to file
+arg="$FILE1 -u ublock.bin -b 2048"
+TOOLTEST $arg
+
if test $nerrors -eq 0 ; then
echo "All $H5REPACK tests passed."
diff --git a/tools/h5repack/h5repack_copy.c b/tools/h5repack/h5repack_copy.c
index 73b201e..3bff946 100644
--- a/tools/h5repack/h5repack_copy.c
+++ b/tools/h5repack/h5repack_copy.c
@@ -23,6 +23,10 @@
extern char *progname;
+#if 0
+#define H5REPACK_DEBUG
+#endif
+
/*-------------------------------------------------------------------------
* macros
*-------------------------------------------------------------------------
@@ -39,6 +43,7 @@ static void print_dataset_info(hid_t dcpl_id,char *objname,double per, int pr);
static int do_copy_objects(hid_t fidin,hid_t fidout,trav_table_t *travt,pack_opt_t *options);
static int copy_attr(hid_t loc_in,hid_t loc_out,pack_opt_t *options);
static int copy_user_block(const char *infile, const char *outfile, hsize_t size);
+static void print_user_block(const char *filename, hid_t fid);
/*-------------------------------------------------------------------------
* Function: copy_objects
@@ -55,10 +60,12 @@ static int copy_user_block(const char *infile, const char *outfile, hsize_t si
* Peter Cao, June 13, 2007
* Add "-L, --latest" and other options to pack a file with the latest file format
*
- * Modification:
* Peter Cao, September 25, 2007
* Copy user block when repacking a file
*
+ * Pedro Vicente, August 20, 2008
+ * Add a user block to file if requested
+ *
*-------------------------------------------------------------------------
*/
@@ -84,7 +91,7 @@ int copy_objects(const char* fnamein,
/* get user block size */
{
- hid_t fcpl_in; /* File creation property list ID for input file */
+ hid_t fcpl_in; /* file creation property list ID for input file */
if((fcpl_in = H5Fget_create_plist(fidin)) < 0) {
error_msg(progname, "failed to retrieve file creation property list\n");
@@ -182,14 +189,84 @@ int copy_objects(const char* fnamein,
} /* end if */
} /* end if */
} /* end if */
+
+
+
+
+#if defined (H5REPACK_DEBUG)
+ print_user_block(fnamein,fidin);
+#endif
+
+
+ /*-------------------------------------------------------------------------
+ * set the new user userblock options in the FCPL (before H5Fcreate )
+ *-------------------------------------------------------------------------
+ */
- if((fidout = H5Fcreate(fnameout,H5F_ACC_TRUNC, fcpl, fapl)) < 0) {
+ if ( options->ublock_size > 0 && options->ublock_filename != NULL )
+ {
+ /* either use the FCPL already created or create a new one */
+ if(fcpl != H5P_DEFAULT)
+ {
+ /* set user block size */
+ if(H5Pset_userblock(fcpl, options->ublock_size) < 0)
+ {
+ error_msg(progname, "failed to set userblock size\n");
+ goto out;
+ }
+
+ }
+
+ else
+ {
+
+ /* create a file creation property list */
+ if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+ {
+ error_msg(progname, "fail to create a file creation property list\n");
+ goto out;
+ }
+
+ /* set user block size */
+ if(H5Pset_userblock(fcpl, options->ublock_size) < 0)
+ {
+ error_msg(progname, "failed to set userblock size\n");
+ goto out;
+ }
+
+ }
+
+
+
+ }
+
+ /*-------------------------------------------------------------------------
+ * create the output file
+ *-------------------------------------------------------------------------
+ */
+
+
+ if(options->verbose)
+ printf("Making file <%s>...\n",fnameout);
+
+
+ if((fidout = H5Fcreate(fnameout,H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+ {
error_msg(progname, "<%s>: Could not create file\n", fnameout );
goto out;
} /* end if */
- if(options->verbose)
- printf("Making file <%s>...\n",fnameout);
+
+ /*-------------------------------------------------------------------------
+ * write a new user block if requested
+ *-------------------------------------------------------------------------
+ */
+ if ( options->ublock_size > 0 && options->ublock_filename != NULL )
+ {
+ copy_user_block( options->ublock_filename, fnameout, options->ublock_size);
+ }
+
+
/* init table */
trav_table_init(&travt);
@@ -1240,3 +1317,91 @@ done:
return status;
}
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_user_block
+ *
+ * Purpose: print user block
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente
+ *
+ * Date: August, 20, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+void print_user_block(const char *filename, hid_t fid)
+{
+ int fh; /* file handle */
+ hsize_t ub_size; /* user block size */
+ hsize_t size; /* size read */
+ hid_t fcpl; /* file creation property list ID for HDF5 file */
+ int i;
+
+ /* get user block size */
+ if(( fcpl = H5Fget_create_plist(fid)) < 0)
+ {
+ error_msg(progname, "failed to retrieve file creation property list\n");
+ goto done;
+ }
+
+ if(H5Pget_userblock(fcpl, &ub_size) < 0)
+ {
+ error_msg(progname, "failed to retrieve userblock size\n");
+ goto done;
+ }
+
+ if(H5Pclose(fcpl) < 0)
+ {
+ error_msg(progname, "failed to close property list\n");
+ goto done;
+ }
+
+ /* open file */
+ if((fh = HDopen(filename, O_RDONLY, 0)) < 0)
+ {
+ goto done;
+ }
+
+ size = ub_size;
+
+ /* read file */
+ while(size > 0)
+ {
+ ssize_t nread; /* # of bytes read */
+ char rbuf[USERBLOCK_XFER_SIZE]; /* buffer for reading */
+
+ /* read buffer */
+ if(size > USERBLOCK_XFER_SIZE)
+ nread = HDread(fh, rbuf, (size_t)USERBLOCK_XFER_SIZE);
+ else
+ nread = HDread(fh, rbuf, (size_t)size);
+
+ for(i = 0; i < nread; i++)
+ {
+
+ printf("%c ", rbuf[i]);
+
+ }
+ printf("\n");
+
+ if(nread < 0)
+ {
+ goto done;
+ }
+
+
+ /* update size of userblock left to transfer */
+ size -= nread;
+ }
+
+done:
+ if(fh > 0)
+ HDclose(fh);
+
+
+ return;
+}
diff --git a/tools/h5repack/h5repack_main.c b/tools/h5repack/h5repack_main.c
index d512923..db0a87b 100644
--- a/tools/h5repack/h5repack_main.c
+++ b/tools/h5repack/h5repack_main.c
@@ -37,7 +37,7 @@ static int has_i_o = 0;
* Command-line options: The user can specify short or long-named
* parameters.
*/
-static const char *s_opts = "hVvf:l:m:e:nLc:d:s:";
+static const char *s_opts = "hVvf:l:m:e:nLc:d:s:u:b:";
static struct long_options l_opts[] = {
{ "help", no_arg, 'h' },
{ "version", no_arg, 'V' },
@@ -51,6 +51,8 @@ static struct long_options l_opts[] = {
{ "compact", require_arg, 'c' },
{ "indexed", require_arg, 'd' },
{ "ssize", require_arg, 's' },
+ { "ublock", require_arg, 'u' },
+ { "block", require_arg, 'b' },
{ NULL, 0, '\0' }
};
@@ -84,14 +86,16 @@ static struct long_options l_opts[] = {
* added support for multiple global filters
* PVN, May 16, 2008
* added backward compatibility for -i infile -o outfile
- *-------------------------------------------------------------------------
+ * PVN, August 20, 2008
+ * add a user block to file if requested (new switches -u -b)
+ *-------------------------------------------------------------------------
*/
int main(int argc, char **argv)
{
char *infile = NULL;
char *outfile = NULL;
pack_opt_t options; /*the global options */
- int ret;
+ int ret=-1;
int i;
/* initialize options */
@@ -284,7 +288,8 @@ int main(int argc, char **argv)
}
-
+
+
/* pack it */
ret=h5repack(infile,outfile,&options);
@@ -324,6 +329,8 @@ static void usage(const char *prog)
printf(" -s S[:F], --ssize=S[:F] Shared object header message minimum size\n");
printf(" -m T, --threshold=T Do not apply the filter to datasets smaller than T\n");
printf(" -e M, --file=M Name of file M with the -f and -l options\n");
+ printf(" -u U, --ublock=U Name of file U with user block data to be added\n");
+ printf(" -b D, --block=D Size of user block to be added\n");
printf(" -f FILT, --filter=FILT Filter type\n");
printf(" -l LAYT, --layout=LAYT Layout type\n");
@@ -331,7 +338,9 @@ static void usage(const char *prog)
printf(" T - is an integer greater than 1, size of dataset in bytes \n");
printf(" M - is a filename.\n");
+ printf(" U - is a filename.\n");
printf(" S - is an integer\n");
+ printf(" D - is the user block size (any power of 2 equal to 512 or greater)\n");
printf(" F - is the shared object header message type, any of <dspace|dtype|fill|\n");
printf(" pline|attr>. If F is not specified, S applies to all messages\n");
@@ -530,6 +539,17 @@ static void parse_command_line(int argc, const char* argv[], pack_opt_t* options
break;
+
+ case 'u':
+
+ options->ublock_filename = opt_arg;
+ break;
+
+ case 'b':
+
+ options->ublock_size = atoi( opt_arg );
+ break;
+
} /* switch */
diff --git a/tools/h5repack/h5repacktst.c b/tools/h5repack/h5repacktst.c
index 3796179..e7024f2 100644
--- a/tools/h5repack/h5repacktst.c
+++ b/tools/h5repack/h5repacktst.c
@@ -71,6 +71,9 @@
#define FNAME16 "h5repack_ub.h5"
#define FNAME16OUT "h5repack_ub_out.h5"
+#define FNAME_UB "ublock.bin"
+
+
const char *H5REPACK_FILENAMES[] = {
"h5repack_big_out",
@@ -123,7 +126,8 @@ int make_attr(hid_t loc_id,int rank,hsize_t *dims,const char *attr_name,hid_t ty
void make_dset_reg_ref(hid_t loc_id);
int make_external(hid_t loc_id);
static int make_userblock(void);
-static int verify_userblock(void);
+static int verify_userblock( const char* filename);
+static int make_userblock_file(void);
/*-------------------------------------------------------------------------
@@ -1332,7 +1336,7 @@ if (szip_can_encode) {
GOERROR;
if(h5repack_verify(FNAME16OUT, &pack_options) <= 0)
GOERROR;
- if(verify_userblock() < 0)
+ if(verify_userblock(FNAME16OUT) < 0)
GOERROR;
if(h5repack_end(&pack_options) < 0)
GOERROR;
@@ -1394,6 +1398,32 @@ if (szip_can_encode) {
#endif
+ /*-------------------------------------------------------------------------
+ * test file with userblock
+ *-------------------------------------------------------------------------
+ */
+ TESTING(" file with added userblock");
+ if(h5repack_init(&pack_options, 0) < 0)
+ GOERROR;
+
+ /* add the options for a user block size and user block filename */
+ pack_options.ublock_size = USERBLOCK_SIZE;
+ pack_options.ublock_filename = FNAME_UB;
+
+ if(h5repack(FNAME8, FNAME8OUT, &pack_options) < 0)
+ GOERROR;
+ if(h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if(h5repack_verify(FNAME8OUT, &pack_options) <= 0)
+ GOERROR;
+ if(verify_userblock(FNAME8OUT) < 0)
+ GOERROR;
+ if(h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
+
+
+
/*-------------------------------------------------------------------------
* clean temporary test files
*-------------------------------------------------------------------------
@@ -1600,6 +1630,13 @@ int make_testfiles(void)
if(make_userblock() < 0)
goto out;
+ /*-------------------------------------------------------------------------
+ * create a userblock file
+ *-------------------------------------------------------------------------
+ */
+ if(make_userblock_file() < 0)
+ goto out;
+
return 0;
out:
@@ -2879,7 +2916,7 @@ out:
*-------------------------------------------------------------------------
*/
static int
-verify_userblock(void)
+verify_userblock( const char* filename)
{
hid_t fid = -1;
hid_t fcpl = -1;
@@ -2890,7 +2927,7 @@ verify_userblock(void)
size_t u; /* Local index variable */
/* Open file with userblock */
- if((fid = H5Fopen(FNAME16OUT, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+ if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
goto out;
/* Retrieve file creation property list & userblock size */
@@ -2912,7 +2949,7 @@ verify_userblock(void)
/* Re-open HDF5 file, as "plain" file */
- if((fd = HDopen(FNAME16, O_RDONLY, 0)) < 0)
+ if((fd = HDopen(filename, O_RDONLY, 0)) < 0)
goto out;
/* Read userblock data */
@@ -2942,6 +2979,48 @@ out:
/*-------------------------------------------------------------------------
+ * Function: make_userblock_file
+ *
+ * Purpose: create a file for the userblock add test
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+make_userblock_file(void)
+{
+ hid_t fid = -1;
+ hid_t fcpl = -1;
+ int fd = -1; /* File descriptor for writing userblock */
+ char ub[USERBLOCK_SIZE]; /* User block data */
+ ssize_t nwritten; /* # of bytes written */
+ size_t u; /* Local index variable */
+
+ /* initialize userblock data */
+ for(u = 0; u < USERBLOCK_SIZE; u++)
+ ub[u] = 'a' + (u % 26);
+
+ /* open file */
+ if((fd = HDopen(FNAME_UB,O_WRONLY|O_CREAT|O_TRUNC, 0644 )) < 0)
+ goto out;
+
+ /* write userblock data */
+ nwritten = HDwrite(fd, ub, (size_t)USERBLOCK_SIZE);
+ assert(nwritten == USERBLOCK_SIZE);
+
+ /* close file */
+ HDclose(fd);
+
+ return 0;
+
+out:
+
+ if(fd > 0)
+ HDclose(fd);
+
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
* Function: write_dset_in
*
* Purpose: write datasets in LOC_ID