aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2024-09-27 09:52:12 +0200
committerThomas White <taw@physics.org>2024-09-27 09:55:09 +0200
commit591779d9f5f3ea3521e5a58de386bfd3508d3671 (patch)
tree6a585a10e4b2687f72b9a2af2da95574683f5c06 /libcrystfel/src
parent818fe02d3260ef99a08bcdf7ef3da5c0431eab34 (diff)
Allow panel group definitions to come at the top of the geometry fileHEADmaster
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.c61
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);