* fports.h, fports.c (scm_i_fdes_to_port): New, like
authorMarius Vollmer <mvo@zagadka.de>
Thu, 12 Aug 2004 17:03:36 +0000 (17:03 +0000)
committerMarius Vollmer <mvo@zagadka.de>
Thu, 12 Aug 2004 17:03:36 +0000 (17:03 +0000)
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.

libguile/fports.c
libguile/fports.h
libguile/ports.c
libguile/ports.h
libguile/vports.c

index 6b462e0..7694749 100644 (file)
@@ -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)
index 9ce23f5..3d88c2f 100644 (file)
@@ -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 */
 
 /*
index 02d72b4..d0931ed 100644 (file)
@@ -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
 
index ee53d37..93f3344 100644 (file)
@@ -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 */
 
 /*
index 096b26c..e99d796 100644 (file)
@@ -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);