From e57ca3063700fe5309a50481f8fd0aa892e6eed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kochma=C5=84ski?= Date: Fri, 6 Mar 2026 22:43:28 +0100 Subject: [PATCH] reader: make token parser installable in the readtable --- src/c/read.d | 1 + src/c/reader.d | 2 +- src/c/reader/rtab_cl.d | 1 + src/h/object.h | 2 ++ 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/c/read.d b/src/c/read.d index 3afb7dd2f..00a812cfa 100644 --- a/src/c/read.d +++ b/src/c/read.d @@ -727,6 +727,7 @@ ecl_copy_readtable(cl_object from, cl_object to) */ output = ecl_alloc_object(t_readtable); output->readtable.locked = 0; + output->readtable.parse_token = from->readtable.parse_token; output->readtable.table = to_rtab = (struct ecl_readtable_entry *) ecl_alloc_align(total_bytes, entry_bytes); from_rtab = from->readtable.table; diff --git a/src/c/reader.d b/src/c/reader.d index 8bf49e47b..7605158fc 100644 --- a/src/c/reader.d +++ b/src/c/reader.d @@ -341,7 +341,7 @@ ecl_read_object_with_delimiter(cl_object rtbl, cl_object in, int delimiter, int if (suppress) { x = ECL_NIL; } else { - x = ecl_parse_token(token, in, flags); + x = rtbl->readtable.parse_token(token, in, flags); } ecl_put_reader_token(token); return x; diff --git a/src/c/reader/rtab_cl.d b/src/c/reader/rtab_cl.d index 91cef98b3..a862650b1 100644 --- a/src/c/reader/rtab_cl.d +++ b/src/c/reader/rtab_cl.d @@ -808,6 +808,7 @@ init_read(void) cl_core.standard_readtable = r = ecl_alloc_object(t_readtable); r->readtable.locked = 0; + r->readtable.parse_token = ecl_parse_token; r->readtable.read_case = ecl_case_upcase; r->readtable.table = rtab = (struct ecl_readtable_entry *) diff --git a/src/h/object.h b/src/h/object.h index db927fb64..9c1350c24 100644 --- a/src/h/object.h +++ b/src/h/object.h @@ -104,6 +104,7 @@ typedef cl_object cl_return; typedef cl_fixnum cl_narg; typedef cl_object (*cl_objectfn)(cl_narg narg, ...); typedef cl_object (*cl_objectfn_fixed)(); +typedef cl_object (*cl_objectfn_parse)(cl_object,cl_object,int); /* OBJect NULL value. @@ -742,6 +743,7 @@ struct ecl_readtable { /* read table */ _ECL_HDR1(locked); enum ecl_readtable_case read_case; /* readtable-case */ struct ecl_readtable_entry *table; /* read table itself */ + cl_objectfn_parse parse_token; /* token parser */ #ifdef ECL_UNICODE cl_object hash; /* hash for values outside base-char range */ #endif