diff options
author | Robb Matzke <matzke@llnl.gov> | 1998-09-22 15:27:26 (GMT) |
---|---|---|
committer | Robb Matzke <matzke@llnl.gov> | 1998-09-22 15:27:26 (GMT) |
commit | 6d9af583912f6cd35cdac05283740fdccc489cc4 (patch) | |
tree | 9c55a12cac6cdc6e7db890ce9f12e8fbbdd0bd39 /tools/h5tools.c | |
parent | b20de8612aac8f94916dd7813bec0c398c9bff4f (diff) | |
download | hdf5-6d9af583912f6cd35cdac05283740fdccc489cc4.zip hdf5-6d9af583912f6cd35cdac05283740fdccc489cc4.tar.gz hdf5-6d9af583912f6cd35cdac05283740fdccc489cc4.tar.bz2 |
[svn-r714] Changes since 19980911
----------------------
This checkin is to fix a couple bugs for Jim Reus. Some features are
not fully implemented but it shouldn't break anything.
./config/conclude.in
./test/Makefile.in
`make clean' removes object files from the test directory as
well as a couple more *.h5 temp files.
./config/hpux9.03 [NEW]
New config file for HP/UX 9.03
./src/H5B.c
./src/H5Bprivate.h
./src/H5Fistore.c
./src/H5G.c
./src/H5Gnode.c
./src/H5Gpkg.h
./src/H5Gprivate.h
./src/H5Gstab.c
Not-yet-complete version of object removal.
./src/H5Fistore.c
./src/H5Fprivate.h
Experimental optimizations, disabled by default.
./src/H5Fprivate.h
Default low-level driver was changed to H5F_LOW_SEC instead of
H5F_LOW_STDIO because the sec2 driver is much easier to debug.
./src/H5Fsplit.c
./src/H5G.c
./src/H5Z.c
Changed a couple return statements to HRETURN.
./src/H5Odtype.c
Removed a check for nested compound data types from back when
they weren't implemented that raised an error.
./tools/h5tools.c
Increased temp buffer sizes and added a check for buffer
overflow so we fail an assertion (hopefully). This really
needs to be fixed sometime.
Added support for printing H5T_STRING data types.
Diffstat (limited to 'tools/h5tools.c')
-rw-r--r-- | tools/h5tools.c | 100 |
1 files changed, 97 insertions, 3 deletions
diff --git a/tools/h5tools.c b/tools/h5tools.c index 3994c57..d3cc110 100644 --- a/tools/h5tools.c +++ b/tools/h5tools.c @@ -108,14 +108,19 @@ static void h5dump_sprint(char *s/*out*/, const h5dump_t *info, hid_t type, void *vp) { size_t i, n, offset, size, dims[4], nelmts; - char temp[1024], *name; + unsigned overflow = 0xaaaaaaaa; + char temp[8192]; + char *name, quote='\0'; hid_t memb; int nmembs, j, k, ndims; + const int repeat_threshold = 8; if (H5Tequal(type, H5T_NATIVE_DOUBLE)) { sprintf(temp, "%g", *((double*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_FLOAT)) { sprintf(temp, "%g", *((float*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_CHAR) || H5Tequal(type, H5T_NATIVE_UCHAR)) { switch (*((char*)vp)) { @@ -145,18 +150,93 @@ h5dump_sprint(char *s/*out*/, const h5dump_t *info, hid_t type, void *vp) else sprintf(temp, "\\%03o", *((unsigned char*)vp)); break; } + + } else if (H5T_STRING==H5Tget_class(type)) { + size = H5Tget_size(type); + temp[0] = '\0'; + quote = '\0'; + + for (i=0; i<size; i++) { + + /* Count how many times the next character repeats */ + j=1; + while (i+j<size && ((char*)vp)[i]==((char*)vp)[i+j]) j++; + + /* + * Print the opening quote. If the repeat count is high enough + * to warrant printing the number of repeats instead of + * enumerating the characters, then make sure the character to be + * repeated is in it's own quote. + */ + if (j>repeat_threshold) { + if (quote) sprintf(temp+strlen(temp), "%c", quote); + quote = '\''; + sprintf(temp+strlen(temp), "%s%c", i?" ":"", quote); + } else if (!quote) { + quote = '"'; + sprintf(temp+strlen(temp), "%s%c", i?" ":"", quote); + } + + /* Print the character */ + switch (((char*)vp)[i]) { + case '"': + strcat(temp, "\\\""); + break; + case '\\': + strcat(temp, "\\\\"); + break; + case '\b': + strcat(temp, "\\b"); + break; + case '\f': + strcat(temp, "\\f"); + break; + case '\n': + strcat(temp, "\\n"); + break; + case '\r': + strcat(temp, "\\r"); + break; + case '\t': + strcat(temp, "\\t"); + break; + default: + if (isprint(((char*)vp)[i])) { + sprintf(temp+strlen(temp), "%c", ((char*)vp)[i]); + } else { + sprintf(temp+strlen(temp), "\\%03o", + ((unsigned char*)vp)[i]); + } + break; + } + + /* Print the repeat count */ + if (j>repeat_threshold) { + sprintf(temp+strlen(temp), "%c repeats %d times", quote, j-1); + quote = '\0'; + i += j-1; + } + } + if (quote) sprintf(temp+strlen(temp), "%c", quote); + } else if (H5Tequal(type, H5T_NATIVE_SHORT)) { sprintf(temp, "%d", *((short*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_USHORT)) { sprintf(temp, "%u", *((unsigned short*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_INT)) { sprintf(temp, "%d", *((int*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_UINT)) { sprintf(temp, "%u", *((unsigned*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_LONG)) { sprintf(temp, "%ld", *((long*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_ULONG)) { sprintf(temp, "%lu", *((unsigned long*)vp)); + } else if (H5Tequal(type, H5T_NATIVE_HSSIZE)) { if (sizeof(hssize_t)==sizeof(long)) { sprintf(temp, "%ld", *((long*)vp)); @@ -167,6 +247,7 @@ h5dump_sprint(char *s/*out*/, const h5dump_t *info, hid_t type, void *vp) strcat(fmt, "d"); sprintf(temp, fmt, *((long long*)vp)); } + } else if (H5Tequal(type, H5T_NATIVE_HSIZE)) { if (sizeof(hsize_t)==sizeof(long)) { sprintf(temp, "%lu", *((unsigned long*)vp)); @@ -177,6 +258,7 @@ h5dump_sprint(char *s/*out*/, const h5dump_t *info, hid_t type, void *vp) strcat(fmt, "u"); sprintf(temp, fmt, *((unsigned long long*)vp)); } + } else if (H5T_COMPOUND==H5Tget_class(type)) { nmembs = H5Tget_nmembers(type); strcpy(temp, OPT(info->cmpd_pre, "{")); @@ -206,6 +288,7 @@ h5dump_sprint(char *s/*out*/, const h5dump_t *info, hid_t type, void *vp) H5Tclose(memb); } strcat(temp, OPT(info->cmpd_suf, "}")); + } else { strcpy(temp, "0x"); n = H5Tget_size(type); @@ -215,6 +298,12 @@ h5dump_sprint(char *s/*out*/, const h5dump_t *info, hid_t type, void *vp) } sprintf(s, OPT(info->elmt_fmt, "%s"), temp); + + /* + * We should really fix this so it's not possible to overflow the `temp' + * buffer. + */ + assert(overflow==0xaaaaaaaa); } @@ -250,7 +339,7 @@ h5dump_simple(FILE *stream, const h5dump_t *info, hid_t dset, hid_t p_type) hsize_t p_max_idx[8]; /*max selected index */ size_t p_type_nbytes; /*size of memory type */ hsize_t p_nelmts; /*total selected elmts */ - char p_buf[256]; /*output string */ + char p_buf[8192]; /*output string */ size_t p_column=0; /*output column */ size_t p_ncolumns=80; /*default num columns */ char p_prefix[1024]; /*line prefix string */ @@ -444,6 +533,12 @@ h5dump_fixtype(hid_t f_type) } break; + case H5T_STRING: + m_type = H5Tcopy(f_type); + H5Tset_cset(m_type, H5T_CSET_ASCII); + H5Tset_strpad(m_type, H5T_STR_NULLPAD); + break; + case H5T_COMPOUND: /* * We have to do this in two steps. The first step scans the file @@ -494,7 +589,6 @@ h5dump_fixtype(hid_t f_type) break; case H5T_TIME: - case H5T_STRING: case H5T_BITFIELD: case H5T_OPAQUE: /* |