X-Git-Url: https://git.hcoop.net/bpt/guile.git/blobdiff_plain/dd3a26f3da712564a294ad5890de12bcc6cb8849..51a1763f6596d594ebd774e7c3fd9138e6f4d507:/libguile/ports.h diff --git a/libguile/ports.h b/libguile/ports.h index 3af344186..ca5bf2f69 100644 --- a/libguile/ports.h +++ b/libguile/ports.h @@ -3,7 +3,8 @@ #ifndef SCM_PORTS_H #define SCM_PORTS_H -/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2003, 2004, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2006, + * 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -25,6 +26,7 @@ #include "libguile/__scm.h" +#include #include "libguile/print.h" #include "libguile/struct.h" #include "libguile/threads.h" @@ -109,6 +111,23 @@ typedef struct /* a buffer for un-read chars and strings. */ unsigned char *putback_buf; size_t putback_buf_size; /* allocated size of putback_buf. */ + + /* IMPORTANT: 'input_cd' and 'output_cd' used to be pointers to the + input and output iconv descriptors, but those have been moved to + the internal-only port structure defined in ports-internal.h. + + Given that we must preserve ABI compatibility in 2.0, we cannot + safely change this public structure without running afoul of C + strict aliasing rules. We cannot even change the member names. + + To work around this, in this public structure, 'input_cd' has been + repurposed to be a pointer to the internal port structure (see + ports-internal.h), and 'output_cd' is now unused. + + This will be cleaned up in 2.2. */ + + void *input_cd; /* XXX actually a pointer to scm_t_port_internal */ + void *output_cd; /* XXX actually unused */ } scm_t_port; @@ -199,6 +218,9 @@ typedef struct scm_t_ptob_descriptor +/* Hey you! Yes you, reading the header file! We're going to deprecate + scm_ptobs in 2.2, so please don't write any new code that uses it. + Thanks. */ SCM_API scm_t_ptob_descriptor *scm_ptobs; SCM_API long scm_numptob; @@ -233,20 +255,22 @@ SCM_API void scm_set_port_truncate (scm_t_bits tc, scm_t_off length)); SCM_API void scm_set_port_input_waiting (scm_t_bits tc, int (*input_waiting) (SCM)); SCM_API SCM scm_char_ready_p (SCM port); -size_t scm_take_from_input_buffers (SCM port, char *dest, size_t read_len); +SCM_API size_t scm_take_from_input_buffers (SCM port, char *dest, + size_t read_len); SCM_API SCM scm_drain_input (SCM port); SCM_API SCM scm_current_input_port (void); SCM_API SCM scm_current_output_port (void); SCM_API SCM scm_current_error_port (void); +SCM_API SCM scm_current_warning_port (void); SCM_API SCM scm_current_load_port (void); SCM_API SCM scm_set_current_input_port (SCM port); SCM_API SCM scm_set_current_output_port (SCM port); SCM_API SCM scm_set_current_error_port (SCM port); +SCM_API SCM scm_set_current_warning_port (SCM port); SCM_API void scm_dynwind_current_input_port (SCM port); SCM_API void scm_dynwind_current_output_port (SCM port); SCM_API void scm_dynwind_current_error_port (SCM port); SCM_API SCM scm_new_port_table_entry (scm_t_bits tag); -SCM_INTERNAL void scm_i_remove_port (SCM port); SCM_API void scm_grow_port_cbuf (SCM port, size_t requested); SCM_API SCM scm_pt_size (void); SCM_API SCM scm_pt_member (SCM member); @@ -273,13 +297,12 @@ SCM_API scm_t_wchar scm_getc (SCM port); SCM_API size_t scm_c_read (SCM port, void *buffer, size_t size); SCM_API void scm_c_write (SCM port, const void *buffer, size_t size); SCM_API void scm_lfwrite (const char *ptr, size_t size, SCM port); -SCM_INTERNAL void scm_lfwrite_str (SCM str, SCM port); SCM_INTERNAL void scm_lfwrite_substr (SCM str, size_t start, size_t end, SCM port); SCM_API void scm_flush (SCM port); SCM_API void scm_end_input (SCM port); SCM_API int scm_fill_input (SCM port); -SCM_INTERNAL void scm_unget_byte (int c, SCM port); +SCM_API void scm_unget_byte (int c, SCM port); SCM_API void scm_ungetc (scm_t_wchar c, SCM port); SCM_API void scm_ungets (const char *s, int n, SCM port); SCM_API SCM scm_peek_char (SCM port); @@ -293,13 +316,21 @@ 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); -SCM_INTERNAL const char *scm_i_get_port_encoding (SCM port); +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_get_conversion_strategy (SCM port); -SCM_INTERNAL void scm_i_set_conversion_strategy_x (SCM port, - scm_t_string_failed_conversion_handler h); +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); + SCM_API SCM scm_port_conversion_strategy (SCM port); SCM_API SCM scm_set_port_conversion_strategy_x (SCM port, SCM behavior); SCM_API int scm_port_print (SCM exp, SCM port, scm_print_state *);