summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2009-11-14 16:14:20 +0100
committerLudovic Courtès <ludo@gnu.org>2009-11-14 16:59:25 +0100
commitd6a6989e08a84cbf3c6b11c199536f665cbb6b50 (patch)
treeb444cbd57da811480c67d02125c5ae1e69ddecd1
parentc2be4e891c8cc085c4eb3f68125c95d86fae856c (diff)
downloadguile-d6a6989e08a84cbf3c6b11c199536f665cbb6b50.tar.gz
Replace `setbinary' by a public `%default-port-encoding' fluid.
* doc/ref/api-evaluation.texi (Character Encoding of Source Files): Add reference to the "Ports" node. * doc/ref/api-io.texi (Ports): Document `%default-port-encoding'. * libguile/ports.c (scm_port_encoding_var): Rename to... (default_port_encoding_var): ... this; update callers. Make `static'. * libguile/posix.c (scm_setbinary): Remove. * libguile/posix.h: Adjust accordingly. * test-suite/tests/numbers.test: Remove unneeded `setbinary' call. * test-suite/tests/ports.test: Replace `setbinary' call by equivalent `%default-port-encoding' mutation and `set-port-encoding!' calls. * test-suite/tests/r6rs-ports.test: Replace `setbinary' call by equivalent `%default-port-encoding' mutation.
-rw-r--r--doc/ref/api-evaluation.texi7
-rw-r--r--doc/ref/api-io.texi6
-rw-r--r--libguile/ports.c30
-rw-r--r--libguile/posix.c28
-rw-r--r--libguile/posix.h3
-rw-r--r--test-suite/tests/numbers.test3
-rw-r--r--test-suite/tests/ports.test10
-rw-r--r--test-suite/tests/r6rs-ports.test4
8 files changed, 38 insertions, 53 deletions
diff --git a/doc/ref/api-evaluation.texi b/doc/ref/api-evaluation.texi
index e50a51546..cd5a6588a 100644
--- a/doc/ref/api-evaluation.texi
+++ b/doc/ref/api-evaluation.texi
@@ -666,14 +666,17 @@ and @code{UTF-32} may not be used because they are not compatible with
ASCII.
@cindex read
-@cindex set-port-encoding!
+@cindex encoding
+@cindex port encoding
+@findex set-port-encoding!
There might be a scenario in which one would want to read non-ASCII
code from a port, such as with the function @code{read}, instead of
with @code{load}. If the port's character encoding is the same as the
encoding of the code to be read by the port, not other special
handling is necessary. The port will automatically do the character
encoding conversion. The functions @code{setlocale} or by
-@code{set-port-encoding!} are used to set port encodings.
+@code{set-port-encoding!} are used to set port encodings
+(@pxref{Ports}).
If a port is used to read code of unknown character encoding, it can
accomplish this in three steps. First, the character encoding of the
diff --git a/doc/ref/api-io.texi b/doc/ref/api-io.texi
index 83a2fd79c..a5ffa2319 100644
--- a/doc/ref/api-io.texi
+++ b/doc/ref/api-io.texi
@@ -111,6 +111,12 @@ Sets the character encoding that will be used to interpret all port
I/O. @var{enc} is a string containing the name of an encoding.
@end deffn
+@defvr {Scheme Variable} %default-port-encoding
+A fluid containing containing @code{#f} or the name of the encoding to
+be used by default for newly created ports (@pxref{Fluids and Dynamic
+States}). The value @code{#f} is equivalent to @code{"ISO-8859-1"}.
+@end defvr
+
New ports are created with the encoding appropriate for the current
locale if @code{setlocale} has been called or ISO-8859-1 otherwise,
and this procedure can be used to modify that encoding.
diff --git a/libguile/ports.c b/libguile/ports.c
index c3415c770..8127e9823 100644
--- a/libguile/ports.c
+++ b/libguile/ports.c
@@ -1917,10 +1917,11 @@ SCM_DEFINE (scm_set_port_filename_x, "set-port-filename!", 2, 0, 0,
}
#undef FUNC_NAME
-/* The default port encoding for this locale. New ports will have this
- encoding. If it is a string, that is the encoding. If it #f, it
- is in the native (Latin-1) encoding. */
-SCM_GLOBAL_VARIABLE (scm_port_encoding_var, "%port-encoding");
+/* A fluid specifying the default encoding for newly created ports. If it is
+ a string, that is the encoding. If it is #f, it is in the "native"
+ (Latin-1) encoding. */
+SCM_VARIABLE (default_port_encoding_var, "%default-port-encoding");
+
static int scm_port_encoding_init = 0;
/* Return a C string representation of the current encoding. */
@@ -1933,11 +1934,11 @@ scm_i_get_port_encoding (SCM port)
{
if (!scm_port_encoding_init)
return NULL;
- else if (!scm_is_fluid (SCM_VARIABLE_REF (scm_port_encoding_var)))
+ else if (!scm_is_fluid (SCM_VARIABLE_REF (default_port_encoding_var)))
return NULL;
else
{
- encoding = scm_fluid_ref (SCM_VARIABLE_REF (scm_port_encoding_var));
+ encoding = scm_fluid_ref (SCM_VARIABLE_REF (default_port_encoding_var));
if (!scm_is_string (encoding))
return NULL;
else
@@ -2002,7 +2003,7 @@ scm_i_set_port_encoding_x (SCM port, const char *enc)
{
/* Set the default encoding for future ports. */
if (!scm_port_encoding_init
- || !scm_is_fluid (SCM_VARIABLE_REF (scm_port_encoding_var)))
+ || !scm_is_fluid (SCM_VARIABLE_REF (default_port_encoding_var)))
scm_misc_error (NULL, "tried to set port encoding fluid before it is initialized",
SCM_EOL);
@@ -2010,9 +2011,9 @@ scm_i_set_port_encoding_x (SCM port, const char *enc)
|| !strcmp (valid_enc, "ASCII")
|| !strcmp (valid_enc, "ANSI_X3.4-1968")
|| !strcmp (valid_enc, "ISO-8859-1"))
- scm_fluid_set_x (SCM_VARIABLE_REF (scm_port_encoding_var), SCM_BOOL_F);
+ scm_fluid_set_x (SCM_VARIABLE_REF (default_port_encoding_var), SCM_BOOL_F);
else
- scm_fluid_set_x (SCM_VARIABLE_REF (scm_port_encoding_var),
+ scm_fluid_set_x (SCM_VARIABLE_REF (default_port_encoding_var),
scm_from_locale_string (valid_enc));
}
else
@@ -2045,7 +2046,7 @@ SCM_DEFINE (scm_port_encoding, "port-encoding", 1, 0, 0,
return scm_from_locale_string ("NONE");
}
#undef FUNC_NAME
-
+
SCM_DEFINE (scm_set_port_encoding_x, "set-port-encoding!", 2, 0, 0,
(SCM port, SCM enc),
"Sets the character encoding that will be used to interpret all\n"
@@ -2053,7 +2054,6 @@ SCM_DEFINE (scm_set_port_encoding_x, "set-port-encoding!", 2, 0, 0,
"appropriate for the current locale if @code{setlocale} has \n"
"been called or ISO-8859-1 otherwise\n"
"and this procedure can be used to modify that encoding.\n")
-
#define FUNC_NAME s_scm_set_port_encoding_x
{
char *enc_str;
@@ -2347,12 +2347,14 @@ scm_init_ports ()
cur_loadport_fluid = scm_permanent_object (scm_make_fluid ());
scm_i_port_weak_hash = scm_permanent_object (scm_make_weak_key_hash_table (SCM_I_MAKINUM(31)));
+
#include "libguile/ports.x"
- SCM_VARIABLE_SET (scm_port_encoding_var, scm_make_fluid ());
- scm_fluid_set_x (SCM_VARIABLE_REF (scm_port_encoding_var), SCM_BOOL_F);
+ /* Use Latin-1 as the default port encoding. */
+ SCM_VARIABLE_SET (default_port_encoding_var, scm_make_fluid ());
+ scm_fluid_set_x (SCM_VARIABLE_REF (default_port_encoding_var), SCM_BOOL_F);
scm_port_encoding_init = 1;
-
+
SCM_VARIABLE_SET (scm_conversion_strategy, scm_make_fluid ());
scm_fluid_set_x (SCM_VARIABLE_REF (scm_conversion_strategy),
scm_from_int ((int) SCM_FAILED_CONVERSION_QUESTION_MARK));
diff --git a/libguile/posix.c b/libguile/posix.c
index 75469531c..5187ff943 100644
--- a/libguile/posix.c
+++ b/libguile/posix.c
@@ -1554,34 +1554,6 @@ SCM_DEFINE (scm_setlocale, "setlocale", 1, 1, 0,
}
#undef FUNC_NAME
#endif /* HAVE_SETLOCALE */
-SCM_DEFINE (scm_setbinary, "setbinary", 0, 0, 0,
- (void),
- "Sets the encoding for the current input, output, and error\n"
- "ports to ISO-8859-1. That character encoding allows\n"
- "ports to operate on binary data.\n"
- "\n"
- "It also sets the default encoding for newly created ports\n"
- "to ISO-8859-1.\n"
- "\n"
- "The previous default encoding for new ports is returned\n")
-#define FUNC_NAME s_scm_setbinary
-{
- const char *enc = scm_i_get_port_encoding (SCM_BOOL_F);
-
- /* Set the default encoding for new ports. */
- scm_i_set_port_encoding_x (SCM_BOOL_F, NULL);
- /* Set the encoding for the stdio ports. */
- scm_i_set_port_encoding_x (scm_current_input_port (), NULL);
- scm_i_set_port_encoding_x (scm_current_output_port (), NULL);
- scm_i_set_port_encoding_x (scm_current_error_port (), NULL);
-
- if (enc)
- return scm_from_locale_string (enc);
-
- return scm_from_locale_string ("ISO-8859-1");
-}
-#undef FUNC_NAME
-
#ifdef HAVE_MKNOD
SCM_DEFINE (scm_mknod, "mknod", 4, 0, 0,
diff --git a/libguile/posix.h b/libguile/posix.h
index 2d93300b8..417133257 100644
--- a/libguile/posix.h
+++ b/libguile/posix.h
@@ -3,7 +3,7 @@
#ifndef SCM_POSIX_H
#define SCM_POSIX_H
-/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2003, 2006, 2008 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2003, 2006, 2008, 2009 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
@@ -74,7 +74,6 @@ SCM_API SCM scm_access (SCM path, SCM how);
SCM_API SCM scm_getpid (void);
SCM_API SCM scm_putenv (SCM str);
SCM_API SCM scm_setlocale (SCM category, SCM locale);
-SCM_API SCM scm_setbinary (void);
SCM_API SCM scm_mknod (SCM path, SCM type, SCM perms, SCM dev);
SCM_API SCM scm_nice (SCM incr);
SCM_API SCM scm_sync (void);
diff --git a/test-suite/tests/numbers.test b/test-suite/tests/numbers.test
index 774e228a7..03918315e 100644
--- a/test-suite/tests/numbers.test
+++ b/test-suite/tests/numbers.test
@@ -1,5 +1,5 @@
;;;; numbers.test --- tests guile's numbers -*- scheme -*-
-;;;; Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+;;;; Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2009 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
@@ -22,7 +22,6 @@
;;;
;;; miscellaneous
;;;
-(setbinary)
(define exception:numerical-overflow
(cons 'numerical-overflow "^Numerical overflow"))
diff --git a/test-suite/tests/ports.test b/test-suite/tests/ports.test
index 76b3e5656..312467d5d 100644
--- a/test-suite/tests/ports.test
+++ b/test-suite/tests/ports.test
@@ -1,7 +1,7 @@
;;;; ports.test --- test suite for Guile I/O ports -*- scheme -*-
;;;; Jim Blandy <jimb@red-bean.com> --- May 1999
;;;;
-;;;; Copyright (C) 1999, 2001, 2004, 2006, 2007 Free Software Foundation, Inc.
+;;;; Copyright (C) 1999, 2001, 2004, 2006, 2007, 2009 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
@@ -33,8 +33,12 @@
;;;; Some general utilities for testing ports.
-;;; Make sure we are set up for 8-bit data
-(setbinary)
+;; Make sure we are set up for 8-bit Latin-1 data.
+(fluid-set! %default-port-encoding "ISO-8859-1")
+(for-each (lambda (p)
+ (set-port-encoding! p (fluid-ref %default-port-encoding)))
+ (list (current-input-port) (current-output-port)
+ (current-error-port)))
;;; Read from PORT until EOF, and return the result as a string.
(define (read-all port)
diff --git a/test-suite/tests/r6rs-ports.test b/test-suite/tests/r6rs-ports.test
index c2b0755f8..eb60cf3ff 100644
--- a/test-suite/tests/r6rs-ports.test
+++ b/test-suite/tests/r6rs-ports.test
@@ -27,8 +27,8 @@
;;; All these tests assume Guile 1.8's port system, where characters are
;;; treated as octets.
-;;; Set the default encoding of future ports to be binary
-(setbinary)
+;; Set the default encoding of future ports to be Latin-1.
+(fluid-set! %default-port-encoding #f)
(with-test-prefix "7.2.5 End-of-File Object"