21.5
Ben, please review. I think your "Great Mule Merge" patch simply
didn't consider that all XEmacsen >=21.5.6 do EOL processing on
request, and removed the hardcoded conditional without replacing it
with the needed runtime conditional. Please confirm.
Not for 21.4.
This patch fixes the C-level tests of file-coding (ie, EOL handling)
to properly account for the runtime configuration of EOL conversion.
In light testing it seems to fix the abort in test without introducing
problems in other configurations, but it needs more testing.
Thanks to Ben and Malcolm for past discussions and thread URLs.
Note that the patch needs -p1 to apply, not -p0.
diff --git a/src/ChangeLog b/src/ChangeLog
index bfde07f..b701e3e 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -0,0 +1,5 @@
+2006-05-20 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * tests.c (Ftest_data_format_conversion): Fix no-mule autodetect
+ bugs. Update FSF copyright.
+
diff --git a/src/tests.c b/src/tests.c
index c999454..9deb62c 100644
--- a/src/tests.c
+++ b/src/tests.c
@@ -1,6 +1,7 @@
/* C support for testing XEmacs - see tests/automated/c-tests.el
Copyright (C) 2000 Martin Buchholz
Copyright (C) 2001, 2002 Ben Wing.
+ Copyright (C) 2006 The Free Software Foundation, Inc.
This file is part of XEmacs.
@@ -32,6 +33,7 @@ Boston, MA 02111-1307, USA. */
#include "lstream.h"
#include "elhash.h"
#include "opaque.h"
+#include "file-coding.h" /* XCODING_SYSTEM_EOL_TYPE and its values */
static Lisp_Object Vtest_function_list;
@@ -63,6 +65,8 @@ Test TO_EXTERNAL_FORMAT() and TO_INTERNA
Lisp_Object opaque_latin = make_opaque (ext_latin, sizeof (ext_latin) - 1);
Lisp_Object opaque0_latin = make_opaque (ext_latin, sizeof (ext_latin));
Lisp_Object string_latin1 = make_string (int_latin1, sizeof (int_latin1) - 1);
+ int autodetect_eol_p =
+ !NILP (Fsymbol_value (intern ("eol-detection-enabled-p")));
/* Check for expected strings before and after conversion.
Conversions depend on whether MULE is defined. */
@@ -86,14 +90,24 @@ Test TO_EXTERNAL_FORMAT() and TO_INTERNA
DFC_CHECK_DATA_NUL (ptr, len, constant_string_non_mule)
#endif
+ /* These now only apply to base coding systems, and
+ need to test `eol-detection-enabled-p' at runtime. */
#define DFC_CHECK_DATA_COND_EOL(ptr,len, \
- constant_string_eol, \
- constant_string_non_eol) \
- DFC_CHECK_DATA (ptr, len, constant_string_eol)
+ constant_string_eol, \
+ constant_string_non_eol) do { \
+ if (autodetect_eol_p) \
+ DFC_CHECK_DATA (ptr, len, constant_string_eol); \
+ else \
+ DFC_CHECK_DATA (ptr, len, constant_string_non_eol); \
+ } while (0)
#define DFC_CHECK_DATA_COND_EOL_NUL(ptr,len, \
- constant_string_eol, \
- constant_string_non_eol) \
- DFC_CHECK_DATA_NUL (ptr, len, constant_string_eol)
+ constant_string_eol, \
+ constant_string_non_eol) do { \
+ if (autodetect_eol_p) \
+ DFC_CHECK_DATA_NUL (ptr, len, constant_string_eol); \
+ else \
+ DFC_CHECK_DATA_NUL (ptr, len, constant_string_non_eol); \
+ } while (0)
/* Check for expected strings before and after conversion. */
#define DFC_CHECK_DATA(ptr,len, constant_string) do { \
@@ -311,58 +325,106 @@ Test TO_EXTERNAL_FORMAT() and TO_INTERNA
DFC_CHECK_DATA_COND_MULE_NUL (XSTRING_DATA (string),
XSTRING_LENGTH (string), int_latin1, ext_latin);
-
+ /* This next group used to use the COND_EOL macros, but with the new Mule,
+ they all specify an EOL convention, and all XEmacsen can grok them. */
ptr = NULL, len = rand();
TO_EXTERNAL_FORMAT (DATA, (int_foo, sizeof (int_foo)),
MALLOC, (ptr, len),
Qbinary);
- DFC_CHECK_DATA_COND_EOL_NUL (ptr, len, ext_unix, int_foo);
+ DFC_CHECK_DATA_NUL (ptr, len, ext_unix);
xfree (ptr, void *);
ptr = NULL, len = rand();
TO_EXTERNAL_FORMAT (DATA, (int_foo, sizeof (int_foo) - 1),
LISP_OPAQUE, opaque,
intern ("raw-text-mac"));
- DFC_CHECK_DATA_COND_EOL (XOPAQUE_DATA (opaque),
- XOPAQUE_SIZE (opaque), ext_mac, int_foo);
+ DFC_CHECK_DATA (XOPAQUE_DATA (opaque), XOPAQUE_SIZE (opaque), ext_mac);
ptr = NULL, len = rand();
TO_EXTERNAL_FORMAT (LISP_STRING, string_foo,
ALLOCA, (ptr, len),
intern ("raw-text-dos"));
- DFC_CHECK_DATA_COND_EOL (ptr, len, ext_dos, int_foo);
+ DFC_CHECK_DATA (ptr, len, ext_dos);
ptr = NULL, len = rand();
TO_EXTERNAL_FORMAT (DATA, (int_foo, sizeof (int_foo) - 1),
ALLOCA, (ptr, len),
intern ("raw-text-unix"));
- DFC_CHECK_DATA_COND_EOL (ptr, len, ext_unix, int_foo);
+ DFC_CHECK_DATA (ptr, len, ext_unix);
ptr = NULL, len = rand();
TO_EXTERNAL_FORMAT (LISP_STRING, string_foo,
MALLOC, (ptr, len),
intern ("no-conversion-mac"));
- DFC_CHECK_DATA_COND_EOL (ptr, len, ext_mac, int_foo);
+ DFC_CHECK_DATA (ptr, len, ext_mac);
xfree (ptr, void *);
ptr = NULL, len = rand();
TO_EXTERNAL_FORMAT (DATA, (int_foo, sizeof (int_foo) - 1),
ALLOCA, (ptr, len),
intern ("no-conversion-dos"));
- DFC_CHECK_DATA_COND_EOL (ptr, len, ext_dos, int_foo);
+ DFC_CHECK_DATA (ptr, len, ext_dos);
ptr = NULL, len = rand();
TO_EXTERNAL_FORMAT (DATA, (int_foo, sizeof (int_foo)),
ALLOCA, (ptr, len),
intern ("no-conversion-unix"));
- DFC_CHECK_DATA_COND_EOL_NUL (ptr, len, ext_unix, int_foo);
+ DFC_CHECK_DATA_NUL (ptr, len, ext_unix);
- TO_INTERNAL_FORMAT (LISP_OPAQUE, opaque_dos,
- LISP_BUFFER, Fcurrent_buffer(),
- intern ("undecided"));
- /* &&#### needs some 8-bit work here */
- DFC_CHECK_DATA (BUF_BYTE_ADDRESS (current_buffer, BUF_PT (current_buffer)),
- sizeof (int_foo) - 1, int_foo);
+ /* Oh, Lawdy, Lawdy, Lawdy, this done broke mah heart!
+
+ This is all so broken. *sigh* I'm afraid that there's some magic
+ for dealing with XCODING_SYSTEM_EOL_TYPE, but I didn't find an API
+ or discussion to that effect ... just do it and pray.
+
+ Mule. You'll envy the dead.
+ */
+
+ {
+ Lisp_Object undecided = intern ("undecided");
+ Lisp_Object undecided_cs = Fget_coding_system (undecided);
+
+ /* check eol autodetection doesn't happen when disabled */
+ XCODING_SYSTEM_EOL_TYPE (undecided_cs) = EOL_LF;
+ TO_INTERNAL_FORMAT (LISP_OPAQUE, opaque_dos,
+ LISP_BUFFER, Fcurrent_buffer(),
+ undecided);
+ DFC_CHECK_DATA (BUF_BYTE_ADDRESS (current_buffer, BUF_PT (current_buffer)),
+ sizeof (ext_dos) - 1, ext_dos);
+
+ /* check eol autodetection works when enabled */
+ XCODING_SYSTEM_EOL_TYPE (undecided_cs) = EOL_AUTODETECT;
+ TO_INTERNAL_FORMAT (LISP_OPAQUE, opaque_dos,
+ LISP_BUFFER, Fcurrent_buffer(),
+ undecided);
+ DFC_CHECK_DATA (BUF_BYTE_ADDRESS (current_buffer, BUF_PT (current_buffer)),
+ sizeof (int_foo) - 1, int_foo);
+
+ /* reset to default */
+ XCODING_SYSTEM_EOL_TYPE (undecided_cs) =
+ autodetect_eol_p ? EOL_AUTODETECT : EOL_LF;
+ }
+
+ /* Does eol-detection-enabled-p reflect the actual state of affairs?
+ This probably could be tested in Lisp somehow. Should it? */
+ if (autodetect_eol_p)
+ {
+ TO_INTERNAL_FORMAT (LISP_OPAQUE, opaque_dos,
+ LISP_BUFFER, Fcurrent_buffer(),
+ intern ("undecided"));
+ DFC_CHECK_DATA (BUF_BYTE_ADDRESS (current_buffer,
+ BUF_PT (current_buffer)),
+ sizeof (int_foo) - 1, int_foo);
+ }
+ else
+ {
+ TO_INTERNAL_FORMAT (LISP_OPAQUE, opaque_dos,
+ LISP_BUFFER, Fcurrent_buffer(),
+ intern ("undecided"));
+ DFC_CHECK_DATA (BUF_BYTE_ADDRESS (current_buffer,
+ BUF_PT (current_buffer)),
+ sizeof (ext_dos) - 1, ext_dos);
+ }
TO_INTERNAL_FORMAT (DATA, (ext_mac, sizeof (ext_mac) - 1),
LISP_STRING, string,
--
Graduate School of Systems and Information Engineering University of Tsukuba
http://turnbull.sk.tsukuba.ac.jp/ Tennodai 1-1-1 Tsukuba 305-8573 JAPAN
Economics of Information Communication and Computation Systems
Experimental Economics, Microeconomic Theory, Game Theory