diff src/text.h @ 4990:8f0cf4fd3d2c

Automatic merge
author Ben Wing <ben@xemacs.org>
date Sat, 06 Feb 2010 04:01:46 -0600
parents 3c3c1d139863
children ae48681c47fa 46cf825f6158
line wrap: on
line diff
--- a/src/text.h	Sat Feb 06 03:59:18 2010 -0600
+++ b/src/text.h	Sat Feb 06 04:01:46 2010 -0600
@@ -1,7 +1,7 @@
 /* Header file for text manipulation primitives and macros.
    Copyright (C) 1985-1995 Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
-   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Ben Wing.
+   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2010 Ben Wing.
 
 This file is part of XEmacs.
 
@@ -538,6 +538,17 @@
 
 #endif /* MULE */
 
+/* ASSERT_ASCTEXT_ASCII(ptr): Check that an Ascbyte * pointer points to
+   purely ASCII text.  Useful for checking that putatively ASCII strings
+   (i.e. declared as Ascbyte * or const Ascbyte *) are actually ASCII.
+   This is important because otherwise we need to worry about what
+   encoding they are in -- internal or some external encoding.
+
+   ASSERT_ASCTEXT_ASCII_LEN(ptr, len): Same as ASSERT_ASCTEXT_ASCII()
+   but where the length has been explicitly given.  Useful if the string
+   may contain embedded zeroes.
+*/
+
 #ifdef ERROR_CHECK_TEXT
 #define ASSERT_ASCTEXT_ASCII_LEN(ptr, len)			\
 do {								\
@@ -1925,14 +1936,15 @@
   eicpy_ext_len (ei, ei6, ei6len, Qbinary);	\
 } while (0)
 
-#define eicpy_ext_len(ei, extdata, extlen, codesys)			 \
-do {									 \
-  const Extbyte *ei7 = (extdata);					 \
-  int ei7len = (extlen);						 \
-									 \
-  SIZED_EXTERNAL_TO_SIZED_C_STRING (ei7, ei7len, (ei)->data_,		 \
-				    (ei)->bytelen_, codesys);		 \
-  (ei)->max_size_allocated_ = (ei)->bytelen_ + 1;			 \
+#define eicpy_ext_len(ei, extdata, extlen, codesys)			\
+do {									\
+  const Extbyte *ei7 = (extdata);					\
+  int ei7len = (extlen);						\
+									\
+  TO_INTERNAL_FORMAT (DATA, (ei7, ei7len),				\
+		      ALLOCA, ((ei)->data_, (ei)->bytelen_),		\
+		      codesys);						\
+  (ei)->max_size_allocated_ = (ei)->bytelen_ + 1;			\
   (ei)->charlen_ = bytecount_to_charcount ((ei)->data_, (ei)->bytelen_); \
 } while (0)
 
@@ -1998,9 +2010,9 @@
   if ((ei)->mallocp_)				\
     {						\
       if ((ei)->data_)				\
-	xfree ((ei)->data_, Ibyte *);		\
+	xfree ((ei)->data_);		\
       if ((ei)->extdata_)			\
-	xfree ((ei)->extdata_, Extbyte *);	\
+	xfree ((ei)->extdata_);	\
       eiinit_malloc (ei);			\
     }						\
   else						\
@@ -2025,7 +2037,7 @@
 	eifind_large_enough_buffer (0, (ei)->bytelen_ + 1);		\
       ei13newdata = alloca_ibytes ((ei)->max_size_allocated_);		\
       memcpy (ei13newdata, (ei)->data_, (ei)->bytelen_ + 1);		\
-      xfree ((ei)->data_, Ibyte *);					\
+      xfree ((ei)->data_);					\
       (ei)->data_ = ei13newdata;					\
     }									\
 									\
@@ -2037,7 +2049,7 @@
       /* Double null-terminate in case of Unicode data */		\
       ei13newdata[(ei)->extlen_] = '\0';				\
       ei13newdata[(ei)->extlen_ + 1] = '\0';				\
-      xfree ((ei)->extdata_, Extbyte *);				\
+      xfree ((ei)->extdata_);				\
       (ei)->extdata_ = ei13newdata;					\
     }									\
 } while (0)
@@ -2239,7 +2251,7 @@
     {									\
       if ((ei)->extdata_)						\
 	{								\
-	  xfree ((ei)->extdata_, Extbyte *);				\
+	  xfree ((ei)->extdata_);				\
 	  (ei)->extdata_ = 0;						\
 	}								\
       TO_EXTERNAL_FORMAT (DATA, ((ei)->data_, (ei)->bytelen_),		\
@@ -2420,7 +2432,7 @@
   of conversions involving raw data and/or Lisp strings, especially when
   the output is an alloca()ed string. (When the destination is a
   Lisp_String, there are other functions that should be used instead --
-  build_ext_string() and make_ext_string(), for example.) The convenience
+  build_extstring() and make_extstring(), for example.) The convenience
   macros are of two types -- the older kind that store the result into a
   specified variable, and the newer kind that return the result.  The newer
   kind of macros don't exist when the output is sized data, because that
@@ -2800,96 +2812,6 @@
 #define DFC_LISP_BUFFER_USE_CONVERTED_DATA(sink) \
   Lstream_delete (XLSTREAM (dfc_sink.lisp_object))
 
-/* #define TEST_NEW_DFC */
-
-/* Convenience macros for extremely common invocations */
-#ifdef TEST_NEW_DFC
-#define C_STRING_TO_EXTERNAL(in, out, codesys)			\
-  do { * (Extbyte **) &(out) = 					\
-       NEW_C_STRING_TO_EXTERNAL (in, codesys); } while (0)
-#define SIZED_C_STRING_TO_EXTERNAL(in, inlen, out, codesys)		\
-  do { * (Extbyte **) &(out) =						\
-       NEW_SIZED_C_STRING_TO_EXTERNAL (in, inlen, codesys); } while (0)
-#define EXTERNAL_TO_C_STRING(in, out, codesys)			\
-  do { * (Ibyte **) &(out) =					\
-       NEW_EXTERNAL_TO_C_STRING (in, codesys); } while (0)
-#define SIZED_EXTERNAL_TO_C_STRING(in, inlen, out, codesys)		\
-  do { * (Ibyte **) &(out) =						\
-       NEW_SIZED_EXTERNAL_TO_C_STRING (in, inlen, codesys); } while (0)
-#define LISP_STRING_TO_EXTERNAL(in, out, codesys)		\
-  do { * (Extbyte **) &(out) =					\
-       NEW_LISP_STRING_TO_EXTERNAL (in, codesys); } while (0)
-#else
-#define C_STRING_TO_EXTERNAL(in, out, codesys) \
-  TO_EXTERNAL_FORMAT (C_STRING, in, C_STRING_ALLOCA, out, codesys)
-#define SIZED_C_STRING_TO_EXTERNAL(in, inlen, out, codesys) \
-  TO_EXTERNAL_FORMAT (DATA, (in, inlen), C_STRING_ALLOCA, out, codesys)
-#define EXTERNAL_TO_C_STRING(in, out, codesys) \
-  TO_INTERNAL_FORMAT (C_STRING, in, C_STRING_ALLOCA, out, codesys)
-#define SIZED_EXTERNAL_TO_C_STRING(in, inlen, out, codesys) \
-  TO_INTERNAL_FORMAT (DATA, (in, inlen), C_STRING_ALLOCA, out, codesys)
-#define LISP_STRING_TO_EXTERNAL(in, out, codesys) \
-  TO_EXTERNAL_FORMAT (LISP_STRING, in, C_STRING_ALLOCA, out, codesys)
-#endif /* TEST_NEW_DFC */
-
-#define C_STRING_TO_SIZED_EXTERNAL(in, out, outlen, codesys) \
-  TO_EXTERNAL_FORMAT (C_STRING, in, ALLOCA, (out, outlen), codesys)
-#define SIZED_C_STRING_TO_SIZED_EXTERNAL(in, inlen, out, outlen, codesys) \
-  TO_EXTERNAL_FORMAT (DATA, (in, inlen), ALLOCA, (out, outlen), codesys)
-#define EXTERNAL_TO_SIZED_C_STRING(in, out, outlen, codesys) \
-  TO_INTERNAL_FORMAT (C_STRING, in, ALLOCA, (out, outlen), codesys)
-#define SIZED_EXTERNAL_TO_SIZED_C_STRING(in, inlen, out, outlen, codesys) \
-  TO_INTERNAL_FORMAT (DATA, (in, inlen), ALLOCA, (out, outlen), codesys)
-#define LISP_STRING_TO_SIZED_EXTERNAL(in, out, outlen, codesys) \
-  TO_EXTERNAL_FORMAT (LISP_STRING, in, ALLOCA, (out, outlen), codesys)
-
-/* In place of EXTERNAL_TO_LISP_STRING(), use build_ext_string() and/or
-   make_ext_string(). */
-
-#ifdef TEST_NEW_DFC
-#define C_STRING_TO_EXTERNAL_MALLOC(in, out, codesys)			\
-  do { * (Extbyte **) &(out) =						\
-       NEW_C_STRING_TO_EXTERNAL_MALLOC (in, codesys); } while (0)
-#define SIZED_C_STRING_TO_EXTERNAL_MALLOC(in, inlen, out, codesys)	\
-  do { * (Extbyte **) &(out) =						\
-       NEW_SIZED_C_STRING_TO_EXTERNAL_MALLOC (in, inlen, codesys); }	\
-  while (0)
-#define EXTERNAL_TO_C_STRING_MALLOC(in, out, codesys)			\
-  do { * (Ibyte **) &(out) =						\
-       NEW_EXTERNAL_TO_C_STRING_MALLOC (in, codesys); } while (0)
-#define SIZED_EXTERNAL_TO_C_STRING_MALLOC(in, inlen, out, codesys)	\
-  do { * (Ibyte **) &(out) =						\
-       NEW_SIZED_EXTERNAL_TO_C_STRING_MALLOC (in, inlen, codesys); }	\
-  while (0)
-#define LISP_STRING_TO_EXTERNAL_MALLOC(in, out, codesys)		\
-  do { * (Extbyte **) &(out) =						\
-       NEW_LISP_STRING_TO_EXTERNAL_MALLOC (in, codesys); } while (0)
-#else
-#define C_STRING_TO_EXTERNAL_MALLOC(in, out, codesys) \
-  TO_EXTERNAL_FORMAT (C_STRING, in, C_STRING_MALLOC, out, codesys)
-#define SIZED_C_STRING_TO_EXTERNAL_MALLOC(in, inlen, out, codesys) \
-  TO_EXTERNAL_FORMAT (DATA, (in, inlen), C_STRING_MALLOC, out, codesys)
-#define EXTERNAL_TO_C_STRING_MALLOC(in, out, codesys) \
-  TO_INTERNAL_FORMAT (C_STRING, in, C_STRING_MALLOC, out, codesys)
-#define SIZED_EXTERNAL_TO_C_STRING_MALLOC(in, inlen, out, codesys) \
-  TO_INTERNAL_FORMAT (DATA, (in, inlen), C_STRING_MALLOC, out, codesys)
-#define LISP_STRING_TO_EXTERNAL_MALLOC(in, out, codesys) \
-  TO_EXTERNAL_FORMAT (LISP_STRING, in, C_STRING_MALLOC, out, codesys)
-#endif /* TEST_NEW_DFC */
-
-#define C_STRING_TO_SIZED_EXTERNAL_MALLOC(in, out, outlen, codesys) \
-  TO_EXTERNAL_FORMAT (C_STRING, in, MALLOC, (out, outlen), codesys)
-#define SIZED_C_STRING_TO_SIZED_EXTERNAL_MALLOC(in, inlen, out, outlen, \
-						codesys)		\
-  TO_EXTERNAL_FORMAT (DATA, (in, inlen), MALLOC, (out, outlen), codesys)
-#define EXTERNAL_TO_SIZED_C_STRING_MALLOC(in, out, outlen, codesys) \
-  TO_INTERNAL_FORMAT (C_STRING, in, MALLOC, (out, outlen), codesys)
-#define SIZED_EXTERNAL_TO_SIZED_C_STRING_MALLOC(in, inlen, out, outlen, \
-						codesys)		\
-  TO_INTERNAL_FORMAT (DATA, (in, inlen), MALLOC, (out, outlen), codesys)
-#define LISP_STRING_TO_SIZED_EXTERNAL_MALLOC(in, out, outlen, codesys) \
-  TO_EXTERNAL_FORMAT (LISP_STRING, in, MALLOC, (out, outlen), codesys)
-
 enum new_dfc_src_type
 {
   DFC_EXTERNAL,
@@ -2912,7 +2834,7 @@
 
 END_C_DECLS
 
-/* Version of EXTERNAL_TO_C_STRING that *RETURNS* the translated string,
+/* Version of EXTERNAL_TO_ITEXT that *RETURNS* the translated string,
    still in alloca() space.  Requires some trickiness to do this, but gets
    it done! */
 
@@ -2934,48 +2856,36 @@
    (#src, ALLOCA_FUNCALL_OK (new_dfc_convert_size (#src, src, src_size,	\
 						   type, codesys)))
 
-#define NEW_EXTERNAL_TO_C_STRING(src, codesys)	\
-  (Ibyte *) NEW_DFC_CONVERT_1_ALLOCA (src, -1, DFC_EXTERNAL, codesys)
-#define NEW_EXTERNAL_TO_C_STRING_MALLOC(src, codesys)	\
-  (Ibyte *) new_dfc_convert_malloc (src, -1, DFC_EXTERNAL, codesys)
-#define NEW_SIZED_EXTERNAL_TO_C_STRING(src, len, codesys)	\
-  (Ibyte *) NEW_DFC_CONVERT_1_ALLOCA (src, len, DFC_SIZED_EXTERNAL, codesys)
-#define NEW_SIZED_EXTERNAL_TO_C_STRING_MALLOC(src, len, codesys)	\
-  (Ibyte *) new_dfc_convert_malloc (src, len, DFC_SIZED_EXTERNAL, codesys)
-#define NEW_C_STRING_TO_EXTERNAL(src, codesys)	\
-  (Extbyte *) NEW_DFC_CONVERT_1_ALLOCA (src, -1, DFC_INTERNAL, codesys)
-#define NEW_C_STRING_TO_EXTERNAL_MALLOC(src, codesys)	\
-  (Extbyte *) new_dfc_convert_malloc (src, -1, DFC_INTERNAL, codesys)
-#define NEW_SIZED_C_STRING_TO_EXTERNAL(src, len, codesys)	\
-  (Extbyte *) NEW_DFC_CONVERT_1_ALLOCA (src, len, DFC_SIZED_INTERNAL, codesys)
-#define NEW_SIZED_C_STRING_TO_EXTERNAL_MALLOC(src, len, codesys)	\
-  (Extbyte *) new_dfc_convert_malloc (src, len, DFC_SIZED_INTERNAL, codesys)
-#define NEW_LISP_STRING_TO_EXTERNAL(src, codesys)			\
-  (Extbyte *) NEW_DFC_CONVERT_1_ALLOCA (LISP_TO_VOID (src), -1,		\
-					DFC_LISP_STRING, codesys)
-#define NEW_LISP_STRING_TO_EXTERNAL_MALLOC(src, codesys)	\
-  (Extbyte *) new_dfc_convert_malloc (LISP_TO_VOID (src), -1,	\
-				      DFC_LISP_STRING, codesys)
-
-/* Standins for various encodings. */
-#ifdef WEXTTEXT_IS_WIDE
-#define Qcommand_argument_encoding Qmswindows_unicode
-#define Qenvironment_variable_encoding Qmswindows_unicode
-#else
-#define Qcommand_argument_encoding Qnative
-#define Qenvironment_variable_encoding Qnative
-#endif
-#define Qunix_host_name_encoding Qnative
-#define Qunix_service_name_encoding Qnative
-#define Qtime_function_encoding Qnative
-#define Qtime_zone_encoding Qtime_function_encoding
-#define Qmswindows_host_name_encoding Qmswindows_multibyte
-#define Qmswindows_service_name_encoding Qmswindows_multibyte
-#define Quser_name_encoding Qnative
-#define Qerror_message_encoding Qnative
-#define Qjpeg_error_message_encoding Qerror_message_encoding
-#define Qtooltalk_encoding Qnative
-#define Qgtk_encoding Qnative
+#define EXTERNAL_TO_ITEXT(src, codesys)	\
+  ((Ibyte *) NEW_DFC_CONVERT_1_ALLOCA (src, -1, DFC_EXTERNAL, codesys))
+#define EXTERNAL_TO_ITEXT_MALLOC(src, codesys)	\
+  ((Ibyte *) new_dfc_convert_malloc (src, -1, DFC_EXTERNAL, codesys))
+#define SIZED_EXTERNAL_TO_ITEXT(src, len, codesys)	\
+  ((Ibyte *) NEW_DFC_CONVERT_1_ALLOCA (src, len, DFC_SIZED_EXTERNAL, codesys))
+#define SIZED_EXTERNAL_TO_ITEXT_MALLOC(src, len, codesys)	\
+  ((Ibyte *) new_dfc_convert_malloc (src, len, DFC_SIZED_EXTERNAL, codesys))
+#define ITEXT_TO_EXTERNAL(src, codesys)	\
+  ((Extbyte *) NEW_DFC_CONVERT_1_ALLOCA (src, -1, DFC_INTERNAL, codesys))
+#define ITEXT_TO_EXTERNAL_MALLOC(src, codesys)	\
+  ((Extbyte *) new_dfc_convert_malloc (src, -1, DFC_INTERNAL, codesys))
+#define LISP_STRING_TO_EXTERNAL(src, codesys)			\
+  ((Extbyte *) NEW_DFC_CONVERT_1_ALLOCA (LISP_TO_VOID (src), -1,	\
+					DFC_LISP_STRING, codesys))
+#define LISP_STRING_TO_EXTERNAL_MALLOC(src, codesys)	\
+  ((Extbyte *) new_dfc_convert_malloc (LISP_TO_VOID (src), -1,	\
+				      DFC_LISP_STRING, codesys))
+/* In place of EXTERNAL_TO_LISP_STRING(), use build_extstring() and/or
+   make_extstring(). */
+
+/* The next four have two outputs, so we make both of them be parameters */
+#define ITEXT_TO_SIZED_EXTERNAL(in, out, outlen, codesys) \
+  TO_EXTERNAL_FORMAT (C_STRING, in, ALLOCA, (out, outlen), codesys)
+#define LISP_STRING_TO_SIZED_EXTERNAL(in, out, outlen, codesys) \
+  TO_EXTERNAL_FORMAT (LISP_STRING, in, ALLOCA, (out, outlen), codesys)
+#define ITEXT_TO_SIZED_EXTERNAL_MALLOC(in, out, outlen, codesys) \
+  TO_EXTERNAL_FORMAT (C_STRING, in, MALLOC, (out, outlen), codesys)
+#define LISP_STRING_TO_SIZED_EXTERNAL_MALLOC(in, out, outlen, codesys) \
+  TO_EXTERNAL_FORMAT (LISP_STRING, in, MALLOC, (out, outlen), codesys)
 
 /* Wexttext functions.  The type of Wexttext is selected at compile time
    and will sometimes be wchar_t, sometimes char. */
@@ -3001,7 +2911,7 @@
 #define wext_atol(str) wcstol (str, 0, 10)
 #define wext_sprintf wsprintfW /* Huh?  both wsprintfA and wsprintfW? */
 #define wext_getenv _wgetenv
-#define build_wext_string(str, cs) build_ext_string ((Extbyte *) str, cs)
+#define build_wext_string(str, cs) build_extstring ((Extbyte *) str, cs)
 #define WEXTTEXT_TO_8_BIT(arg) WEXTTEXT_TO_MULTIBYTE(arg)
 #ifdef WIN32_NATIVE
 int XCDECL wext_retry_open (const Wexttext *path, int oflag, ...);
@@ -3026,14 +2936,14 @@
 #define wext_atol(str) atol (str)
 #define wext_sprintf sprintf
 #define wext_getenv getenv
-#define build_wext_string build_ext_string
+#define build_wext_string build_extstring
 #define wext_retry_open retry_open
 #define wext_access access
 #define wext_stat stat
 #define WEXTTEXT_TO_8_BIT(arg) ((Extbyte *) arg)
 #endif
 
-/* Standins for various X encodings.
+/* Standins for various encodings.
 
    About encodings in X:
 
@@ -3089,6 +2999,31 @@
    COMPOUND_TEXT otherwise.
    */
 
+#ifdef WEXTTEXT_IS_WIDE
+#define Qcommand_argument_encoding Qmswindows_unicode
+#define Qenvironment_variable_encoding Qmswindows_unicode
+#else
+#define Qcommand_argument_encoding Qnative
+#define Qenvironment_variable_encoding Qnative
+#endif
+#define Qunix_host_name_encoding Qnative
+#define Qunix_service_name_encoding Qnative
+#define Qtime_function_encoding Qnative
+#define Qtime_zone_encoding Qtime_function_encoding
+#define Qmswindows_host_name_encoding Qmswindows_multibyte
+#define Qmswindows_service_name_encoding Qmswindows_multibyte
+#define Quser_name_encoding Qnative
+#define Qerror_message_encoding Qnative
+#define Qjpeg_error_message_encoding Qerror_message_encoding
+#define Qtooltalk_encoding Qnative
+#define Qgtk_encoding Qnative
+
+#define Qdll_symbol_encoding Qnative
+#define Qdll_function_name_encoding Qdll_symbol_encoding
+#define Qdll_variable_name_encoding Qdll_symbol_encoding
+#define Qdll_filename_encoding Qfile_name
+#define Qemodule_string_encoding Qnative
+
 /* !!#### Need to verify the encoding used in lwlib -- Qnative or Qctext?
    Almost certainly the former.  Use a standin for now. */
 #define Qlwlib_encoding Qnative
@@ -3130,11 +3065,11 @@
 								\
   if (!__gserr__)						\
     {								\
-      var = alloca_ibytes (99);			\
+      var = alloca_ibytes (99);					\
       qxesprintf (var, "Unknown error %d", __gsnum__);		\
     }								\
   else								\
-    EXTERNAL_TO_C_STRING (__gserr__, var, Qstrerror_encoding);	\
+    var = EXTERNAL_TO_ITEXT (__gserr__, Qstrerror_encoding);	\
 } while (0)
 
 #endif /* INCLUDED_text_h_ */