diff options
author | Thomas White <taw@physics.org> | 2021-05-12 16:22:25 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2021-05-12 17:14:46 +0200 |
commit | 0fd2a367d1ba017d0c1cb112a648b71c4e355f78 (patch) | |
tree | 0114a7f0b6f03324981682a0858211f29fd89536 /libcrystfel/src/image-msgpack.c | |
parent | 3a3401dfe7a7fedd5f133dd5a7b416e869f6be89 (diff) |
Rework header caching layer
This clears up multiple layering violations which were starting to get
in the way. It enables "string" headers to be stored directly, and it
will make it much simpler to add new header types in the future.
Along the way, this changes all the floating point header stuff to use
double precision. This is needed for EuXFEL event IDs.
Closes: https://gitlab.desy.de/thomas.white/crystfel/-/issues/34
Diffstat (limited to 'libcrystfel/src/image-msgpack.c')
-rw-r--r-- | libcrystfel/src/image-msgpack.c | 67 |
1 files changed, 25 insertions, 42 deletions
diff --git a/libcrystfel/src/image-msgpack.c b/libcrystfel/src/image-msgpack.c index 0f5ab746..6785fd5f 100644 --- a/libcrystfel/src/image-msgpack.c +++ b/libcrystfel/src/image-msgpack.c @@ -242,93 +242,76 @@ static char *terminate_str(const char *ptr, size_t len) } -double image_msgpack_get_value(const char *name, - void *data_block, - size_t data_block_size, - char *ptype) +int image_msgpack_read_header_to_cache(struct image *image, + const char *name) { msgpack_unpacked unpacked; msgpack_object *value_obj; msgpack_object *obj; int r; - float val = NAN; char *str; - *ptype = 'x'; - - if ( data_block == NULL ) { + if ( image->data_block == NULL ) { ERROR("No MsgPack data!\n"); - goto out; + return 1; } msgpack_unpacked_init(&unpacked); - r = msgpack_unpack_next(&unpacked, data_block, data_block_size, NULL); + r = msgpack_unpack_next(&unpacked, image->data_block, + image->data_block_size, NULL); if ( r != MSGPACK_UNPACK_SUCCESS ) { ERROR("MessagePack unpack failed: %i\n", r); - goto out; + return 1; } obj = find_main_object(&unpacked); if ( obj == NULL ) { ERROR("Failed to find main MsgPack object.\n"); msgpack_unpacked_destroy(&unpacked); - goto out; + return 1; } value_obj = find_msgpack_kv(obj, name); if ( value_obj == NULL ) { ERROR("Couldn't find '%s' in MessagePack object\n", name); msgpack_unpacked_destroy(&unpacked); - goto out; + return 1; } switch ( value_obj->type ) { case MSGPACK_OBJECT_FLOAT64: case MSGPACK_OBJECT_FLOAT32: - //case MSGPACK_OBJECT_FLOAT: - *ptype = 'f'; - val = value_obj->via.f64; - break; + image_cache_header_float(image, name, value_obj->via.f64); + msgpack_unpacked_destroy(&unpacked); + return 0; case MSGPACK_OBJECT_POSITIVE_INTEGER: case MSGPACK_OBJECT_NEGATIVE_INTEGER: - *ptype = 'i'; - val = value_obj->via.i64; - break; + image_cache_header_int(image, name, value_obj->via.i64); + msgpack_unpacked_destroy(&unpacked); + return 0; case MSGPACK_OBJECT_STR: str = terminate_str(value_obj->via.str.ptr, value_obj->via.str.size); - if ( str != NULL ) { - int ival; - if ( convert_int(str, &ival) == 0 ) { - *ptype = 'i'; - val = ival; - } else { - ERROR("MsgPack header %s has a string type (%s)" - "(need a number, and can't convert).\n", - name, str); - val = NAN; - } - free(str); - } else { - ERROR("Failed to read MsgPack string (%s)\n", name); - val = NAN; + if ( str == NULL ) { + msgpack_unpacked_destroy(&unpacked); + return 1; } - break; + + image_cache_header_str(image, name, str); + free(str); + msgpack_unpacked_destroy(&unpacked); + return 0; default: ERROR("Unrecognised MsgPack type %i (%s)\n", value_obj->type, name); - break; + msgpack_unpacked_destroy(&unpacked); + return 1; } - - msgpack_unpacked_destroy(&unpacked); - -out: - return val; } |