#include "libguile/strports.h"
#include "libguile/vectors.h"
#include "libguile/validate.h"
+#include "libguile/srfi-4.h"
#include "libguile/read.h"
*/
-static void
-scm_input_error (char const *function,
- SCM port, const char *message, SCM arg)
+void
+scm_i_input_error (char const *function,
+ SCM port, const char *message, SCM arg)
{
SCM fn = (scm_is_string (SCM_FILENAME(port))
? SCM_FILENAME(port)
string = scm_get_output_string (string_port);
scm_close_output_port (string_port);
scm_error_scm (scm_from_locale_symbol ("read-error"),
- scm_from_locale_string (function),
+ function? scm_from_locale_string (function) : SCM_BOOL_F,
string,
arg,
SCM_BOOL_F);
int c = scm_getc (port);
if (c == EOF)
- scm_input_error ("skip_block_comment", port,
- "unterminated `#! ... !#' comment", SCM_EOL);
+ scm_i_input_error ("skip_block_comment", port,
+ "unterminated `#! ... !#' comment", SCM_EOL);
if (c == '!')
bang_seen = 1;
goteof:
if (eoferr)
{
- scm_input_error (eoferr,
- port,
- "end of file",
- SCM_EOL);
+ scm_i_input_error (eoferr,
+ port,
+ "end of file",
+ SCM_EOL);
}
return c;
case ';':
? scm_lreadrecparen (tok_buf, port, s_list, copy)
: scm_i_lreadparen (tok_buf, port, s_list, copy, ')');
case ')':
- scm_input_error (FUNC_NAME, port,"unexpected \")\"", SCM_EOL);
+ scm_i_input_error (FUNC_NAME, port,"unexpected \")\"", SCM_EOL);
goto tryagain;
#if SCM_ENABLE_ELISP
case 't':
case 'T':
return SCM_BOOL_T;
+
case 'f':
+ /* #f32(...), #f64(...), or just #f.
+ */
+ return scm_i_read_homogenous_vector (port, 'f');
case 'F':
return SCM_BOOL_F;
c = '#';
goto num;
+ case 's':
+ /* #s8(...), #s16(...), #s32(...) or #s64(...)
+ */
+ return scm_i_read_homogenous_vector (port, 's');
+
+ case 'u':
+ /* #u8(...), #u16(...), #u32(...) or #u64(...)
+ */
+ return scm_i_read_homogenous_vector (port, 'u');
+
case '!':
/* should never happen, #!...!# block comments are skipped
over in scm_flush_ws. */
&& (scm_i_casei_streq (scm_charnames[c],
scm_i_string_chars (*tok_buf), j)))
return SCM_MAKE_CHAR (scm_charnums[c]);
- scm_input_error (FUNC_NAME, port, "unknown character name ~a",
- scm_list_1 (scm_c_substring (*tok_buf, 0, j)));
+ scm_i_input_error (FUNC_NAME, port, "unknown character name ~a",
+ scm_list_1 (scm_c_substring (*tok_buf, 0, j)));
/* #:SYMBOL is a syntax for keywords supported in all contexts. */
case ':':
}
}
unkshrp:
- scm_input_error (FUNC_NAME, port, "Unknown # object: ~S",
- scm_list_1 (SCM_MAKE_CHAR (c)));
+ scm_i_input_error (FUNC_NAME, port, "Unknown # object: ~S",
+ scm_list_1 (SCM_MAKE_CHAR (c)));
}
case '"':
while ('"' != (c = scm_getc (port)))
{
if (c == EOF)
- str_eof: scm_input_error (FUNC_NAME, port, "end of file in string constant", SCM_EOL);
+ str_eof: scm_i_input_error (FUNC_NAME, port,
+ "end of file in string constant",
+ SCM_EOL);
while (j + 2 >= scm_i_string_length (*tok_buf))
scm_grow_tok_buf (tok_buf);
}
default:
bad_escaped:
- scm_input_error(FUNC_NAME, port,
- "illegal character in escape sequence: ~S",
- scm_list_1 (SCM_MAKE_CHAR (c)));
+ scm_i_input_error(FUNC_NAME, port,
+ "illegal character in escape sequence: ~S",
+ scm_list_1 (SCM_MAKE_CHAR (c)));
}
scm_c_string_set_x (*tok_buf, j, SCM_MAKE_CHAR (c));
++j;
c = scm_i_string_chars (*tok_buf)[1];
goto callshrp;
}
- scm_input_error (FUNC_NAME, port, "unknown # object", SCM_EOL);
+ scm_i_input_error (FUNC_NAME, port, "unknown # object", SCM_EOL);
}
goto tok;
ans = scm_lreadr (tok_buf, port, copy);
closeit:
if (term_char != (c = scm_flush_ws (port, name)))
- scm_input_error (FUNC_NAME, port, "missing close paren", SCM_EOL);
+ scm_i_input_error (FUNC_NAME, port, "missing close paren", SCM_EOL);
return ans;
}
ans = tl = scm_cons (tmp, SCM_EOL);
{
ans = scm_lreadr (tok_buf, port, copy);
if (')' != (c = scm_flush_ws (port, name)))
- scm_input_error (FUNC_NAME, port, "missing close paren", SCM_EOL);
+ scm_i_input_error (FUNC_NAME, port, "missing close paren", SCM_EOL);
return ans;
}
/* Build the head of the list structure. */
: tmp,
SCM_EOL));
if (')' != (c = scm_flush_ws (port, name)))
- scm_input_error (FUNC_NAME, port, "missing close paren", SCM_EOL);
+ scm_i_input_error (FUNC_NAME, port,
+ "missing close paren", SCM_EOL);
goto exit;
}