In R7RS mode, newlines in strings should be escaped as \n to ensure
proper serialization and readback compatibility. This change:
- Makes slashify_table escape newlines when WITH_R7RS is defined
- Adds newline case to slashify_string_to_port for proper \n output
This fixes issues where strings containing newlines would not serialize
correctly in R7RS mode, breaking the round-trip property of write/read.
---
s7.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/s7.c b/s7.c
index 273f6d1..4534a01 100644
--- a/s7.c
+++ b/s7.c
@@ -15584,7 +15584,12 @@ static void init_ctables(void)
/* for (int32_t i = 127; i < 160; i++) slashify_table[i] = true; */ /*
6-Apr-24 for utf-8, but this has no effect on s7test?? */
slashify_table[(uint8_t)'\\'] = true;
slashify_table[(uint8_t)'"'] = true;
+#if WITH_R7RS
+ /* In R7RS mode, newlines should be escaped to ensure proper serialization */
+ slashify_table[(uint8_t)'\n'] = true;
+#else
slashify_table[(uint8_t)'\n'] = false;
+#endif
for (int32_t i = 0; i < CTABLE_SIZE; i++)
symbol_slashify_table[i] = ((slashify_table[i]) ||
(!char_ok_in_a_name[i])); /* force use of (symbol ...) for cases like '(ab) as
symbol */
@@ -33935,6 +33940,7 @@ static void slashify_string_to_port(s7_scheme *sc,
s7_pointer port, const char *
case '\'': port_write_character(port)(sc, '\'', port); break;
case '\t': port_write_character(port)(sc, 't', port); break;
case '\r': port_write_character(port)(sc, 'r', port); break;
+ case '\n': port_write_character(port)(sc, 'n', port); break;
case '\b': port_write_character(port)(sc, 'b', port); break;
case '\f': port_write_character(port)(sc, 'f', port); break;
case '\?': port_write_character(port)(sc, '?', port); break;
--
2.51.0
_______________________________________________
Cmdist mailing list
[email protected]
https://cm-mail.stanford.edu/mailman/listinfo/cmdist