예제 #1
0
/*------------------------------------------------------------------------------
 * 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;
}
예제 #2
0
파일: h5aImp.c 프로젝트: Starlink/hdf5
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;
}