diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/h5tools.c | 181 |
1 files changed, 131 insertions, 50 deletions
diff --git a/tools/h5tools.c b/tools/h5tools.c index 2a54aff..01114ed 100644 --- a/tools/h5tools.c +++ b/tools/h5tools.c @@ -24,7 +24,14 @@ int indent = 0; int compound_data=0; - +int nCols = 80; +ProgType programtype = UNKNOWN; +static void display_numeric_data(hsize_t hs_nelmts, hid_t p_type, unsigned char *sm_buf, + size_t p_type_nbytes, hsize_t p_nelmts, hsize_t dim_n_size, hsize_t elmtno); +static void display_string(hsize_t hs_nelmts, hid_t p_type, unsigned char *sm_buf, + size_t p_type_nbytes, hsize_t p_nelmts, hsize_t dim_n_size, hsize_t elmtno); +static void display_compound_data(hsize_t hs_nelmts, hid_t p_type, unsigned char *sm_buf, + size_t p_type_nbytes, hsize_t p_nelmts, hsize_t elmtno); /* * If REPEAT_VERBOSE is defined then character strings will be printed so * that repeated character sequences like "AAAAAAAAAA" are displayed as @@ -456,7 +463,7 @@ h5dump_escape(char *s/*in,out*/, size_t size, int escape_spaces) */ static char * h5dump_sprint(h5dump_str_t *str/*in,out*/, const h5dump_t *info, - hid_t type, void *vp, const int repeat_threshold) + hid_t type, void *vp) { size_t i, n, offset, size, dims[H5S_MAX_RANK], nelmts, start; char *name, quote='\0'; @@ -464,7 +471,14 @@ h5dump_sprint(h5dump_str_t *str/*in,out*/, const h5dump_t *info, int nmembs, j, k, ndims; static char fmt_llong[8], fmt_ullong[8]; H5T_str_t pad; + int repeat_threshold; + if ((programtype == UNKNOWN) || (programtype == H5LS)) { + repeat_threshold = H5DEFAULT_REPEAT_THRESHOLD; + } + else if (programtype == H5DUMP){ + repeat_threshold = -1; + } /* Build default formats for long long types */ if (!fmt_llong[0]) { sprintf(fmt_llong, "%%%sd", PRINTF_LL_WIDTH); @@ -685,7 +699,7 @@ h5dump_sprint(h5dump_str_t *str/*in,out*/, const h5dump_t *info, OPT(info->arr_sep, "," OPTIONAL_LINE_BREAK)); } - h5dump_sprint(str, info, memb, (char*)vp+offset+i*size, repeat_threshold); + h5dump_sprint(str, info, memb, (char*)vp+offset+i*size); } if (nelmts>1) { h5dump_str_append(str, "%s", OPT(info->arr_suf, "]")); @@ -849,7 +863,7 @@ h5dump_simple_data(FILE *stream, const h5dump_t *info, /* Render the element */ h5dump_str_reset(&buffer); - h5dump_sprint(&buffer, info, type, mem+i*size, H5DEFAULT_REPEAT_THRESHOLD); + h5dump_sprint(&buffer, info, type, mem+i*size); if (i+1<nelmts || 0==(flags & END_OF_DATA)) { h5dump_str_append(&buffer, "%s", OPT(info->elmt_suf1, ",")); } @@ -955,7 +969,7 @@ h5dump_simple_data(FILE *stream, const h5dump_t *info, */ static int h5dump_simple_dset(FILE *stream, const h5dump_t *info, hid_t dset, - hid_t p_type) + hid_t p_type, int obj_data) { hid_t f_space; /*file data space */ hsize_t elmtno, i; /*counters */ @@ -980,7 +994,7 @@ h5dump_simple_dset(FILE *stream, const h5dump_t *info, hid_t dset, hsize_t hs_size[H5S_MAX_RANK]; /*size this pass */ hsize_t hs_nelmts; /*elements in request */ - + hsize_t dim_n_size; /* * Check that everything looks okay. The dimensionality must not be too @@ -989,7 +1003,17 @@ h5dump_simple_dset(FILE *stream, const h5dump_t *info, hid_t dset, */ memset(&ctx, 0, sizeof ctx); ctx.need_prefix = 1; - f_space = H5Dget_space(dset); + + if (programtype == H5DUMP) { + if (obj_data == DATASET_DATA) + f_space = H5Dget_space(dset); + else + f_space = H5Aget_space(dset); + } + else { + f_space = H5Dget_space(dset); + } + ctx.ndims = H5Sget_simple_extent_ndims(f_space); if ((size_t)(ctx.ndims)>NELMTS(sm_size)) return -1; @@ -1031,23 +1055,79 @@ h5dump_simple_dset(FILE *stream, const h5dump_t *info, hid_t dset, hs_size, NULL); H5Sselect_hyperslab(sm_space, H5S_SELECT_SET, zero, NULL, &hs_nelmts, NULL); + dim_n_size = ctx.p_max_idx[ctx.ndims-1]; } else { H5Sselect_all(f_space); H5Sselect_all(sm_space); hs_nelmts = 1; + dim_n_size = 1; } /* Read the data */ - if (H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf)<0) { - return -1; + if (programtype == H5LS) { + if (H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf)<0) { + return -1; + } } + else if (programtype == H5DUMP){ + if (obj_data == DATASET_DATA) { + if (H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf) <0) + return -1; + } else { + if (H5Aread(dset, p_type, sm_buf) < 0) + return -1; + } + } + else if (programtype == UNKNOWN) { + return (FAIL); + } /* Print the data */ flags = ((0==elmtno?START_OF_DATA:0) | (elmtno+hs_nelmts>=p_nelmts?END_OF_DATA:0)); - h5dump_simple_data(stream, info, &ctx, flags, hs_nelmts, p_type, - sm_buf); - + if (programtype == UNKNOWN){ + return FAIL; + } + else if (programtype == H5LS){ + h5dump_simple_data(stream, info, &ctx, flags, hs_nelmts, p_type, + sm_buf); + } + else if (programtype == H5DUMP){ + switch (H5Tget_class(p_type)) { + case H5T_INTEGER: + display_numeric_data (hs_nelmts, p_type, sm_buf, p_type_nbytes, + p_nelmts, dim_n_size, elmtno); + break; + + case H5T_FLOAT: + display_numeric_data (hs_nelmts, p_type, sm_buf, p_type_nbytes, + p_nelmts, dim_n_size, elmtno); + break; + + case H5T_TIME: + break; + + case H5T_STRING: + display_string (hs_nelmts, p_type, sm_buf, p_type_nbytes, + p_nelmts, dim_n_size, elmtno); + break; + + case H5T_BITFIELD: + break; + + case H5T_OPAQUE: + break; + + case H5T_COMPOUND: + compound_data = 1; + display_compound_data (hs_nelmts, p_type, sm_buf, p_type_nbytes, p_nelmts, elmtno); + compound_data = 0; + break; + + default: break; + } + + } /* Calculate the next hyperslab offset */ for (i=ctx.ndims, carry=1; i>0 && carry; --i) { hs_offset[i-1] += hs_size[i-1]; @@ -1149,13 +1229,9 @@ h5dump_simple_mem(FILE *stream, const h5dump_t *info, hid_t type, * *------------------------------------------------------------------------- */ -/* - strDUAction is TRUE when we want the dumputil way of - handling the string and is FALSE when we want the tools.c - way. -*/ + hid_t -h5dump_fixtype(hid_t f_type, hbool_t strDUAction) +h5dump_fixtype(hid_t f_type) { hid_t m_type = FAIL, f_memb; hid_t *memb = NULL; @@ -1210,7 +1286,7 @@ h5dump_fixtype(hid_t f_type, hbool_t strDUAction) original action here. */ - if (strDUAction == TRUE) { + if (programtype == H5DUMP) { m_type = H5Tcopy(H5T_C_S1); H5Tset_size(m_type, size); strpad = H5Tget_strpad(f_type) ; @@ -1226,10 +1302,13 @@ h5dump_fixtype(hid_t f_type, hbool_t strDUAction) } } - else { + else if (programtype == H5LS) { m_type = H5Tcopy(f_type); H5Tset_cset(m_type, H5T_CSET_ASCII); } + else if (programtype == UNKNOWN){ + return FAIL; + } break; case H5T_COMPOUND: @@ -1250,7 +1329,7 @@ h5dump_fixtype(hid_t f_type, hbool_t strDUAction) /* Get the member type and fix it */ f_memb = H5Tget_member_type(f_type, i); - memb[i] = h5dump_fixtype(f_memb,strDUAction); + memb[i] = h5dump_fixtype(f_memb); H5Tclose(f_memb); if (memb[i]<0) goto done; @@ -1351,7 +1430,7 @@ h5dump_dset(FILE *stream, const h5dump_t *info, hid_t dset, hid_t _p_type) } if (p_type<0) { f_type = H5Dget_type(dset); - p_type = h5dump_fixtype(f_type,FALSE); + p_type = h5dump_fixtype(f_type); H5Tclose(f_type); if (p_type<0) return -1; } @@ -1362,7 +1441,7 @@ h5dump_dset(FILE *stream, const h5dump_t *info, hid_t dset, hid_t _p_type) H5Sclose(f_space); /* Print the data */ - status = h5dump_simple_dset(stream, info, dset, p_type); + status = h5dump_simple_dset(stream, info, dset, p_type, 0); if (p_type!=_p_type) H5Tclose(p_type); return status; } @@ -1447,7 +1526,7 @@ static void display_numeric_data hsize_t i; /*char p_buf[256]; */ -char out_buf[NCOLS]; +char* out_buf = malloc(sizeof(char) * nCols); struct h5dump_str_t tempstr; /******************************************************************************************/ @@ -1456,7 +1535,7 @@ struct h5dump_str_t tempstr; /* Set to all default values and then override */ memset(&info, 0, sizeof info); info.idx_fmt = "(%s)"; - info.line_ncols = NCOLS; + info.line_ncols = nCols; info.line_multi_new = 1; /* @@ -1470,13 +1549,13 @@ struct h5dump_str_t tempstr; out_buf[0] = '\0'; - if ((indent+COL) > NCOLS) indent = 0; + if ((indent+COL) > nCols) indent = 0; memset(&tempstr, 0, sizeof(h5dump_str_t)); for (i=0; i<hs_nelmts && (elmtno+i) < p_nelmts; i++) { h5dump_str_reset(&tempstr); - h5dump_sprint(&tempstr, &info, p_type, sm_buf+i*p_type_nbytes, -1); - if ((int)(strlen(out_buf)+tempstr.len+1) > (NCOLS-indent-COL)) { + h5dump_sprint(&tempstr, &info, p_type, sm_buf+i*p_type_nbytes); + if ((int)(strlen(out_buf)+tempstr.len+1) > (nCols-indent-COL)) { /* first row of member */ if (compound_data && (elmtno+i+1) == dim_n_size) printf("%s\n", out_buf); @@ -1493,7 +1572,7 @@ struct h5dump_str_t tempstr; if ((elmtno+i+1) != p_nelmts) /* not last element */ printf(",\n"); else if (compound_data) { /* last element of member data*/ - if ((NCOLS-strlen(out_buf)-indent-COL) < 2) { + if ((nCols-strlen(out_buf)-indent-COL) < 2) { /* 2 for space and ] */ printf("\n"); indentation(indent+COL-3); @@ -1505,7 +1584,7 @@ struct h5dump_str_t tempstr; } else { strcat(out_buf, tempstr.s); if ((elmtno+i+1) % dim_n_size) { - if ((NCOLS-strlen(out_buf)-indent-COL-1) > 0) + if ((nCols-strlen(out_buf)-indent-COL-1) > 0) strcat(out_buf, ", "); else strcat(out_buf, ","); @@ -1523,7 +1602,7 @@ struct h5dump_str_t tempstr; printf(",\n"); else if (compound_data) { /* last row of member data*/ /* 2 for space and ] */ - if ((NCOLS-strlen(out_buf)-indent-COL) < 2) { + if ((nCols-strlen(out_buf)-indent-COL) < 2) { printf("\n"); indentation(indent+COL-3); } @@ -1556,7 +1635,7 @@ static void display_string hsize_t i, row_size=0; int j, m, x, y, z, first_row=1; int free_space, long_string = 0; - char out_buf[NCOLS]; + char* out_buf = malloc(sizeof(char) * nCols); struct h5dump_str_t tempstr; int temp; @@ -1566,7 +1645,7 @@ static void display_string /* Set to all default values and then override */ memset(&info, 0, sizeof info); info.idx_fmt = "(%s)"; - info.line_ncols = NCOLS; + info.line_ncols = nCols; info.line_multi_new = 1; /* @@ -1586,13 +1665,13 @@ static void display_string row_size++; h5dump_str_reset(&tempstr); - h5dump_sprint(&tempstr, &info,p_type, sm_buf+i*p_type_nbytes,-1); + h5dump_sprint(&tempstr, &info,p_type, sm_buf+i*p_type_nbytes); memmove(tempstr.s, tempstr.s + 1, tempstr.len -1); tempstr.s[tempstr.len - 2] = '\0'; tempstr.len = tempstr.len - 2; - free_space = NCOLS - indent - COL - strlen(out_buf); + free_space = nCols - indent - COL - strlen(out_buf); if ((elmtno+i+1) == p_nelmts) { /* last element */ /* 2 for double quotes */ @@ -1626,7 +1705,7 @@ static void display_string } else { indentation(indent+COL); printf("%s\"", out_buf); - memset(out_buf, '\0', NCOLS); + memset(out_buf, '\0', nCols); temp = copy_atomic_char(out_buf,tempstr.s,tempstr.len,x); out_buf[x] = '\0'; printf("%s\" //\n", out_buf); @@ -1634,7 +1713,7 @@ static void display_string } } - y = NCOLS - indent -COL - 5; + y = nCols - indent -COL - 5; m = (tempstr.len - x)/y; @@ -1649,7 +1728,7 @@ static void display_string } if ((elmtno+i+1) == p_nelmts) { /* last element */ - if ((int)strlen(tempstr.s+x+j*y) > (NCOLS - indent - COL -2)) { /* 2 for double quotes */ + if ((int)strlen(tempstr.s+x+j*y) > (nCols - indent - COL -2)) { /* 2 for double quotes */ indentation(indent+COL); strncpy(out_buf, tempstr.s+x+j*y, y); out_buf[y] = '\0'; @@ -1657,7 +1736,7 @@ static void display_string indentation(indent+COL); printf("\"%s\"", tempstr.s+x+m*y); if (compound_data) { - if ((NCOLS-strlen(out_buf)-indent-COL) < 2) { + if ((nCols-strlen(out_buf)-indent-COL) < 2) { printf("\n"); indentation(indent+COL-3); } @@ -1668,7 +1747,7 @@ static void display_string indentation(indent+COL); printf("\"%s\"", tempstr.s+x+j*y); if (compound_data) { - if ((NCOLS-strlen(out_buf)-indent-COL) < 2) { + if ((nCols-strlen(out_buf)-indent-COL) < 2) { printf("\n"); indentation(indent+COL-3); } @@ -1678,7 +1757,7 @@ static void display_string } out_buf[0] = '\0'; } else if ( row_size == dim_n_size) { - if ((int)strlen(tempstr.s+x+j*y) > (NCOLS - indent - COL -3)) { /* 3 for 2 "'s and 1 , */ + if ((int)strlen(tempstr.s+x+j*y) > (nCols - indent - COL -3)) { /* 3 for 2 "'s and 1 , */ indentation(indent+COL); strncpy(out_buf, tempstr.s+x+j*y, y); out_buf[y] = '\0'; @@ -1694,7 +1773,7 @@ static void display_string row_size = 0; } else { - if ((int)strlen(tempstr.s+x+j*y) > (NCOLS - indent - COL -3)) { /* 3 for 2 "'s and 1 , */ + if ((int)strlen(tempstr.s+x+j*y) > (nCols - indent - COL -3)) { /* 3 for 2 "'s and 1 , */ indentation(indent+COL); strncpy(out_buf, tempstr.s+x+j*y, y); out_buf[y] = '\0'; @@ -1702,12 +1781,12 @@ static void display_string strcpy(out_buf, "\""); strcat(out_buf, tempstr.s+x+m*y); strcat(out_buf, "\","); - if ((int)strlen(out_buf) < (NCOLS-indent-COL)) strcat(out_buf, " "); + if ((int)strlen(out_buf) < (nCols-indent-COL)) strcat(out_buf, " "); } else { strcpy(out_buf, "\""); strcat (out_buf, tempstr.s+x+j*y); strcat(out_buf, "\","); - if ((int)strlen(out_buf) < (NCOLS-indent-COL)) strcat(out_buf, " "); + if ((int)strlen(out_buf) < (nCols-indent-COL)) strcat(out_buf, " "); } } long_string = 0; @@ -1729,7 +1808,7 @@ static void display_string if ((elmtno+i+1) != p_nelmts) printf(",\n"); else if (compound_data) { - if ((NCOLS-strlen(out_buf)-tempstr.len-indent-COL) < 2) { + if ((nCols-strlen(out_buf)-tempstr.len-indent-COL) < 2) { /* 2 for space and ] */ printf("\n"); indentation(indent+COL-3); @@ -1743,7 +1822,7 @@ static void display_string strcat(out_buf, "\""); strcat(out_buf, tempstr.s); strcat(out_buf, "\","); - if ((int)strlen(out_buf) < (NCOLS-indent-COL)) strcat(out_buf, " "); + if ((int)strlen(out_buf) < (nCols-indent-COL)) strcat(out_buf, " "); } } @@ -1770,7 +1849,7 @@ hsize_t nelmts, dim_n_size=0; hid_t memb; int nmembs, i, j, k, ndims, perm[4]; - if ((indent+COL) > NCOLS) indent = 0; + if ((indent+COL) > nCols) indent = 0; for (i=0; i<(int)hs_nelmts && (elmtno+i) < p_nelmts; i++) { @@ -1851,6 +1930,7 @@ int nmembs, i, j, k, ndims, perm[4]; * *------------------------------------------------------------------------- */ + static int h5dump_simple(hid_t oid, hid_t p_type, int obj_data) { @@ -2038,7 +2118,7 @@ print_data(hid_t oid, hid_t _p_type, int obj_data) if (f_type < 0) return status; - p_type = h5dump_fixtype(f_type,TRUE); + p_type = h5dump_fixtype(f_type); H5Tclose(f_type); @@ -2054,7 +2134,9 @@ print_data(hid_t oid, hid_t _p_type, int obj_data) if (f_space < 0) return status; if (H5Sis_simple(f_space) >= 0) - status = h5dump_simple(oid, p_type, obj_data); + status = h5dump_simple_dset(NULL,NULL, oid, p_type, obj_data); +/* status = h5dump_simple(oid, p_type, obj_data); +*/ H5Sclose(f_space); @@ -2136,4 +2218,3 @@ int copy_atomic_char(char* output, char* input, int numchar, int freespace){ if (x == 0) x = FAIL; return(x); } - |