summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-05-13 11:21:41 +0200
committerAndy Wingo <wingo@pobox.com>2016-05-13 11:27:37 +0200
commite5d2f4e566586f768bda99c28a74fd2303ecace1 (patch)
tree71fead353c58b0a42e7c3dbf71bd4e9d884297b4
parent9a9e0cceae8433ba45e2ab9b37c02dd3b3c71d9a (diff)
downloadguile-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.c11
-rw-r--r--libguile/ioext.c4
-rw-r--r--libguile/ports-internal.h22
-rw-r--r--libguile/ports.c34
-rw-r--r--libguile/ports.h24
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