diff options
author | Thomas White <taw@physics.org> | 2024-09-27 09:52:12 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2024-09-27 09:55:09 +0200 |
commit | 591779d9f5f3ea3521e5a58de386bfd3508d3671 (patch) | |
tree | 6a585a10e4b2687f72b9a2af2da95574683f5c06 /libcrystfel/src | |
parent | 818fe02d3260ef99a08bcdf7ef3da5c0431eab34 (diff) |
Nasty code, but will save a lot of hassle.
Fixes: https://gitlab.desy.de/thomas.white/crystfel/-/issues/115
Diffstat (limited to 'libcrystfel/src')
-rw-r--r-- | libcrystfel/src/datatemplate.c | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/libcrystfel/src/datatemplate.c b/libcrystfel/src/datatemplate.c index a7b8950f..c97bd6d7 100644 --- a/libcrystfel/src/datatemplate.c +++ b/libcrystfel/src/datatemplate.c @@ -3,11 +3,11 @@ * * Data template structure * - * Copyright © 2019-2021 Deutsches Elektronen-Synchrotron DESY, + * Copyright © 2019-2024 Deutsches Elektronen-Synchrotron DESY, * a research centre of the Helmholtz Association. * * Authors: - * 2019-2021 Thomas White <taw@physics.org> + * 2019-2024 Thomas White <taw@physics.org> * * This file is part of CrystFEL. * @@ -830,12 +830,35 @@ static int parse_peak_layout(const char *val, return 1; } +#define MAX_FOR_LATER (1024) + +struct forlater +{ + char *keys[MAX_FOR_LATER]; + char *vals[MAX_FOR_LATER]; + int n_forlater; +}; + + +static void store_for_later(struct forlater *fl, const char *key, const char *val) +{ + if ( fl->n_forlater >= MAX_FOR_LATER ) { + ERROR("Too many lines stored.\n"); + return; + } + + fl->keys[fl->n_forlater] = strdup(key); + fl->vals[fl->n_forlater] = strdup(val); + fl->n_forlater++; +} + static int parse_toplevel(DataTemplate *dt, const char *key, const char *val, struct panel_template *defaults, - int *defaults_updated) + int *defaults_updated, + struct forlater *for_later) { if ( strcmp(key, "detector_shift_x") == 0 ) { dt->shift_x_from = cfstrdup(val); @@ -883,8 +906,12 @@ static int parse_toplevel(DataTemplate *dt, } else if ( strncmp(key, "group_", 6) == 0 ) { - if ( parse_group(key+6, dt, val) ) { - return 1; + if ( for_later != NULL ) { + store_for_later(for_later, key, val); + } else { + if ( parse_group(key+6, dt, val) ) { + return 1; + } } } else { @@ -1042,6 +1069,9 @@ DataTemplate *data_template_new_from_string(const char *string_in) size_t len; struct panel_template defaults; int have_unused_defaults = 0; + struct forlater lines_for_later; + + lines_for_later.n_forlater = 0; dt = cfcalloc(1, sizeof(DataTemplate)); if ( dt == NULL ) return NULL; @@ -1179,10 +1209,10 @@ DataTemplate *data_template_new_from_string(const char *string_in) /* Top-level option */ if ( parse_toplevel(dt, line, val, &defaults, - &have_unused_defaults) ) + &have_unused_defaults, + &lines_for_later) ) { - ERROR("Invalid top-level line '%s'\n", - line); + ERROR("Invalid top-level line '%s'\n", line); reject = 1; } cffree(line); @@ -1217,6 +1247,21 @@ DataTemplate *data_template_new_from_string(const char *string_in) } while ( !done ); + for ( i=0; i<lines_for_later.n_forlater; i++ ) { + char *key = lines_for_later.keys[i]; + char *val = lines_for_later.vals[i]; + if ( parse_toplevel(dt, key, val, + &defaults, + &have_unused_defaults, + NULL) ) + { + ERROR("Invalid top-level line '%s' = '%s'\n", key, val); + reject = 1; + } + cffree(key); + cffree(val); + } + if ( dt->n_panels == 0 ) { ERROR("No panel descriptions in geometry file.\n"); cffree(dt); |