/*------------------------------------------------------------------------------ * Purpose: converts data value into strings * Parameters: H5Dataset* d-- The dataset its value to be vonverted. hid_t tid -- the datatype identifier * Return: Returns a non-negative value if successful; otherwise returns a negative value. *------------------------------------------------------------------------------ */ int H5Dataset_value_to_string(H5Dataset *d, hid_t tid, hid_t sid) { int ret_value=0; unsigned int i=0; char **strs; unsigned char *vp=NULL; h5str_t h5str; size_t offset=0, tsize=0, valuelen=0; void *value; assert(d); assert(d->value); value = d->value; vp = (unsigned char *)d->value; d->value = (char **)malloc(d->space.npoints*sizeof(char *)); assert(d->value); strs = (char**)d->value; offset = 0; tsize = H5Tget_size(tid); memset(&h5str, 0, sizeof(h5str_t)); h5str_new(&h5str, 4*tsize); d->nvalue = 0; for (i=0; i<d->space.npoints; i++) { h5str_empty(&h5str); ret_value = h5str_sprintf(&h5str, tid, vp + offset, " || "); if (ret_value > 0) { valuelen = strlen(h5str.s)+1; strs[i] = (char *)malloc(valuelen); strcpy(strs[i], h5str.s); /* d->nvalue += valuelen; XXXX changed by MW */ d->nvalue ++; } offset += tsize; } h5str_free(&h5str); /* reclaim memory allocated to store variable length data */ if (H5Tdetect_class(tid, H5T_VLEN) > 0) H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, value); free (value); return ret_value; }
herr_t H5AreadVL_asstr (JNIEnv *env, hid_t aid, hid_t tid, jobjectArray buf) { jint i; jint n; hid_t sid; jstring jstr; h5str_t h5str; hvl_t *rdata; hsize_t dims[H5S_MAX_RANK]; size_t size; size_t max_len = 0; herr_t status = -1; /* Get size of string array */ n = ENVPTR->GetArrayLength(ENVPAR buf); /* we will need to read n number of hvl_t structures */ rdata = (hvl_t*)HDcalloc((size_t)n, sizeof(hvl_t)); if (rdata == NULL) { h5JNIFatalError(env, "H5AreadVL_asstr: failed to allocate buff for read"); } /* end if */ else { status = H5Aread(aid, tid, rdata); if (status < 0) { dims[0] = (hsize_t)n; sid = H5Screate_simple(1, dims, NULL); H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, rdata); H5Sclose(sid); HDfree(rdata); h5JNIFatalError(env, "H5AreadVL_asstr: failed to read data"); } /* end if */ else { /* calculate the largest size of all the hvl_t structures read */ max_len = 1; for (i=0; i < n; i++) { if ((rdata + i)->len > max_len) max_len = (rdata + i)->len; } /* create one malloc to hold largest element */ size = H5Tget_size(tid) * max_len; HDmemset(&h5str, 0, sizeof(h5str_t)); h5str_new(&h5str, 4 * size); if (h5str.s == NULL) { dims[0] = (hsize_t)n; sid = H5Screate_simple(1, dims, NULL); H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, rdata); H5Sclose(sid); HDfree(rdata); h5JNIFatalError(env, "H5AreadVL_asstr: failed to allocate buf"); } /* end if */ else { H5T_class_t tclass = H5Tget_class(tid); /* convert each element to char string */ for (i=0; i < n; i++) { h5str.s[0] = '\0'; h5str_vlsprintf(&h5str, aid, tid, rdata+i, 0); jstr = ENVPTR->NewStringUTF(ENVPAR h5str.s); ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr); } /* end for */ h5str_free(&h5str); dims[0] = (hsize_t)n; sid = H5Screate_simple(1, dims, NULL); H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, rdata); H5Sclose(sid); HDfree(rdata); } /* end else */ } /* end else */ } /* end else */ return status; }