aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2021-10-28 15:00:56 +0200
committerThomas White <taw@physics.org>2021-10-28 15:00:56 +0200
commit3dfb24e9cacf8bc62f39b0de37c5b0ddceba9e71 (patch)
treeef709dab75a8527675751424d8e55b06070aa098 /libcrystfel
parent86633959138c6ec528c8cf635c6f0d39d79b61cc (diff)
Make symmetry operation parser re-entrant
Fixes: https://gitlab.desy.de/thomas.white/crystfel/-/issues/1
Diffstat (limited to 'libcrystfel')
-rw-r--r--libcrystfel/src/symmetry.c19
-rw-r--r--libcrystfel/src/symop.l7
-rw-r--r--libcrystfel/src/symop.y24
3 files changed, 29 insertions, 21 deletions
diff --git a/libcrystfel/src/symmetry.c b/libcrystfel/src/symmetry.c
index 312470c7..6cda54a2 100644
--- a/libcrystfel/src/symmetry.c
+++ b/libcrystfel/src/symmetry.c
@@ -40,6 +40,7 @@
#include "utils.h"
#include "integer_matrix.h"
#include "symop-parse.h"
+#define YYSTYPE SYMOPSTYPE
#include "symop-lex.h"
@@ -1623,11 +1624,14 @@ RationalMatrix *parse_symmetry_operation(const char *s)
YY_BUFFER_STATE b;
RationalMatrix *m;
int r;
+ void *scanner;
m = rtnl_mtx_new(3, 3);
- b = symop_scan_string(s);
- r = symopparse(m, NULL);
- symop_delete_buffer(b);
+ symoplex_init(&scanner);
+ b = symop_scan_string(s, scanner);
+ r = symopparse(scanner, m, NULL);
+ symop_delete_buffer(b, scanner);
+ symoplex_destroy(scanner);
if ( r ) {
ERROR("Failed to parse '%s'\n", s);
@@ -1669,13 +1673,16 @@ SymOpList *parse_symmetry_operations(const char *s)
RationalMatrix *m;
SymOpList *list;
int r;
+ void *scanner;
m = rtnl_mtx_new(3, 3); /* Scratch space for parser */
list = new_symoplist(); /* The result we want */
- b = symop_scan_string(s);
- r = symopparse(m, list);
- symop_delete_buffer(b);
+ symoplex_init(&scanner);
+ b = symop_scan_string(s, scanner);
+ r = symopparse(scanner, m, list);
+ symop_delete_buffer(b, scanner);
+ symoplex_destroy(scanner);
rtnl_mtx_free(m);
if ( r ) {
diff --git a/libcrystfel/src/symop.l b/libcrystfel/src/symop.l
index f4b2a79e..a755707b 100644
--- a/libcrystfel/src/symop.l
+++ b/libcrystfel/src/symop.l
@@ -27,18 +27,17 @@
*/
%{
- #define YYDEBUG 1
- #include "rational.h"
#include "symop-parse.h"
+ #define YYSTYPE SYMOPSTYPE
%}
%option prefix="symop"
-%option noyywrap nounput noinput
+%option noyywrap nounput noinput reentrant bison-bridge
%%
[,] { return COMMA; }
-[0-9]+ { symoplval.n = atoi(yytext); return NUMBER; }
+[0-9]+ { yylval->n = atoi(yytext); return NUMBER; }
[/] { return DIVIDE; }
[+] { return PLUS; }
[-] { return MINUS; }
diff --git a/libcrystfel/src/symop.y b/libcrystfel/src/symop.y
index 08584594..80712359 100644
--- a/libcrystfel/src/symop.y
+++ b/libcrystfel/src/symop.y
@@ -32,14 +32,16 @@
#include "rational.h"
#include "symmetry.h"
- extern int symoplex();
- extern int symopparse(RationalMatrix *m, SymOpList *list);
- void symoperror(RationalMatrix *m, SymOpList *list, const char *s);
+ #include "symop-parse.h"
+ #include "symop-lex.h"
+
+ void symoperror(void *scanner, RationalMatrix *m, SymOpList *list, const char *s);
%}
%define api.prefix {symop}
-
-%parse-param {RationalMatrix *m} {SymOpList *list}
+%define api.pure full
+%parse-param {void *scanner} {RationalMatrix *m} {SymOpList *list}
+%lex-param {void *scanner}
%code requires {
#include "symmetry.h"
@@ -70,19 +72,19 @@
%type <r> fraction
%{
-static int try_add_symop(SymOpList *list, RationalMatrix *m, int complain)
+static int try_add_symop(void *scanner, SymOpList *list, RationalMatrix *m, int complain)
{
if ( list == NULL ) {
/* Only complain if this isn't the only operation provided */
if ( complain ) {
- yyerror(m, list, "Must be a single symmetry operation");
+ yyerror(scanner, m, list, "Must be a single symmetry operation");
}
return 1;
} else {
IntegerMatrix *im;
im = intmat_from_rtnl_mtx(m);
if ( im == NULL ) {
- yyerror(m, list, "Symmetry operations must all be integer");
+ yyerror(scanner, m, list, "Symmetry operations must all be integer");
return 1;
} else {
add_symop(list, im);
@@ -95,8 +97,8 @@ static int try_add_symop(SymOpList *list, RationalMatrix *m, int complain)
%%
symoplist:
- symop { try_add_symop(list, m, 0); }
-| symoplist SEMICOLON symop { if ( try_add_symop(list, m, 1) ) YYERROR; }
+ symop { try_add_symop(scanner, list, m, 0); }
+| symoplist SEMICOLON symop { if ( try_add_symop(scanner, list, m, 1) ) YYERROR; }
;
symop:
@@ -135,6 +137,6 @@ fraction:
%%
-void symoperror(RationalMatrix *m, SymOpList *list, const char *s) {
+void symoperror(void *scanner, RationalMatrix *m, SymOpList *list, const char *s) {
printf("Error: %s\n", s);
}