diff --git a/src/c/reader.d b/src/c/reader.d index aa8f6b95e..556776c82 100644 --- a/src/c/reader.d +++ b/src/c/reader.d @@ -115,14 +115,15 @@ ecl_dispatch_reader_fun(cl_object in, cl_object dc) } cl_object -ecl_read_token(cl_object in, int flags, int c, enum ecl_chattrib a) +ecl_read_token(cl_object in, int flags, bool escape_first_p) { cl_object x, token; - int base; + int c, base; cl_object p; cl_index length, i; int colon, intern_flag; bool external_symbol; + enum ecl_chattrib a; cl_env_ptr the_env = ecl_process_env(); cl_object rtbl = ecl_current_readtable(); enum ecl_readtable_case read_case = rtbl->readtable.read_case; @@ -135,6 +136,15 @@ ecl_read_token(cl_object in, int flags, int c, enum ecl_chattrib a) colon = upcase = count = length = 0; external_symbol = 0; token = si_get_buffer_string(); + + if (escape_first_p) { + c = 0; + a = cat_single_escape; + } else { + c = ecl_read_char_noeof(in); + a = ecl_readtable_get(rtbl, c, NULL); + } + for (;;) { if (c == ':' && (flags != ECL_READ_ONLY_TOKEN) && a == cat_constituent) { @@ -363,5 +373,6 @@ ecl_read_object_with_delimiter(cl_object in, int delimiter, int flags) } return o; } - return ecl_read_token(in, flags, c, a); + ecl_unread_char(c, in); + return ecl_read_token(in, flags, 0); } diff --git a/src/c/reader/rtab_cl.d b/src/c/reader/rtab_cl.d index 2fc00cb57..0020b0df8 100644 --- a/src/c/reader/rtab_cl.d +++ b/src/c/reader/rtab_cl.d @@ -219,7 +219,7 @@ sharp_backslash_reader(cl_object in, cl_object c, cl_object d) FEreader_error("~S is an illegal CHAR-FONT.", in, 1, d); } } - token = ecl_read_token(in, ECL_READ_ONLY_TOKEN, 0, cat_single_escape); + token = ecl_read_token(in, ECL_READ_ONLY_TOKEN, 1); if (token == ECL_NIL) { c = ECL_NIL; } else if (TOKEN_STRING_FILLP(token) == 1) { diff --git a/src/h/external.h b/src/h/external.h index bcc58ae58..f56eaa678 100755 --- a/src/h/external.h +++ b/src/h/external.h @@ -1578,7 +1578,7 @@ extern ECL_API cl_object ecl_read_eval(cl_object in); extern ECL_API cl_object ecl_read_object_non_recursive(cl_object in); extern ECL_API cl_object ecl_read_object_with_delimiter(cl_object in, int del, int flags); extern ECL_API cl_object ecl_read_object(cl_object in); -extern ECL_API cl_object ecl_read_token(cl_object in, int flags, int c, enum ecl_chattrib a); +extern ECL_API cl_object ecl_read_token(cl_object in, int flags, bool esc); extern ECL_API cl_object ecl_parse_number(cl_object s, cl_index start, cl_index end, cl_index *ep, unsigned int radix); extern ECL_API cl_object ecl_parse_integer(cl_object s, cl_index start, cl_index end, cl_index *ep, unsigned int radix); extern ECL_API bool ecl_invalid_character_p(int c);