diff --git a/src/field-cache.c b/src/field-cache.c index 890320a..ddb706a 100644 --- a/src/field-cache.c +++ b/src/field-cache.c @@ -62,3 +62,41 @@ dc_status_t dc_field_get_string(dc_field_cache_t *cache, unsigned idx, dc_field_ } return DC_STATUS_UNSUPPORTED; } + + +/* + * Use this generic "pick fields from the field cache" helper + * after you've handled all the ones you do differently + */ +dc_status_t +dc_field_get(dc_field_cache_t *cache, dc_field_type_t type, unsigned int flags, void* value) +{ + if (!(cache->initialized & (1 << type))) + return DC_STATUS_UNSUPPORTED; + + switch (type) { + case DC_FIELD_DIVETIME: + return DC_FIELD_VALUE(*cache, value, DIVETIME); + case DC_FIELD_MAXDEPTH: + return DC_FIELD_VALUE(*cache, value, MAXDEPTH); + case DC_FIELD_AVGDEPTH: + return DC_FIELD_VALUE(*cache, value, AVGDEPTH); + case DC_FIELD_GASMIX_COUNT: + case DC_FIELD_TANK_COUNT: + return DC_FIELD_VALUE(*cache, value, GASMIX_COUNT); + case DC_FIELD_GASMIX: + if (flags >= MAXGASES) + break; + return DC_FIELD_INDEX(*cache, value, GASMIX, flags); + case DC_FIELD_SALINITY: + return DC_FIELD_VALUE(*cache, value, SALINITY); + case DC_FIELD_DIVEMODE: + return DC_FIELD_VALUE(*cache, value, DIVEMODE); + case DC_FIELD_STRING: + return dc_field_get_string(cache, flags, (dc_field_string_t *)value); + default: + break; + } + + return DC_STATUS_UNSUPPORTED; +} diff --git a/src/field-cache.h b/src/field-cache.h index ec8a7f4..6f5c487 100644 --- a/src/field-cache.h +++ b/src/field-cache.h @@ -36,6 +36,7 @@ typedef struct dc_field_cache { dc_status_t dc_field_add_string(dc_field_cache_t *, const char *desc, const char *data); dc_status_t dc_field_add_string_fmt(dc_field_cache_t *, const char *desc, const char *fmt, ...); dc_status_t dc_field_get_string(dc_field_cache_t *, unsigned idx, dc_field_string_t *value); +dc_status_t dc_field_get(dc_field_cache_t *, dc_field_type_t, unsigned int, void *); /* * Macro to make it easy to set DC_FIELD_xyz values.