Merge commit 'a38024baaa32d1a6d91fdc81388c88bbb926c3ae'
authorAndy Wingo <wingo@pobox.com>
Thu, 28 Nov 2013 15:15:38 +0000 (16:15 +0100)
committerAndy Wingo <wingo@pobox.com>
Thu, 28 Nov 2013 15:15:38 +0000 (16:15 +0100)
Conflicts:
libguile/ports.h

1  2 
libguile/ports.c
libguile/ports.h
libguile/read.c

  #include "libguile/ports.h"
  #include "libguile/ports-internal.h"
  #include "libguile/vectors.h"
 -#include "libguile/weaks.h"
 +#include "libguile/weak-set.h"
  #include "libguile/fluids.h"
  #include "libguile/eq.h"
+ #include "libguile/alist.h"
  
  #ifdef HAVE_STRING_H
  #include <string.h>
@@@ -361,96 -317,43 +361,96 @@@ SCM_API SCM scm_port_column (SCM port)
  SCM_API SCM scm_set_port_column_x (SCM port, SCM line);
  SCM_API SCM scm_port_filename (SCM port);
  SCM_API SCM scm_set_port_filename_x (SCM port, SCM filename);
- /* Port alist.  */
- SCM_INTERNAL SCM scm_i_port_alist (SCM port);
- SCM_INTERNAL void scm_i_set_port_alist_x (SCM port, SCM alist);
 +
 -SCM_INTERNAL const char *scm_i_default_port_encoding (void);
 -SCM_INTERNAL void scm_i_set_default_port_encoding (const char *);
 -SCM_INTERNAL void scm_i_set_port_encoding_x (SCM port, const char *str);
 -SCM_API SCM scm_port_encoding (SCM port);
 -SCM_API SCM scm_set_port_encoding_x (SCM port, SCM encoding);
 -SCM_INTERNAL scm_t_string_failed_conversion_handler
 -scm_i_default_port_conversion_handler (void);
 -/* Use HANDLER as the default conversion strategy for future ports.  */
 -SCM_INTERNAL void
 -scm_i_set_default_port_conversion_handler (scm_t_string_failed_conversion_handler);
 -SCM_API int scm_slow_get_byte_or_eof (SCM port);
 -SCM_API int scm_slow_peek_byte_or_eof (SCM port);
++/* Port properties.  */
+ SCM_INTERNAL SCM scm_i_port_property (SCM port, SCM key);
+ SCM_INTERNAL SCM scm_i_set_port_property_x (SCM port, SCM key, SCM value);
  
 -SCM_API SCM scm_port_conversion_strategy (SCM port);
 -SCM_API SCM scm_set_port_conversion_strategy_x (SCM port, SCM behavior);
 +/* Implementation helpers for port printing functions.  */
  SCM_API int scm_port_print (SCM exp, SCM port, scm_print_state *);
  SCM_API void scm_print_port_mode (SCM exp, SCM port);
 +
 +/* Iterating over all ports.  */
 +SCM_API SCM scm_port_for_each (SCM proc);
 +SCM_API void scm_c_port_for_each (void (*proc)(void *data, SCM p), void *data);
 +SCM_API SCM scm_flush_all_ports (void);
 +
 +/* Void ports.  */
  SCM_API SCM scm_void_port (char * mode_str);
  SCM_API SCM scm_sys_make_void_port (SCM mode);
 +
 +/* Initialization.  */
  SCM_INTERNAL void scm_init_ports (void);
  
 -#if SCM_ENABLE_DEPRECATED==1
 -SCM_DEPRECATED scm_t_port * scm_add_to_port_table (SCM port);
 -#endif
  
 -#ifdef GUILE_DEBUG
 -SCM_API SCM scm_pt_size (void);
 -SCM_API SCM scm_pt_member (SCM member);
 -#endif /* GUILE_DEBUG */
 +/* Inline function implementations.  */
  
 -/* internal */
 +#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
 +SCM_INLINE_IMPLEMENTATION int
 +scm_c_lock_port (SCM port, scm_i_pthread_mutex_t **lock)
 +{
 +  *lock = SCM_PTAB_ENTRY (port)->lock;
  
 -SCM_INTERNAL long scm_i_mode_bits (SCM modes);
 -SCM_INTERNAL void scm_i_dynwind_current_load_port (SCM port);
 +  if (*lock)
 +    return scm_i_pthread_mutex_lock (*lock);
 +  else
 +    return 0;
 +}
 +
 +SCM_INLINE_IMPLEMENTATION int
 +scm_c_try_lock_port (SCM port, scm_i_pthread_mutex_t **lock)
 +{
 +  *lock = SCM_PTAB_ENTRY (port)->lock;
 +  if (*lock)
 +    {
 +      int ret = scm_i_pthread_mutex_trylock (*lock);
 +      if (ret != 0)
 +        *lock = NULL;
 +      return ret;
 +    }
 +  else
 +    return 0;
 +}
 +
 +SCM_INLINE_IMPLEMENTATION int
 +scm_get_byte_or_eof_unlocked (SCM port)
 +{
 +  scm_t_port *pt = SCM_PTAB_ENTRY (port);
 +
 +  if (SCM_LIKELY ((pt->rw_active == SCM_PORT_READ || !pt->rw_random)
 +                  && pt->read_pos < pt->read_end))
 +    return *pt->read_pos++;
 +  else
 +    return scm_slow_get_byte_or_eof_unlocked (port);
 +}
 +
 +/* Like `scm_get_byte_or_eof' but does not change PORT's `read_pos'.  */
 +SCM_INLINE_IMPLEMENTATION int
 +scm_peek_byte_or_eof_unlocked (SCM port)
 +{
 +  scm_t_port *pt = SCM_PTAB_ENTRY (port);
 +
 +  if (SCM_LIKELY ((pt->rw_active == SCM_PORT_READ || !pt->rw_random)
 +                  && pt->read_pos < pt->read_end))
 +    return *pt->read_pos;
 +  else
 +    return scm_slow_peek_byte_or_eof_unlocked (port);
 +}
  
 +SCM_INLINE_IMPLEMENTATION void
 +scm_putc_unlocked (char c, SCM port)
 +{
 +  SCM_ASSERT_TYPE (SCM_OPOUTPORTP (port), port, 0, NULL, "output port");
 +  scm_lfwrite_unlocked (&c, 1, port);
 +}
 +
 +SCM_INLINE_IMPLEMENTATION void
 +scm_puts_unlocked (const char *s, SCM port)
 +{
 +  SCM_ASSERT_TYPE (SCM_OPOUTPORTP (port), port, 0, NULL, "output port");
 +  scm_lfwrite_unlocked (s, strlen (s), port);
 +}
 +#endif  /* SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES */
  
  #endif  /* SCM_PORTS_H */
  
diff --cc libguile/read.c
Simple merge