diff src/buffer.h @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents 501cfd01ee6d
children 95016f13131a
line wrap: on
line diff
--- a/src/buffer.h	Mon Aug 13 11:19:22 2007 +0200
+++ b/src/buffer.h	Mon Aug 13 11:20:41 2007 +0200
@@ -29,8 +29,8 @@
    Ben Wing: almost completely rewritten for Mule, 19.12.
  */
 
-#ifndef INCLUDED_buffer_h_
-#define INCLUDED_buffer_h_
+#ifndef _XEMACS_BUFFER_H_
+#define _XEMACS_BUFFER_H_
 
 #ifdef MULE
 #include "mule-charset.h"
@@ -166,7 +166,7 @@
   /* The markers that refer to this buffer.  This is actually a single
      marker -- successive elements in its marker `chain' are the other
      markers referring to this buffer */
-  Lisp_Marker *markers;
+  struct Lisp_Marker *markers;
 
   /* The buffer's extent info.  This is its own type, an extent-info
      object (done this way for ease in marking / finalizing). */
@@ -198,7 +198,7 @@
   int modtime;
 
   /* the value of text->modiff at the last auto-save.  */
-  long auto_save_modified;
+  int auto_save_modified;
 
   /* The time at which we detected a failure to auto-save,
      Or -1 if we didn't have a failure.  */
@@ -219,6 +219,7 @@
 #define XBUFFER(x) XRECORD (x, buffer, struct buffer)
 #define XSETBUFFER(x, p) XSETRECORD (x, p, buffer)
 #define BUFFERP(x) RECORDP (x, buffer)
+#define GC_BUFFERP(x) GC_RECORDP (x, buffer)
 #define CHECK_BUFFER(x) CHECK_RECORD (x, buffer)
 #define CONCHECK_BUFFER(x) CONCHECK_RECORD (x, buffer)
 
@@ -408,9 +409,6 @@
 #define REAL_INC_CHARPTR(ptr) \
   ((void) ((ptr) += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr))))
 
-#define REAL_INC_CHARBYTIND(ptr,pos) \
-  (pos += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr)))
-
 #define REAL_DEC_CHARPTR(ptr) do {	\
   (ptr)--;				\
 } while (!VALID_CHARPTR_P (ptr))
@@ -421,14 +419,9 @@
   REAL_INC_CHARPTR (ptr);		\
 } while (0)
 
-#define INC_CHARBYTIND(ptr,pos) do {		\
-  ASSERT_VALID_CHARPTR (ptr);		\
-  REAL_INC_CHARBYTIND (ptr,pos);		\
-} while (0)
-
 #define DEC_CHARPTR(ptr) do {			\
-  const Bufbyte *dc_ptr1 = (ptr);		\
-  const Bufbyte *dc_ptr2 = dc_ptr1;		\
+  CONST Bufbyte *dc_ptr1 = (ptr);		\
+  CONST Bufbyte *dc_ptr2 = dc_ptr1;		\
   REAL_DEC_CHARPTR (dc_ptr2);			\
   assert (dc_ptr1 - dc_ptr2 ==			\
 	  REP_BYTES_BY_FIRST_BYTE (*dc_ptr2));	\
@@ -436,7 +429,6 @@
 } while (0)
 
 #else /* ! ERROR_CHECK_BUFPOS */
-#define INC_CHARBYTIND(ptr,pos) REAL_INC_CHARBYTIND (ptr,pos)
 #define INC_CHARPTR(ptr) REAL_INC_CHARPTR (ptr)
 #define DEC_CHARPTR(ptr) REAL_DEC_CHARPTR (ptr)
 #endif /* ! ERROR_CHECK_BUFPOS */
@@ -470,10 +462,9 @@
 /*     section of internally-formatted text 			  */
 /* -------------------------------------------------------------- */
 
-INLINE_HEADER const Bufbyte *
-charptr_n_addr (const Bufbyte *ptr, Charcount offset);
-INLINE_HEADER const Bufbyte *
-charptr_n_addr (const Bufbyte *ptr, Charcount offset)
+INLINE CONST Bufbyte *charptr_n_addr (CONST Bufbyte *ptr, Charcount offset);
+INLINE CONST Bufbyte *
+charptr_n_addr (CONST Bufbyte *ptr, Charcount offset)
 {
   return ptr + charcount_to_bytecount (ptr, offset);
 }
@@ -488,21 +479,21 @@
 
 #ifdef MULE
 
-Emchar non_ascii_charptr_emchar (const Bufbyte *ptr);
+Emchar non_ascii_charptr_emchar (CONST Bufbyte *ptr);
 Bytecount non_ascii_set_charptr_emchar (Bufbyte *ptr, Emchar c);
-Bytecount non_ascii_charptr_copy_char (const Bufbyte *ptr, Bufbyte *ptr2);
+Bytecount non_ascii_charptr_copy_char (CONST Bufbyte *ptr, Bufbyte *ptr2);
 
-INLINE_HEADER Emchar charptr_emchar (const Bufbyte *ptr);
-INLINE_HEADER Emchar
-charptr_emchar (const Bufbyte *ptr)
+INLINE Emchar charptr_emchar (CONST Bufbyte *ptr);
+INLINE Emchar
+charptr_emchar (CONST Bufbyte *ptr)
 {
   return BYTE_ASCII_P (*ptr) ?
     simple_charptr_emchar (ptr) :
     non_ascii_charptr_emchar (ptr);
 }
 
-INLINE_HEADER Bytecount set_charptr_emchar (Bufbyte *ptr, Emchar x);
-INLINE_HEADER Bytecount
+INLINE Bytecount set_charptr_emchar (Bufbyte *ptr, Emchar x);
+INLINE Bytecount
 set_charptr_emchar (Bufbyte *ptr, Emchar x)
 {
   return !CHAR_MULTIBYTE_P (x) ?
@@ -510,10 +501,9 @@
     non_ascii_set_charptr_emchar (ptr, x);
 }
 
-INLINE_HEADER Bytecount
-charptr_copy_char (const Bufbyte *ptr, Bufbyte *ptr2);
-INLINE_HEADER Bytecount
-charptr_copy_char (const Bufbyte *ptr, Bufbyte *ptr2)
+INLINE Bytecount charptr_copy_char (CONST Bufbyte *ptr, Bufbyte *ptr2);
+INLINE Bytecount
+charptr_copy_char (CONST Bufbyte *ptr, Bufbyte *ptr2)
 {
   return BYTE_ASCII_P (*ptr) ?
     simple_charptr_copy_char (ptr, ptr2) :
@@ -540,8 +530,8 @@
 
 int non_ascii_valid_char_p (Emchar ch);
 
-INLINE_HEADER int valid_char_p (Emchar ch);
-INLINE_HEADER int
+INLINE int valid_char_p (Emchar ch);
+INLINE int
 valid_char_p (Emchar ch)
 {
   return ((unsigned int) (ch) <= 0xff) || non_ascii_valid_char_p (ch);
@@ -559,8 +549,8 @@
 
 #ifdef ERROR_CHECK_TYPECHECK
 
-INLINE_HEADER Emchar XCHAR_OR_CHAR_INT (Lisp_Object obj);
-INLINE_HEADER Emchar
+INLINE Emchar XCHAR_OR_CHAR_INT (Lisp_Object obj);
+INLINE Emchar
 XCHAR_OR_CHAR_INT (Lisp_Object obj)
 {
   assert (CHAR_OR_CHAR_INTP (obj));
@@ -569,7 +559,7 @@
 
 #else
 
-#define XCHAR_OR_CHAR_INT(obj) (CHARP (obj) ? XCHAR (obj) : XINT (obj))
+#define XCHAR_OR_CHAR_INT(obj) (CHARP ((obj)) ? XCHAR ((obj)) : XINT ((obj)))
 
 #endif
 
@@ -624,25 +614,25 @@
 /*----------------------------------------------------------------------*/
 
 /* Convert the address of a byte in the buffer into a position.  */
-INLINE_HEADER Bytind BI_BUF_PTR_BYTE_POS (struct buffer *buf, Bufbyte *ptr);
-INLINE_HEADER Bytind
+INLINE Bytind BI_BUF_PTR_BYTE_POS (struct buffer *buf, Bufbyte *ptr);
+INLINE Bytind
 BI_BUF_PTR_BYTE_POS (struct buffer *buf, Bufbyte *ptr)
 {
-  return (ptr - buf->text->beg + 1
-	  - ((ptr - buf->text->beg + 1) > buf->text->gpt
-	     ? buf->text->gap_size : 0));
+  return ((ptr) - (buf)->text->beg + 1
+	  - ((ptr - (buf)->text->beg + 1) > (buf)->text->gpt
+	     ? (buf)->text->gap_size : 0));
 }
 
 #define BUF_PTR_BYTE_POS(buf, ptr) \
   bytind_to_bufpos (buf, BI_BUF_PTR_BYTE_POS (buf, ptr))
 
 /* Address of byte at position POS in buffer. */
-INLINE_HEADER Bufbyte * BI_BUF_BYTE_ADDRESS (struct buffer *buf, Bytind pos);
-INLINE_HEADER Bufbyte *
+INLINE Bufbyte * BI_BUF_BYTE_ADDRESS (struct buffer *buf, Bytind pos);
+INLINE Bufbyte *
 BI_BUF_BYTE_ADDRESS (struct buffer *buf, Bytind pos)
 {
-  return (buf->text->beg +
-	  ((pos >= buf->text->gpt ? (pos + buf->text->gap_size) : pos)
+  return ((buf)->text->beg +
+	  ((pos >= (buf)->text->gpt ? (pos + (buf)->text->gap_size) : pos)
 	   - 1));
 }
 
@@ -650,12 +640,12 @@
   BI_BUF_BYTE_ADDRESS (buf, bufpos_to_bytind (buf, pos))
 
 /* Address of byte before position POS in buffer. */
-INLINE_HEADER Bufbyte * BI_BUF_BYTE_ADDRESS_BEFORE (struct buffer *buf, Bytind pos);
-INLINE_HEADER Bufbyte *
+INLINE Bufbyte * BI_BUF_BYTE_ADDRESS_BEFORE (struct buffer *buf, Bytind pos);
+INLINE Bufbyte *
 BI_BUF_BYTE_ADDRESS_BEFORE (struct buffer *buf, Bytind pos)
 {
-  return (buf->text->beg +
-	  ((pos > buf->text->gpt ? (pos + buf->text->gap_size) : pos)
+  return ((buf)->text->beg +
+	  ((pos > (buf)->text->gpt ? (pos + (buf)->text->gap_size) : pos)
 	   - 2));
 }
 
@@ -666,32 +656,32 @@
 /*	    Converting between byte indices and memory indices		*/
 /*----------------------------------------------------------------------*/
 
-INLINE_HEADER int valid_memind_p (struct buffer *buf, Memind x);
-INLINE_HEADER int
+INLINE int valid_memind_p (struct buffer *buf, Memind x);
+INLINE int
 valid_memind_p (struct buffer *buf, Memind x)
 {
-  return ((x >= 1 && x <= (Memind) buf->text->gpt) ||
-	  (x  > (Memind) (buf->text->gpt + buf->text->gap_size) &&
-	   x <= (Memind) (buf->text->z   + buf->text->gap_size)));
+  return ((x >= 1 && x <= (Memind) (buf)->text->gpt) ||
+	  (x  > (Memind) ((buf)->text->gpt + (buf)->text->gap_size) &&
+	   x <= (Memind) ((buf)->text->z   + (buf)->text->gap_size)));
 }
 
-INLINE_HEADER Memind bytind_to_memind (struct buffer *buf, Bytind x);
-INLINE_HEADER Memind
+INLINE Memind bytind_to_memind (struct buffer *buf, Bytind x);
+INLINE Memind
 bytind_to_memind (struct buffer *buf, Bytind x)
 {
-  return (Memind) ((x > buf->text->gpt) ? (x + buf->text->gap_size) : x);
+  return (Memind) ((x > (buf)->text->gpt) ? (x + (buf)->text->gap_size) : x);
 }
 
 
-INLINE_HEADER Bytind memind_to_bytind (struct buffer *buf, Memind x);
-INLINE_HEADER Bytind
+INLINE Bytind memind_to_bytind (struct buffer *buf, Memind x);
+INLINE Bytind
 memind_to_bytind (struct buffer *buf, Memind x)
 {
 #ifdef ERROR_CHECK_BUFPOS
   assert (valid_memind_p (buf, x));
 #endif
-  return (Bytind) ((x > (Memind) buf->text->gpt) ?
-		   x - buf->text->gap_size :
+  return (Bytind) ((x > (Memind) (buf)->text->gpt) ?
+		   x - (buf)->text->gap_size :
 		   x);
 }
 
@@ -904,16 +894,16 @@
   VALIDATE_BYTIND_BACKWARD (buf, x);			\
 } while (0)
 
-INLINE_HEADER Bytind prev_bytind (struct buffer *buf, Bytind x);
-INLINE_HEADER Bytind
+INLINE Bytind prev_bytind (struct buffer *buf, Bytind x);
+INLINE Bytind
 prev_bytind (struct buffer *buf, Bytind x)
 {
   DEC_BYTIND (buf, x);
   return x;
 }
 
-INLINE_HEADER Bytind next_bytind (struct buffer *buf, Bytind x);
-INLINE_HEADER Bytind
+INLINE Bytind next_bytind (struct buffer *buf, Bytind x);
+INLINE Bytind
 next_bytind (struct buffer *buf, Bytind x)
 {
   INC_BYTIND (buf, x);
@@ -975,8 +965,8 @@
 
 extern short three_to_one_table[];
 
-INLINE_HEADER int real_bufpos_to_bytind (struct buffer *buf, Bufpos x);
-INLINE_HEADER int
+INLINE int real_bufpos_to_bytind (struct buffer *buf, Bufpos x);
+INLINE int
 real_bufpos_to_bytind (struct buffer *buf, Bufpos x)
 {
   if (x >= buf->text->mule_bufmin && x <= buf->text->mule_bufmax)
@@ -987,8 +977,8 @@
     return bufpos_to_bytind_func (buf, x);
 }
 
-INLINE_HEADER int real_bytind_to_bufpos (struct buffer *buf, Bytind x);
-INLINE_HEADER int
+INLINE int real_bytind_to_bufpos (struct buffer *buf, Bytind x);
+INLINE int
 real_bytind_to_bufpos (struct buffer *buf, Bytind x)
 {
   if (x >= buf->text->mule_bytmin && x <= buf->text->mule_bytmax)
@@ -1040,277 +1030,305 @@
 #define BUF_CHARPTR_COPY_CHAR(buf, pos, str) \
   BI_BUF_CHARPTR_COPY_CHAR (buf, bufpos_to_bytind (buf, pos), str)
 
+
+
 
 /************************************************************************/
-/*                                                                      */
-/*         Converting between internal and external format              */
-/*                                                                      */
+/*									*/
+/*		    working with externally-formatted data		*/
+/*									*/
 /************************************************************************/
-/*
-  All client code should use only the two macros
-
-  TO_EXTERNAL_FORMAT (source_type, source, sink_type, sink, coding_system)
-  TO_INTERNAL_FORMAT (source_type, source, sink_type, sink, coding_system)
-
-  Typical use is
-
-  TO_EXTERNAL_FORMAT (DATA, (ptr, len),
-                      LISP_BUFFER, buffer,
-		      Qfile_name);
-
-  The source or sink can be specified in one of these ways:
-
-  DATA,   (ptr, len),    // input data is a fixed buffer of size len
-  ALLOCA, (ptr, len),    // output data is in a alloca()ed buffer of size len
-  MALLOC, (ptr, len),    // output data is in a malloc()ed buffer of size len
-  C_STRING_ALLOCA, ptr,  // equivalent to ALLOCA (ptr, len_ignored) on output.
-  C_STRING_MALLOC, ptr,  // equivalent to MALLOC (ptr, len_ignored) on output.
-  C_STRING,     ptr,     // equivalent to DATA, (ptr, strlen (ptr) + 1) on input
-  LISP_STRING,  string,  // input or output is a Lisp_Object of type string
-  LISP_BUFFER,  buffer,  // output is written to (point) in lisp buffer
-  LISP_LSTREAM, lstream, // input or output is a Lisp_Object of type lstream
-  LISP_OPAQUE,  object,  // input or output is a Lisp_Object of type opaque
-
-  When specifying the sink, use lvalues, since the macro will assign to them,
-  except when the sink is an lstream or a lisp buffer.
-
-  The macros accept the kinds of sources and sinks appropriate for
-  internal and external data representation.  See the type_checking_assert
-  macros below for the actual allowed types.
-
-  Since some sources and sinks use one argument (a Lisp_Object) to
-  specify them, while others take a (pointer, length) pair, we use
-  some C preprocessor trickery to allow pair arguments to be specified
-  by parenthesizing them, as in the examples above.
-
-  Anything prefixed by dfc_ (`data format conversion') is private.
-  They are only used to implement these macros.
-
-  Using C_STRING* is appropriate for using with external APIs that take
-  null-terminated strings.  For internal data, we should try to be
-  '\0'-clean - i.e. allow arbitrary data to contain embedded '\0'.
-
-  Sometime in the future we might allow output to C_STRING_ALLOCA or
-  C_STRING_MALLOC _only_ with TO_EXTERNAL_FORMAT(), not
-  TO_INTERNAL_FORMAT().  */
 
-#define TO_EXTERNAL_FORMAT(source_type, source, sink_type, sink, coding_system)	\
-do {										\
-  dfc_conversion_type dfc_simplified_source_type;				\
-  dfc_conversion_type dfc_simplified_sink_type;					\
-  dfc_conversion_data dfc_source;						\
-  dfc_conversion_data dfc_sink;							\
-										\
-  type_checking_assert								\
-    ((DFC_TYPE_##source_type == DFC_TYPE_DATA ||				\
-      DFC_TYPE_##source_type == DFC_TYPE_C_STRING ||				\
-      DFC_TYPE_##source_type == DFC_TYPE_LISP_STRING ||				\
-      DFC_TYPE_##source_type == DFC_TYPE_LISP_OPAQUE ||				\
-      DFC_TYPE_##source_type == DFC_TYPE_LISP_LSTREAM)				\
-    &&										\
-     (DFC_TYPE_##sink_type == DFC_TYPE_ALLOCA ||				\
-      DFC_TYPE_##sink_type == DFC_TYPE_MALLOC ||				\
-      DFC_TYPE_##sink_type == DFC_TYPE_C_STRING_ALLOCA ||			\
-      DFC_TYPE_##sink_type == DFC_TYPE_C_STRING_MALLOC ||			\
-      DFC_TYPE_##sink_type == DFC_TYPE_LISP_LSTREAM ||				\
-      DFC_TYPE_##sink_type == DFC_TYPE_LISP_OPAQUE));				\
-										\
-  DFC_SOURCE_##source_type##_TO_ARGS (source);					\
-  DFC_SINK_##sink_type##_TO_ARGS     (sink);					\
-										\
-  DFC_CONVERT_TO_EXTERNAL_FORMAT (dfc_simplified_source_type, &dfc_source,	\
-				  coding_system,				\
-				  dfc_simplified_sink_type,   &dfc_sink);	\
-										\
-  DFC_##sink_type##_USE_CONVERTED_DATA (sink);					\
-} while (0)
-
-#define TO_INTERNAL_FORMAT(source_type, source, sink_type, sink, coding_system)	\
-do {										\
-  dfc_conversion_type dfc_simplified_source_type;				\
-  dfc_conversion_type dfc_simplified_sink_type;					\
-  dfc_conversion_data dfc_source;						\
-  dfc_conversion_data dfc_sink;							\
-										\
-  type_checking_assert								\
-    ((DFC_TYPE_##source_type == DFC_TYPE_DATA ||				\
-      DFC_TYPE_##source_type == DFC_TYPE_C_STRING ||				\
-      DFC_TYPE_##source_type == DFC_TYPE_LISP_OPAQUE ||				\
-      DFC_TYPE_##source_type == DFC_TYPE_LISP_LSTREAM)				\
-     &&										\
-     (DFC_TYPE_##sink_type == DFC_TYPE_ALLOCA ||				\
-      DFC_TYPE_##sink_type == DFC_TYPE_MALLOC ||				\
-      DFC_TYPE_##sink_type == DFC_TYPE_C_STRING_ALLOCA ||			\
-      DFC_TYPE_##sink_type == DFC_TYPE_C_STRING_MALLOC ||			\
-      DFC_TYPE_##sink_type == DFC_TYPE_LISP_STRING ||				\
-      DFC_TYPE_##sink_type == DFC_TYPE_LISP_LSTREAM ||				\
-      DFC_TYPE_##sink_type == DFC_TYPE_LISP_BUFFER));				\
-										\
-  DFC_SOURCE_##source_type##_TO_ARGS (source);					\
-  DFC_SINK_##sink_type##_TO_ARGS     (sink);					\
-										\
-  DFC_CONVERT_TO_INTERNAL_FORMAT (dfc_simplified_source_type, &dfc_source,	\
-				  coding_system,				\
-				  dfc_simplified_sink_type,   &dfc_sink);	\
-										\
-  DFC_##sink_type##_USE_CONVERTED_DATA (sink);					\
-} while (0)
+/* Sometimes strings need to be converted into one or another
+   external format, for passing to a library function. (Note
+   that we encapsulate and automatically convert the arguments
+   of some functions, but not others.) At times this conversion
+   also has to go the other way -- i.e. when we get external-
+   format strings back from a library function.
+*/
 
 #ifdef FILE_CODING
-#define DFC_CONVERT_TO_EXTERNAL_FORMAT dfc_convert_to_external_format
-#define DFC_CONVERT_TO_INTERNAL_FORMAT dfc_convert_to_internal_format
-#else
-/* ignore coding_system argument */
-#define DFC_CONVERT_TO_EXTERNAL_FORMAT(a, b, coding_system, c, d) \
- dfc_convert_to_external_format (a, b, c, d)
-#define DFC_CONVERT_TO_INTERNAL_FORMAT(a, b, coding_system, c, d) \
- dfc_convert_to_internal_format (a, b, c, d)
-#endif
-
-typedef union
-{
-  struct { const void *ptr; size_t len; } data;
-  Lisp_Object lisp_object;
-} dfc_conversion_data;
-
-enum dfc_conversion_type
-{
-  DFC_TYPE_DATA,
-  DFC_TYPE_ALLOCA,
-  DFC_TYPE_MALLOC,
-  DFC_TYPE_C_STRING,
-  DFC_TYPE_C_STRING_ALLOCA,
-  DFC_TYPE_C_STRING_MALLOC,
-  DFC_TYPE_LISP_STRING,
-  DFC_TYPE_LISP_LSTREAM,
-  DFC_TYPE_LISP_OPAQUE,
-  DFC_TYPE_LISP_BUFFER
-};
-typedef enum dfc_conversion_type dfc_conversion_type;
 
 /* WARNING: These use a static buffer.  This can lead to disaster if
-   these functions are not used *very* carefully.  Another reason to only use
-   TO_EXTERNAL_FORMATf() and TO_INTERNAL_FORMAT(). */
-void
-dfc_convert_to_external_format (dfc_conversion_type source_type,
-				dfc_conversion_data *source,
-#ifdef FILE_CODING
-				Lisp_Object coding_system,
-#endif
-				dfc_conversion_type sink_type,
-				dfc_conversion_data *sink);
-void
-dfc_convert_to_internal_format (dfc_conversion_type source_type,
-				dfc_conversion_data *source,
-#ifdef FILE_CODING
-				Lisp_Object coding_system,
-#endif
-				dfc_conversion_type sink_type,
-				dfc_conversion_data *sink);
-/* CPP Trickery */
-#define DFC_CPP_CAR(x,y) (x)
-#define DFC_CPP_CDR(x,y) (y)
+   these functions are not used *very* carefully.  Under normal
+   circumstances, do not call these functions; call the front ends
+   below. */
+
+Extbyte *convert_to_external_format (CONST Bufbyte *ptr,
+				     Bytecount len,
+				     Extcount *len_out,
+				     enum external_data_format fmt);
+Bufbyte *convert_from_external_format (CONST Extbyte *ptr,
+				       Extcount len,
+				       Bytecount *len_out,
+				       enum external_data_format fmt);
+
+#else /* ! MULE */
+
+#define convert_to_external_format(ptr, len, len_out, fmt) \
+     (*(len_out) = (int) (len), (Extbyte *) (ptr))
+#define convert_from_external_format(ptr, len, len_out, fmt) \
+     (*(len_out) = (Bytecount) (len), (Bufbyte *) (ptr))
+
+#endif /* ! MULE */
+
+/* In all of the following macros we use the following general principles:
+
+   -- Functions that work with charptr's accept two sorts of charptr's:
+
+      a) Pointers to memory with a length specified.  The pointer will be
+         fundamentally of type `unsigned char *' (although labelled
+	 as `Bufbyte *' for internal-format data and `Extbyte *' for
+	 external-format data) and the length will be fundamentally of
+	 type `int' (although labelled as `Bytecount' for internal-format
+	 data and `Extcount' for external-format data).  The length is
+	 always a count in bytes.
+      b) Zero-terminated pointers; no length specified.  The pointer
+         is of type `char *', whether the data pointed to is internal-format
+	 or external-format.  These sorts of pointers are available for
+	 convenience in working with C library functions and literal
+	 strings.  In general you should use these sorts of pointers only
+	 to interface to library routines and not for general manipulation,
+	 as you are liable to lose embedded nulls and such.  This could
+	 be a big problem for routines that want Unicode-formatted data,
+	 which is likely to have lots of embedded nulls in it.
+	 (In the real world, though, external Unicode data will be UTF-8,
+	 which will not have embedded nulls and is ASCII-compatible - martin)
+
+   -- Functions that work with Lisp strings accept strings as Lisp Objects
+      (as opposed to the `struct Lisp_String *' for some of the other
+      string accessors).  This is for convenience in working with the
+      functions, as otherwise you will almost always have to call
+      XSTRING() on the object.
+
+   -- Functions that work with charptr's are not guaranteed to copy
+      their data into alloca()ed space.  Functions that work with
+      Lisp strings are, however.  The reason is that Lisp strings can
+      be relocated any time a GC happens, and it could happen at some
+      rather unexpected times.  The internal-external conversion is
+      rarely done in time-critical functions, and so the slight
+      extra time required for alloca() and copy is well-worth the
+      safety of knowing your string data won't be relocated out from
+      under you.
+      */
+
 
-/* Convert `source' to args for dfc_convert_to_*_format() */
-#define DFC_SOURCE_DATA_TO_ARGS(val) do {		\
-  dfc_source.data.ptr = DFC_CPP_CAR val;		\
-  dfc_source.data.len = DFC_CPP_CDR val;		\
-  dfc_simplified_source_type = DFC_TYPE_DATA;		\
-} while (0)
-#define DFC_SOURCE_C_STRING_TO_ARGS(val) do {		\
-  dfc_source.data.len =					\
-    strlen ((char *) (dfc_source.data.ptr = (val)));	\
-  dfc_simplified_source_type = DFC_TYPE_DATA;		\
+/* Maybe convert charptr's data into ext-format and store the result in
+   alloca()'ed space.
+
+   You may wonder why this is written in this fashion and not as a
+   function call.  With a little trickery it could certainly be
+   written this way, but it won't work because of those DAMN GCC WANKERS
+   who couldn't be bothered to handle alloca() properly on the x86
+   architecture. (If you put a call to alloca() in the argument to
+   a function call, the stack space gets allocated right in the
+   middle of the arguments to the function call and you are unbelievably
+   hosed.) */
+
+#ifdef MULE
+
+#define GET_CHARPTR_EXT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do	\
+{									\
+  Bytecount gceda_len_in = (Bytecount) (len);				\
+  Extcount  gceda_len_out;						\
+  CONST Bufbyte *gceda_ptr_in = (ptr);					\
+  Extbyte *gceda_ptr_out =						\
+    convert_to_external_format (gceda_ptr_in, gceda_len_in,		\
+				&gceda_len_out, fmt);			\
+  /* If the new string is identical to the old (will be the case most	\
+     of the time), just return the same string back.  This saves	\
+     on alloca()ing, which can be useful on C alloca() machines and	\
+     on stack-space-challenged environments. */				\
+									\
+  if (gceda_len_in == gceda_len_out &&					\
+      !memcmp (gceda_ptr_in, gceda_ptr_out, gceda_len_out))		\
+    {									\
+      (ptr_out) = (Extbyte *) gceda_ptr_in;				\
+    }									\
+  else									\
+    {									\
+      (ptr_out) = (Extbyte *) alloca (1 + gceda_len_out);		\
+      memcpy ((void *) ptr_out, gceda_ptr_out, 1 + gceda_len_out);	\
+    }									\
+  (len_out) = gceda_len_out;						\
 } while (0)
-#define DFC_SOURCE_LISP_STRING_TO_ARGS(val) do {	\
-  Lisp_Object dfc_slsta = (val);			\
-  type_checking_assert (STRINGP (dfc_slsta));		\
-  dfc_source.lisp_object = dfc_slsta;			\
-  dfc_simplified_source_type = DFC_TYPE_LISP_STRING;	\
+
+#else /* ! MULE */
+
+#define GET_CHARPTR_EXT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do	\
+{					\
+  (ptr_out) = (Extbyte *) (ptr);	\
+  (len_out) = (Extcount) (len);		\
 } while (0)
-#define DFC_SOURCE_LISP_LSTREAM_TO_ARGS(val) do {	\
-  Lisp_Object dfc_sllta = (val);			\
-  type_checking_assert (LSTREAMP (dfc_sllta));		\
-  dfc_source.lisp_object = dfc_sllta;			\
-  dfc_simplified_source_type = DFC_TYPE_LISP_LSTREAM;	\
-} while (0)
-#define DFC_SOURCE_LISP_OPAQUE_TO_ARGS(val) do {	\
-  Lisp_Opaque *dfc_slota = XOPAQUE (val);		\
-  dfc_source.data.ptr = OPAQUE_DATA (dfc_slota);	\
-  dfc_source.data.len = OPAQUE_SIZE (dfc_slota);	\
-  dfc_simplified_source_type = DFC_TYPE_DATA;		\
+
+#endif /* ! MULE */
+
+#define GET_C_CHARPTR_EXT_DATA_ALLOCA(ptr, fmt, ptr_out) do	\
+{								\
+  Extcount gcceda_ignored_len;					\
+  CONST Bufbyte *gcceda_ptr_in = (CONST Bufbyte *) (ptr);	\
+  Extbyte *gcceda_ptr_out;					\
+								\
+  GET_CHARPTR_EXT_DATA_ALLOCA (gcceda_ptr_in,			\
+			       strlen ((char *) gcceda_ptr_in),	\
+			       fmt,				\
+			       gcceda_ptr_out,			\
+			       gcceda_ignored_len);		\
+  (ptr_out) = (char *) gcceda_ptr_out;				\
 } while (0)
 
-/* Convert `sink' to args for dfc_convert_to_*_format() */
-#define DFC_SINK_ALLOCA_TO_ARGS(val)		\
-  dfc_simplified_sink_type = DFC_TYPE_DATA
-#define DFC_SINK_C_STRING_ALLOCA_TO_ARGS(val)	\
-  dfc_simplified_sink_type = DFC_TYPE_DATA
-#define DFC_SINK_MALLOC_TO_ARGS(val)		\
-  dfc_simplified_sink_type = DFC_TYPE_DATA
-#define DFC_SINK_C_STRING_MALLOC_TO_ARGS(val)	\
-  dfc_simplified_sink_type = DFC_TYPE_DATA
-#define DFC_SINK_LISP_STRING_TO_ARGS(val)	\
-  dfc_simplified_sink_type = DFC_TYPE_DATA
-#define DFC_SINK_LISP_OPAQUE_TO_ARGS(val)	\
-  dfc_simplified_sink_type = DFC_TYPE_DATA
-#define DFC_SINK_LISP_LSTREAM_TO_ARGS(val) do {		\
-  Lisp_Object dfc_sllta = (val);			\
-  type_checking_assert (LSTREAMP (dfc_sllta));		\
-  dfc_sink.lisp_object = dfc_sllta;			\
-  dfc_simplified_sink_type = DFC_TYPE_LISP_LSTREAM;	\
+#define GET_C_CHARPTR_EXT_BINARY_DATA_ALLOCA(ptr, ptr_out) \
+  GET_C_CHARPTR_EXT_DATA_ALLOCA (ptr, FORMAT_BINARY, ptr_out)
+#define GET_CHARPTR_EXT_BINARY_DATA_ALLOCA(ptr, len, ptr_out, len_out) \
+  GET_CHARPTR_EXT_DATA_ALLOCA (ptr, len, FORMAT_BINARY, ptr_out, len_out)
+
+#define GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA(ptr, ptr_out) \
+  GET_C_CHARPTR_EXT_DATA_ALLOCA (ptr, FORMAT_FILENAME, ptr_out)
+#define GET_CHARPTR_EXT_FILENAME_DATA_ALLOCA(ptr, len, ptr_out, len_out) \
+  GET_CHARPTR_EXT_DATA_ALLOCA (ptr, len, FORMAT_FILENAME, ptr_out, len_out)
+
+#define GET_C_CHARPTR_EXT_CTEXT_DATA_ALLOCA(ptr, ptr_out) \
+  GET_C_CHARPTR_EXT_DATA_ALLOCA (ptr, FORMAT_CTEXT, ptr_out)
+#define GET_CHARPTR_EXT_CTEXT_DATA_ALLOCA(ptr, len, ptr_out, len_out) \
+  GET_CHARPTR_EXT_DATA_ALLOCA (ptr, len, FORMAT_CTEXT, ptr_out, len_out)
+
+/* Maybe convert external charptr's data into internal format and store
+   the result in alloca()'ed space.
+
+   You may wonder why this is written in this fashion and not as a
+   function call.  With a little trickery it could certainly be
+   written this way, but it won't work because of those DAMN GCC WANKERS
+   who couldn't be bothered to handle alloca() properly on the x86
+   architecture. (If you put a call to alloca() in the argument to
+   a function call, the stack space gets allocated right in the
+   middle of the arguments to the function call and you are unbelievably
+   hosed.) */
+
+#ifdef MULE
+
+#define GET_CHARPTR_INT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do	\
+{									\
+  Extcount gcida_len_in = (Extcount) (len);				\
+  Bytecount gcida_len_out;						\
+  CONST Extbyte *gcida_ptr_in = (ptr);					\
+  Bufbyte *gcida_ptr_out =						\
+    convert_from_external_format (gcida_ptr_in, gcida_len_in,		\
+				  &gcida_len_out, fmt);			\
+  /* If the new string is identical to the old (will be the case most	\
+     of the time), just return the same string back.  This saves	\
+     on alloca()ing, which can be useful on C alloca() machines and	\
+     on stack-space-challenged environments. */				\
+									\
+  if (gcida_len_in == gcida_len_out &&					\
+      !memcmp (gcida_ptr_in, gcida_ptr_out, gcida_len_out))		\
+    {									\
+      (ptr_out) = (Bufbyte *) gcida_ptr_in;				\
+    }									\
+  else									\
+    {									\
+      (ptr_out) = (Extbyte *) alloca (1 + gcida_len_out);		\
+      memcpy ((void *) ptr_out, gcida_ptr_out, 1 + gcida_len_out);	\
+    }									\
+  (len_out) = gcida_len_out;						\
 } while (0)
-#define DFC_SINK_LISP_BUFFER_TO_ARGS(val) do {		\
-  struct buffer *dfc_slbta = XBUFFER (val);		\
-  dfc_sink.lisp_object =				\
-    make_lisp_buffer_output_stream			\
-    (dfc_slbta, BUF_PT (dfc_slbta), 0);			\
-  dfc_simplified_sink_type = DFC_TYPE_LISP_LSTREAM;	\
+
+#else /* ! MULE */
+
+#define GET_CHARPTR_INT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do \
+{					\
+  (ptr_out) = (Bufbyte *) (ptr);	\
+  (len_out) = (Bytecount) (len);	\
 } while (0)
 
-/* Assign to the `sink' lvalue(s) using the converted data. */
-typedef union { char c; void *p; } *dfc_aliasing_voidpp;
-#define DFC_ALLOCA_USE_CONVERTED_DATA(sink) do {			\
-  void * dfc_sink_ret = alloca (dfc_sink.data.len + 1);			\
-  memcpy (dfc_sink_ret, dfc_sink.data.ptr, dfc_sink.data.len + 1);	\
-  ((dfc_aliasing_voidpp) &(DFC_CPP_CAR sink))->p = dfc_sink_ret;	\
-  (DFC_CPP_CDR sink) = dfc_sink.data.len;				\
-} while (0)
-#define DFC_MALLOC_USE_CONVERTED_DATA(sink) do {			\
-  void * dfc_sink_ret = xmalloc (dfc_sink.data.len + 1);		\
-  memcpy (dfc_sink_ret, dfc_sink.data.ptr, dfc_sink.data.len + 1);	\
-  ((dfc_aliasing_voidpp) &(DFC_CPP_CAR sink))->p = dfc_sink_ret;	\
-  (DFC_CPP_CDR sink) = dfc_sink.data.len;				\
-} while (0)
-#define DFC_C_STRING_ALLOCA_USE_CONVERTED_DATA(sink) do {		\
-  void * dfc_sink_ret = alloca (dfc_sink.data.len + 1);			\
-  memcpy (dfc_sink_ret, dfc_sink.data.ptr, dfc_sink.data.len + 1);	\
-  (sink) = (char *) dfc_sink_ret;					\
+#endif /* ! MULE */
+
+#define GET_C_CHARPTR_INT_DATA_ALLOCA(ptr, fmt, ptr_out) do	\
+{								\
+  Bytecount gccida_ignored_len;					\
+  CONST Extbyte *gccida_ptr_in = (CONST Extbyte *) (ptr);	\
+  Bufbyte *gccida_ptr_out;					\
+								\
+  GET_CHARPTR_INT_DATA_ALLOCA (gccida_ptr_in,			\
+			       strlen ((char *) gccida_ptr_in),	\
+			       fmt,				\
+			       gccida_ptr_out,			\
+			       gccida_ignored_len);		\
+  (ptr_out) = gccida_ptr_out;					\
 } while (0)
-#define DFC_C_STRING_MALLOC_USE_CONVERTED_DATA(sink) do {		\
-  void * dfc_sink_ret = xmalloc (dfc_sink.data.len + 1);		\
-  memcpy (dfc_sink_ret, dfc_sink.data.ptr, dfc_sink.data.len + 1);	\
-  (sink) = (char *) dfc_sink_ret;					\
+
+#define GET_C_CHARPTR_INT_BINARY_DATA_ALLOCA(ptr, ptr_out)	\
+  GET_C_CHARPTR_INT_DATA_ALLOCA (ptr, FORMAT_BINARY, ptr_out)
+#define GET_CHARPTR_INT_BINARY_DATA_ALLOCA(ptr, len, ptr_out, len_out) \
+  GET_CHARPTR_INT_DATA_ALLOCA (ptr, len, FORMAT_BINARY, ptr_out, len_out)
+
+#define GET_C_CHARPTR_INT_FILENAME_DATA_ALLOCA(ptr, ptr_out)	\
+  GET_C_CHARPTR_INT_DATA_ALLOCA (ptr, FORMAT_FILENAME, ptr_out)
+#define GET_CHARPTR_INT_FILENAME_DATA_ALLOCA(ptr, len, ptr_out, len_out) \
+  GET_CHARPTR_INT_DATA_ALLOCA (ptr, len, FORMAT_FILENAME, ptr_out, len_out)
+
+#define GET_C_CHARPTR_INT_CTEXT_DATA_ALLOCA(ptr, ptr_out)	\
+  GET_C_CHARPTR_INT_DATA_ALLOCA (ptr, FORMAT_CTEXT, ptr_out)
+#define GET_CHARPTR_INT_CTEXT_DATA_ALLOCA(ptr, len, ptr_out, len_out) \
+  GET_CHARPTR_INT_DATA_ALLOCA (ptr, len, FORMAT_CTEXT, ptr_out, len_out)
+
+
+/* Maybe convert Lisp string's data into ext-format and store the result in
+   alloca()'ed space.
+
+   You may wonder why this is written in this fashion and not as a
+   function call.  With a little trickery it could certainly be
+   written this way, but it won't work because of those DAMN GCC WANKERS
+   who couldn't be bothered to handle alloca() properly on the x86
+   architecture. (If you put a call to alloca() in the argument to
+   a function call, the stack space gets allocated right in the
+   middle of the arguments to the function call and you are unbelievably
+   hosed.) */
+
+#define GET_STRING_EXT_DATA_ALLOCA(s, fmt, ptr_out, len_out) do	\
+{								\
+  Extcount gseda_len_out;					\
+  struct Lisp_String *gseda_s = XSTRING (s);			\
+  Extbyte * gseda_ptr_out =					\
+    convert_to_external_format (string_data (gseda_s),		\
+				string_length (gseda_s),	\
+				&gseda_len_out, fmt);		\
+  (ptr_out) = (Extbyte *) alloca (1 + gseda_len_out);		\
+  memcpy ((void *) ptr_out, gseda_ptr_out, 1 + gseda_len_out);	\
+  (len_out) = gseda_len_out;					\
 } while (0)
-#define DFC_LISP_STRING_USE_CONVERTED_DATA(sink) \
-  sink = make_string ((Bufbyte *) dfc_sink.data.ptr, dfc_sink.data.len)
-#define DFC_LISP_OPAQUE_USE_CONVERTED_DATA(sink) \
-  sink = make_opaque (dfc_sink.data.ptr, dfc_sink.data.len)
-#define DFC_LISP_LSTREAM_USE_CONVERTED_DATA(sink) /* data already used */
-#define DFC_LISP_BUFFER_USE_CONVERTED_DATA(sink) \
-  Lstream_delete (XLSTREAM (dfc_sink.lisp_object))
+
+
+#define GET_C_STRING_EXT_DATA_ALLOCA(s, fmt, ptr_out) do	\
+{								\
+  Extcount gcseda_ignored_len;					\
+  Extbyte *gcseda_ptr_out;					\
+								\
+  GET_STRING_EXT_DATA_ALLOCA (s, fmt, gcseda_ptr_out,		\
+			      gcseda_ignored_len);		\
+  (ptr_out) = (char *) gcseda_ptr_out;				\
+} while (0)
+
+#define GET_STRING_BINARY_DATA_ALLOCA(s, ptr_out, len_out)	\
+  GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_BINARY, ptr_out, len_out)
+#define GET_C_STRING_BINARY_DATA_ALLOCA(s, ptr_out)		\
+  GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_BINARY, ptr_out)
 
-/* Someday we might want to distinguish between Qnative and Qfile_name
-   by using coding-system aliases, but for now it suffices to have
-   these be identical.  Qnative can be used as the coding_system
-   argument to TO_EXTERNAL_FORMAT() and TO_INTERNAL_FORMAT(). */
-#define Qnative Qfile_name
+#define GET_STRING_FILENAME_DATA_ALLOCA(s, ptr_out, len_out)	\
+  GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_FILENAME, ptr_out, len_out)
+#define GET_C_STRING_FILENAME_DATA_ALLOCA(s, ptr_out)		\
+  GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_FILENAME, ptr_out)
 
-#ifdef HAVE_MS_WINDOWS
-/* #### kludge!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   Remove this as soon as my Mule code is integrated. */
-#define Qmswindows_tstr Qnative
-#endif
+#define GET_STRING_OS_DATA_ALLOCA(s, ptr_out, len_out)		\
+  GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_OS, ptr_out, len_out)
+#define GET_C_STRING_OS_DATA_ALLOCA(s, ptr_out)			\
+  GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_OS, ptr_out)
+
+#define GET_STRING_CTEXT_DATA_ALLOCA(s, ptr_out, len_out)	\
+  GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_CTEXT, ptr_out, len_out)
+#define GET_C_STRING_CTEXT_DATA_ALLOCA(s, ptr_out)		\
+  GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_CTEXT, ptr_out)
+
+
 
 /************************************************************************/
 /*                                                                      */
@@ -1415,7 +1433,7 @@
 
 #define POINT_MARKER_P(marker) \
    (XMARKER (marker)->buffer != 0 && \
-    EQ (marker, XMARKER (marker)->buffer->point_marker))
+    EQ ((marker), XMARKER (marker)->buffer->point_marker))
 
 #define BUF_MARKERS(buf) ((buf)->markers)
 
@@ -1542,8 +1560,8 @@
 
 #ifdef REL_ALLOC
 
-char *r_alloc (unsigned char **, size_t);
-char *r_re_alloc (unsigned char **, size_t);
+char *r_alloc (unsigned char **, unsigned long);
+char *r_re_alloc (unsigned char **, unsigned long);
 void r_alloc_free (unsigned char **);
 
 #define BUFFER_ALLOC(data, size) \
@@ -1576,17 +1594,17 @@
 /* from insdel.c */
 void set_buffer_point (struct buffer *buf, Bufpos pos, Bytind bipos);
 void find_charsets_in_bufbyte_string (unsigned char *charsets,
-				      const Bufbyte *str,
+				      CONST Bufbyte *str,
 				      Bytecount len);
 void find_charsets_in_emchar_string (unsigned char *charsets,
-				     const Emchar *str,
+				     CONST Emchar *str,
 				     Charcount len);
-int bufbyte_string_displayed_columns (const Bufbyte *str, Bytecount len);
-int emchar_string_displayed_columns (const Emchar *str, Charcount len);
-void convert_bufbyte_string_into_emchar_dynarr (const Bufbyte *str,
+int bufbyte_string_displayed_columns (CONST Bufbyte *str, Bytecount len);
+int emchar_string_displayed_columns (CONST Emchar *str, Charcount len);
+void convert_bufbyte_string_into_emchar_dynarr (CONST Bufbyte *str,
 						Bytecount len,
 						Emchar_dynarr *dyn);
-Charcount convert_bufbyte_string_into_emchar_string (const Bufbyte *str,
+Charcount convert_bufbyte_string_into_emchar_string (CONST Bufbyte *str,
 						     Bytecount len,
 						     Emchar *arr);
 void convert_emchar_string_into_bufbyte_dynarr (Emchar *arr, int nels,
@@ -1682,7 +1700,7 @@
   set_string_char (XSTRING (table), (Charcount) ch1, ch2)
 
 #ifdef MULE
-# define MAKE_MIRROR_TRT_TABLE() make_opaque (OPAQUE_CLEAR, 256)
+# define MAKE_MIRROR_TRT_TABLE() make_opaque (256, 0)
 # define MIRROR_TRT_TABLE_AS_STRING(table) ((Bufbyte *) XOPAQUE_DATA (table))
 # define MIRROR_TRT_TABLE_CHAR_1(table, ch) \
   ((Emchar) (MIRROR_TRT_TABLE_AS_STRING (table)[ch]))
@@ -1712,8 +1730,8 @@
   TRT_TABLE_AS_STRING (buf->case_eqv_table)
 #endif
 
-INLINE_HEADER Emchar TRT_TABLE_OF (Lisp_Object trt, Emchar c);
-INLINE_HEADER Emchar
+INLINE Emchar TRT_TABLE_OF (Lisp_Object trt, Emchar c);
+INLINE Emchar
 TRT_TABLE_OF (Lisp_Object trt, Emchar c)
 {
   return IN_TRT_TABLE_DOMAIN (c) ? TRT_TABLE_CHAR_1 (trt, c) : c;
@@ -1725,8 +1743,8 @@
 
 /* 1 if CH is upper case.  */
 
-INLINE_HEADER int UPPERCASEP (struct buffer *buf, Emchar ch);
-INLINE_HEADER int
+INLINE int UPPERCASEP (struct buffer *buf, Emchar ch);
+INLINE int
 UPPERCASEP (struct buffer *buf, Emchar ch)
 {
   return DOWNCASE_TABLE_OF (buf, ch) != ch;
@@ -1734,8 +1752,8 @@
 
 /* 1 if CH is lower case.  */
 
-INLINE_HEADER int LOWERCASEP (struct buffer *buf, Emchar ch);
-INLINE_HEADER int
+INLINE int LOWERCASEP (struct buffer *buf, Emchar ch);
+INLINE int
 LOWERCASEP (struct buffer *buf, Emchar ch)
 {
   return (UPCASE_TABLE_OF   (buf, ch) != ch &&
@@ -1744,8 +1762,8 @@
 
 /* 1 if CH is neither upper nor lower case.  */
 
-INLINE_HEADER int NOCASEP (struct buffer *buf, Emchar ch);
-INLINE_HEADER int
+INLINE int NOCASEP (struct buffer *buf, Emchar ch);
+INLINE int
 NOCASEP (struct buffer *buf, Emchar ch)
 {
   return UPCASE_TABLE_OF (buf, ch) == ch;
@@ -1753,8 +1771,8 @@
 
 /* Upcase a character, or make no change if that cannot be done.  */
 
-INLINE_HEADER Emchar UPCASE (struct buffer *buf, Emchar ch);
-INLINE_HEADER Emchar
+INLINE Emchar UPCASE (struct buffer *buf, Emchar ch);
+INLINE Emchar
 UPCASE (struct buffer *buf, Emchar ch)
 {
   return (DOWNCASE_TABLE_OF (buf, ch) == ch) ? UPCASE_TABLE_OF (buf, ch) : ch;
@@ -1768,4 +1786,4 @@
 
 #define DOWNCASE(buf, ch) DOWNCASE_TABLE_OF (buf, ch)
 
-#endif /* INCLUDED_buffer_h_ */
+#endif /* _XEMACS_BUFFER_H_ */