mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-15 16:20:17 +02:00
Heed the reader settings implied by #!r6rs
When encountering the #!r6rs directive, apply the appropriate reader settings to the port. * libguile/read.scm (read-string-as-list): New helper procedure. (scm_read_shebang): Set reader options implied by the R6RS syntax upon encountering the #!r6rs directive. * test-suite/tests/reader.test (per-port-read-options): Add tests for the #!r6rs directive.
This commit is contained in:
parent
aa13da5189
commit
d77247b90b
3 changed files with 97 additions and 8 deletions
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1995-1997, 1999-2001, 2003, 2004, 2006-2012, 2014
|
||||
/* Copyright (C) 1995-1997, 1999-2001, 2003, 2004, 2006-2012, 2014, 2015
|
||||
* Free Software Foundation, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
|
@ -1430,6 +1430,12 @@ static void set_port_square_brackets_p (SCM port, scm_t_read_opts *opts,
|
|||
int value);
|
||||
static void set_port_curly_infix_p (SCM port, scm_t_read_opts *opts,
|
||||
int value);
|
||||
static void set_port_r6rs_hex_escapes_p (SCM port, scm_t_read_opts *opts,
|
||||
int value);
|
||||
static void set_port_hungry_eol_escapes_p (SCM port, scm_t_read_opts *opts,
|
||||
int value);
|
||||
static void set_port_keyword_style (SCM port, scm_t_read_opts *opts,
|
||||
enum t_keyword_style value);
|
||||
|
||||
static SCM
|
||||
scm_read_shebang (scm_t_wchar chr, SCM port, scm_t_read_opts *opts)
|
||||
|
@ -1451,7 +1457,13 @@ scm_read_shebang (scm_t_wchar chr, SCM port, scm_t_read_opts *opts)
|
|||
scm_ungetc (c, port);
|
||||
name[i] = '\0';
|
||||
if (0 == strcmp ("r6rs", name))
|
||||
; /* Silently ignore */
|
||||
{
|
||||
set_port_case_insensitive_p (port, opts, 0);
|
||||
set_port_r6rs_hex_escapes_p (port, opts, 1);
|
||||
set_port_square_brackets_p (port, opts, 1);
|
||||
set_port_keyword_style (port, opts, KEYWORD_STYLE_HASH_PREFIX);
|
||||
set_port_hungry_eol_escapes_p (port, opts, 1);
|
||||
}
|
||||
else if (0 == strcmp ("fold-case", name))
|
||||
set_port_case_insensitive_p (port, opts, 1);
|
||||
else if (0 == strcmp ("no-fold-case", name))
|
||||
|
@ -2299,6 +2311,30 @@ set_port_curly_infix_p (SCM port, scm_t_read_opts *opts, int value)
|
|||
set_port_read_option (port, READ_OPTION_CURLY_INFIX_P, value);
|
||||
}
|
||||
|
||||
/* Set OPTS and PORT's r6rs_hex_escapes_p option according to VALUE. */
|
||||
static void
|
||||
set_port_r6rs_hex_escapes_p (SCM port, scm_t_read_opts *opts, int value)
|
||||
{
|
||||
value = !!value;
|
||||
opts->r6rs_escapes_p = value;
|
||||
set_port_read_option (port, READ_OPTION_R6RS_ESCAPES_P, value);
|
||||
}
|
||||
|
||||
static void
|
||||
set_port_hungry_eol_escapes_p (SCM port, scm_t_read_opts *opts, int value)
|
||||
{
|
||||
value = !!value;
|
||||
opts->hungry_eol_escapes_p = value;
|
||||
set_port_read_option (port, READ_OPTION_HUNGRY_EOL_ESCAPES_P, value);
|
||||
}
|
||||
|
||||
static void
|
||||
set_port_keyword_style (SCM port, scm_t_read_opts *opts, enum t_keyword_style value)
|
||||
{
|
||||
opts->keyword_style = value;
|
||||
set_port_read_option (port, READ_OPTION_KEYWORD_STYLE, value);
|
||||
}
|
||||
|
||||
/* Initialize OPTS based on PORT's read options and the global read
|
||||
options. */
|
||||
static void
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue