diff options
author | Andy Wingo <wingo@pobox.com> | 2016-05-13 11:21:41 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2016-05-13 11:27:37 +0200 |
commit | e5d2f4e566586f768bda99c28a74fd2303ecace1 (patch) | |
tree | 71fead353c58b0a42e7c3dbf71bd4e9d884297b4 | |
parent | 9a9e0cceae8433ba45e2ab9b37c02dd3b3c71d9a (diff) | |
download | guile-e5d2f4e566586f768bda99c28a74fd2303ecace1.tar.gz |
Make scm_t_port private
* libguile/ports-internal.h (enum scm_port_encoding_mode): Remove unused
enum.
(scm_t_port_internal, scm_t_port): Make encoding and
conversion_strategy private. Instead of scm_t_port_internal containing
scm_t_port, now that all members are private, we can store the user's
"stream" in a word in the port object itself and make the whole of
scm_t_port private. The next commit will remove scm_t_port_internal.
(SCM_PTAB_ENTRY, SCM_PORT_DESCRIPTOR): Make private.
* libguile/ports.c (scm_c_make_port_with_encoding): Adapt to new port
layout.
(scm_port_print): Use SCM_PTAB_ENTRY when printing.
* libguile/ports.h: Remove scm_t_port definition.
* libguile/ioext.c (get_matching_port): Simplify.
* libguile/fports.c (scm_i_evict_port): Simplify.
-rw-r--r-- | libguile/fports.c | 11 | ||||
-rw-r--r-- | libguile/ioext.c | 4 | ||||
-rw-r--r-- | libguile/ports-internal.h | 22 | ||||
-rw-r--r-- | libguile/ports.c | 34 | ||||
-rw-r--r-- | libguile/ports.h | 24 |
5 files changed, 32 insertions, 63 deletions
diff --git a/libguile/fports.c b/libguile/fports.c index aab83c9d3..c756129d7 100644 --- a/libguile/fports.c +++ b/libguile/fports.c @@ -83,16 +83,9 @@ scm_i_evict_port (void *closure, SCM port) { int fd = * (int*) closure; - if (SCM_FPORTP (port)) + if (SCM_OPFPORTP (port)) { - scm_t_port *p; - scm_t_fport *fp; - - /* XXX: In some cases, we can encounter a port with no associated ptab - entry. */ - p = SCM_PTAB_ENTRY (port); - fp = (p != NULL) ? (scm_t_fport *) p->stream : NULL; - + scm_t_fport *fp = SCM_FSTREAM (port); if ((fp != NULL) && (fp->fdes == fd)) { fp->fdes = dup (fd); diff --git a/libguile/ioext.c b/libguile/ioext.c index 36ca07baa..68f069313 100644 --- a/libguile/ioext.c +++ b/libguile/ioext.c @@ -276,10 +276,8 @@ static SCM get_matching_port (void *closure, SCM port, SCM result) { int fd = * (int *) closure; - scm_t_port *entry = SCM_PTAB_ENTRY (port); - if (SCM_OPFPORTP (port) - && ((scm_t_fport *) entry->stream)->fdes == fd) + if (SCM_OPFPORTP (port) && SCM_FSTREAM (port)->fdes == fd) result = scm_cons (port, result); return result; diff --git a/libguile/ports-internal.h b/libguile/ports-internal.h index 948c27bcb..e2a672d8b 100644 --- a/libguile/ports-internal.h +++ b/libguile/ports-internal.h @@ -231,14 +231,6 @@ scm_port_buffer_putback (SCM buf, const scm_t_uint8 *src, size_t count) src, count); } -enum scm_port_encoding_mode { - SCM_PORT_ENCODING_MODE_UTF8, - SCM_PORT_ENCODING_MODE_LATIN1, - SCM_PORT_ENCODING_MODE_ICONV -}; - -typedef enum scm_port_encoding_mode scm_t_port_encoding_mode; - /* This is a separate object so that only those ports that use iconv cause finalizers to be registered. */ struct scm_iconv_descriptors @@ -257,10 +249,8 @@ struct scm_iconv_descriptors typedef struct scm_iconv_descriptors scm_t_iconv_descriptors; -struct scm_port_internal +struct scm_port { - scm_t_port pt; - /* Source location information. */ SCM file_name; long line_number; @@ -284,13 +274,21 @@ struct scm_port_internal and so on. */ int rw_random; + /* Character encoding support. */ + SCM encoding; /* A symbol of upper-case ASCII. */ + SCM conversion_strategy; /* A symbol; either substitute, error, or escape. */ + unsigned at_stream_start_for_bom_read : 1; unsigned at_stream_start_for_bom_write : 1; scm_t_iconv_descriptors *iconv_descriptors; SCM alist; }; -typedef struct scm_port_internal scm_t_port_internal; +typedef struct scm_port scm_t_port; +typedef scm_t_port scm_t_port_internal; + +#define SCM_PTAB_ENTRY(x) ((scm_t_port *) SCM_CELL_WORD_2 (x)) +#define SCM_PORT_DESCRIPTOR(port) ((scm_t_ptob_descriptor *) SCM_CELL_WORD_3 (port)) #define SCM_UNICODE_BOM 0xFEFFUL /* Unicode byte-order mark */ diff --git a/libguile/ports.c b/libguile/ports.c index 763e006bc..ba6be67c3 100644 --- a/libguile/ports.c +++ b/libguile/ports.c @@ -55,7 +55,7 @@ #include "libguile/strings.h" #include "libguile/mallocs.h" #include "libguile/validate.h" -#include "libguile/ports.h" +//#include "libguile/ports.h" #include "libguile/ports-internal.h" #include "libguile/vectors.h" #include "libguile/weak-set.h" @@ -716,28 +716,26 @@ scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits, scm_t_bits stream) { SCM ret; - scm_t_port *entry; - scm_t_port_internal *pti; + scm_t_port *pt; scm_t_ptob_descriptor *ptob; - pti = scm_gc_typed_calloc (scm_t_port_internal); - entry = &pti->pt; + pt = scm_gc_typed_calloc (scm_t_port); ptob = scm_c_port_type_ref (SCM_TC2PTOBNUM (tag)); - ret = scm_words (tag | mode_bits, 3); - SCM_SET_CELL_WORD_1 (ret, (scm_t_bits) entry); - SCM_SET_CELL_WORD_2 (ret, (scm_t_bits) ptob); + ret = scm_words (tag | mode_bits, 4); + SCM_SET_CELL_WORD_1 (ret, stream); + SCM_SET_CELL_WORD_2 (ret, (scm_t_bits) pt); + SCM_SET_CELL_WORD_3 (ret, (scm_t_bits) ptob); - entry->stream = stream; - entry->encoding = encoding; - entry->conversion_strategy = conversion_strategy; - pti->file_name = SCM_BOOL_F; - pti->iconv_descriptors = NULL; + pt->encoding = encoding; + pt->conversion_strategy = conversion_strategy; + pt->file_name = SCM_BOOL_F; + pt->iconv_descriptors = NULL; - pti->at_stream_start_for_bom_read = 1; - pti->at_stream_start_for_bom_write = 1; + pt->at_stream_start_for_bom_read = 1; + pt->at_stream_start_for_bom_write = 1; - pti->alist = SCM_EOL; + pt->alist = SCM_EOL; if (SCM_PORT_DESCRIPTOR (ret)->flags & SCM_PORT_TYPE_NEEDS_CLOSE_ON_GC) { @@ -747,7 +745,7 @@ scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits, initialize_port_buffers (ret); - pti->rw_random = ptob->random_access_p (ret); + pt->rw_random = ptob->random_access_p (ret); return ret; } @@ -3098,7 +3096,7 @@ scm_port_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) scm_print_port_mode (exp, port); scm_puts (type, port); scm_putc (' ', port); - scm_uintprint (SCM_CELL_WORD_1 (exp), 16, port); + scm_uintprint ((scm_t_bits) SCM_PTAB_ENTRY (exp), 16, port); scm_putc ('>', port); return 1; } diff --git a/libguile/ports.h b/libguile/ports.h index 14f4c83db..f90a6b6c5 100644 --- a/libguile/ports.h +++ b/libguile/ports.h @@ -41,22 +41,6 @@ -/* An internal-only structure defined in ports-internal.h. */ -struct scm_port_internal; - -/* C representation of a Scheme port. */ - -typedef struct -{ - /* Data for the underlying port implementation as a raw C value. */ - scm_t_bits stream; - - /* Character encoding support. */ - SCM encoding; /* A symbol of upper-case ASCII. */ - SCM conversion_strategy; /* A symbol; either substitute, error, or escape. */ -} scm_t_port; - - SCM_INTERNAL SCM scm_i_port_weak_set; @@ -86,11 +70,9 @@ SCM_INTERNAL SCM scm_i_port_weak_set; #define SCM_CLR_PORT_OPEN_FLAG(p) \ SCM_SET_CELL_WORD_0 ((p), SCM_CELL_WORD_0 (p) & ~SCM_OPN) -#define SCM_PTAB_ENTRY(x) ((scm_t_port *) SCM_CELL_WORD_1 (x)) -#define SCM_PORT_DESCRIPTOR(port) ((scm_t_ptob_descriptor *) SCM_CELL_WORD_2 (port)) -#define SCM_SETPTAB_ENTRY(x, ent) (SCM_SET_CELL_WORD_1 ((x), (scm_t_bits) (ent))) -#define SCM_STREAM(x) (SCM_PTAB_ENTRY(x)->stream) -#define SCM_SETSTREAM(x, s) (SCM_PTAB_ENTRY(x)->stream = (scm_t_bits) (s)) +#define SCM_STREAM(port) (SCM_CELL_WORD_1 (port)) +#define SCM_SETSTREAM(port, stream) (SCM_SET_CELL_WORD_1 (port, stream)) + /* Maximum number of port types. */ #define SCM_I_MAX_PORT_TYPE_COUNT 256 |