static int unpack_string(grib_accessor*a , char*  v, size_t *len)
{
    int ret=0;
    double dval=0;
    long lval=0;
    size_t llen=1;
    grib_accessor_class* super = NULL;

    switch (get_native_type(a)) {
    case GRIB_TYPE_LONG:
        ret=unpack_long(a,&lval,&llen);
        sprintf(v,"%ld",lval);
        *len=strlen(v);
        break;

    case GRIB_TYPE_DOUBLE:
        ret=unpack_double(a,&dval,&llen);
        sprintf(v,"%g",dval);
        *len=strlen(v);
        break;

    default:
        super = *(a->cclass->super);
        ret = super->unpack_string(a,v,len);
    }
    return ret;
}
static void dump(grib_accessor* a, grib_dumper* dumper)
{
    switch (get_native_type(a)) {
    case GRIB_TYPE_STRING:
        grib_dump_string(dumper,a,NULL);
        break;
    case GRIB_TYPE_LONG:
        grib_dump_long(dumper,a,NULL);
        break;
    case GRIB_TYPE_DOUBLE:
        grib_dump_double(dumper,a,NULL);
        break;
    }
}
static int pack_long(grib_accessor* a, const long* val, size_t *len)
{
    grib_accessor_bits* self = (grib_accessor_bits*)a;
    grib_accessor* x=NULL;
    grib_handle* h=grib_handle_of_accessor(a);
    unsigned char* p=NULL;
    long start,length, maxval;

    if(*len != 1) return GRIB_WRONG_ARRAY_SIZE;

    if (get_native_type(a) == GRIB_TYPE_DOUBLE) {
        /* ECC-402 */
        const double dVal = (double)(*val);
        return pack_double(a, &dVal, len);
    }

    start  = self->start;
    length = self->len;

    x=grib_find_accessor(grib_handle_of_accessor(a),self->argument);
    if (!x) return GRIB_NOT_FOUND;

    /* Check the input value */
    if (*val < 0) {
        grib_context_log(h->context, GRIB_LOG_ERROR, "key=%s: value cannot be negative",a->name);
        return GRIB_ENCODING_ERROR;
    }
    maxval = (1 << length) - 1;
    if (*val > maxval){
        grib_context_log(h->context, GRIB_LOG_ERROR,
                "key=%s: Trying to encode value of %ld but the maximum allowable value is %ld (number of bits=%ld)",
                a->name, *val, maxval, length);
        return GRIB_ENCODING_ERROR;
    }

    p=h->buffer->data + grib_byte_offset(x);
    return grib_encode_unsigned_longb(p,*val,&start,length);
}
Example #4
0
 static bool apply(type_type const & native_id) {
     return check_error(
         H5Tequal(type_type(H5Tcopy(native_id)), type_type(get_native_type(typename alps::detail::type_wrapper<T>::type())))
     ) > 0;
 }