mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-09 21:40:33 +02:00
* fports.h, fports.c (scm_i_fdes_to_port): New, like
scm_fdes_to_port, but take mode bits directly instead of as a C string. (scm_i_fdes_to_port): Implement using above. (scm_open_file): Use scm_i_fdes_to_port together with scm_i_mode_bits to avoid accessing internals of SCM string from C. * vports.c (scm_make_soft_port): Use scm_i_fdes_to_port together with scm_i_mode_bits to avoid accessing internals of SCM string from C. * ports.h (scm_i_mode_bits): New, same as scm_mode_bits but with a SCM string as argument. * ports.c (scm_i_void_port): New, like scm_void_port but take mode bits directly instead of C string. (scm_void_port): Implement using above. (scm_sys_make_void_port): Use scm_i_void_port together with scm_i_mode_bits to avoid accessing internals of SCM string. * convert.i.c, backtrace.c, strop.c, strorder.c, strports.c, struct.c, unif.c, ports.c: Use SCM_I_STRING_CHARS, SCM_I_STRING_UCHARS, and SCM_I_STRING_LENGTH instead of SCM_STRING_CHARS, SCM_STRING_UCHARS, and SCM_STRING_LENGTH, respectively. Also, replaced scm_return_first with more explicit scm_remember_upto_here_1, etc, or introduced them in the first place.
This commit is contained in:
parent
ffa747a6ea
commit
d617ee1895
5 changed files with 41 additions and 11 deletions
|
@ -342,7 +342,7 @@ SCM_DEFINE (scm_open_file, "open-file", 2, 0, 0,
|
|||
scm_cons (scm_strerror (scm_from_int (en)),
|
||||
scm_cons (filename, SCM_EOL)), en);
|
||||
}
|
||||
port = scm_fdes_to_port (fdes, md, filename);
|
||||
port = scm_i_fdes_to_port (fdes, scm_i_mode_bits (mode), filename);
|
||||
|
||||
scm_frame_end ();
|
||||
|
||||
|
@ -401,10 +401,9 @@ static int getflags (int fdes)
|
|||
NAME is a string to be used as the port's filename.
|
||||
*/
|
||||
SCM
|
||||
scm_fdes_to_port (int fdes, char *mode, SCM name)
|
||||
scm_i_fdes_to_port (int fdes, long mode_bits, SCM name)
|
||||
#define FUNC_NAME "scm_fdes_to_port"
|
||||
{
|
||||
long mode_bits = scm_mode_bits (mode);
|
||||
SCM port;
|
||||
scm_t_port *pt;
|
||||
int flags;
|
||||
|
@ -448,6 +447,12 @@ scm_fdes_to_port (int fdes, char *mode, SCM name)
|
|||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
SCM
|
||||
scm_fdes_to_port (int fdes, char *mode, SCM name)
|
||||
{
|
||||
return scm_i_fdes_to_port (fdes, scm_mode_bits (mode), name);
|
||||
}
|
||||
|
||||
/* Return a lower bound on the number of bytes available for input. */
|
||||
static int
|
||||
fport_input_waiting (SCM port)
|
||||
|
|
|
@ -55,6 +55,10 @@ SCM_API SCM scm_fdes_to_port (int fdes, char *mode, SCM name);
|
|||
SCM_API SCM scm_file_port_p (SCM obj);
|
||||
SCM_API void scm_init_fports (void);
|
||||
|
||||
/* internal functions */
|
||||
|
||||
SCM_API SCM scm_i_fdes_to_port (int fdes, long mode_bits, SCM name);
|
||||
|
||||
#endif /* SCM_FPORTS_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -330,7 +330,7 @@ SCM_DEFINE (scm_drain_input, "drain-input", 1, 0, 0,
|
|||
count += pt->saved_read_end - pt->saved_read_pos;
|
||||
|
||||
result = scm_allocate_string (count);
|
||||
scm_take_from_input_buffers (port, SCM_STRING_CHARS (result), count);
|
||||
scm_take_from_input_buffers (port, SCM_I_STRING_CHARS (result), count);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -680,6 +680,18 @@ scm_mode_bits (char *modes)
|
|||
| (strchr (modes, 'l') ? SCM_BUFLINE : 0));
|
||||
}
|
||||
|
||||
long
|
||||
scm_i_mode_bits (SCM modes)
|
||||
{
|
||||
long bits;
|
||||
|
||||
if (!scm_is_string (modes))
|
||||
scm_wrong_type_arg_msg (NULL, 0, modes, "string");
|
||||
|
||||
bits = scm_mode_bits (SCM_I_STRING_CHARS (modes));
|
||||
scm_remember_upto_here_1 (modes);
|
||||
return bits;
|
||||
}
|
||||
|
||||
/* Return the mode flags from an open port.
|
||||
* Some modes such as "append" are only used when opening
|
||||
|
@ -1310,7 +1322,7 @@ SCM_DEFINE (scm_unread_string, "unread-string", 2, 0, 0,
|
|||
else
|
||||
SCM_VALIDATE_OPINPORT (2, port);
|
||||
|
||||
scm_ungets (SCM_STRING_CHARS (str), SCM_STRING_LENGTH (str), port);
|
||||
scm_ungets (SCM_I_STRING_CHARS (str), SCM_I_STRING_LENGTH (str), port);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
@ -1599,12 +1611,11 @@ write_void_port (SCM port SCM_UNUSED,
|
|||
{
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_void_port (char *mode_str)
|
||||
static SCM
|
||||
scm_i_void_port (long mode_bits)
|
||||
{
|
||||
scm_mutex_lock (&scm_i_port_table_mutex);
|
||||
{
|
||||
int mode_bits = scm_mode_bits (mode_str);
|
||||
SCM answer = scm_new_port_table_entry (scm_tc16_void_port);
|
||||
scm_t_port * pt = SCM_PTAB_ENTRY(answer);
|
||||
|
||||
|
@ -1617,6 +1628,12 @@ scm_void_port (char *mode_str)
|
|||
}
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_void_port (char *mode_str)
|
||||
{
|
||||
return scm_i_void_port (scm_mode_bits (mode_str));
|
||||
}
|
||||
|
||||
SCM_DEFINE (scm_sys_make_void_port, "%make-void-port", 1, 0, 0,
|
||||
(SCM mode),
|
||||
"Create and return a new void port. A void port acts like\n"
|
||||
|
@ -1625,8 +1642,7 @@ SCM_DEFINE (scm_sys_make_void_port, "%make-void-port", 1, 0, 0,
|
|||
"documentation for @code{open-file} in @ref{File Ports}.")
|
||||
#define FUNC_NAME s_scm_sys_make_void_port
|
||||
{
|
||||
SCM_VALIDATE_STRING (1, mode);
|
||||
return scm_void_port (SCM_STRING_CHARS (mode));
|
||||
return scm_i_void_port (scm_i_mode_bits (mode));
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
|
|
|
@ -301,6 +301,11 @@ SCM_API SCM scm_pt_size (void);
|
|||
SCM_API SCM scm_pt_member (SCM member);
|
||||
#endif /* GUILE_DEBUG */
|
||||
|
||||
/* internal */
|
||||
|
||||
SCM_API long scm_i_mode_bits (SCM modes);
|
||||
|
||||
|
||||
#endif /* SCM_PORTS_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -196,7 +196,7 @@ SCM_DEFINE (scm_make_soft_port, "make-soft-port", 2, 0, 0,
|
|||
z = scm_new_port_table_entry (scm_tc16_sfport);
|
||||
pt = SCM_PTAB_ENTRY (z);
|
||||
scm_port_non_buffer (pt);
|
||||
SCM_SET_CELL_TYPE (z, scm_tc16_sfport | scm_mode_bits (SCM_STRING_CHARS (modes)));
|
||||
SCM_SET_CELL_TYPE (z, scm_tc16_sfport | scm_i_mode_bits (modes));
|
||||
|
||||
SCM_SETSTREAM (z, SCM_UNPACK (pv));
|
||||
scm_mutex_unlock (&scm_i_port_table_mutex);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue