diff src/file-coding.h @ 5118:e0db3c197671 ben-lisp-object

merge up to latest default branch, doesn't compile yet
author Ben Wing <ben@xemacs.org>
date Sat, 26 Dec 2009 21:18:49 -0600
parents 257b468bf2ca
children d1247f3cc363
line wrap: on
line diff
--- a/src/file-coding.h	Sat Dec 26 00:20:27 2009 -0600
+++ b/src/file-coding.h	Sat Dec 26 21:18:49 2009 -0600
@@ -208,7 +208,7 @@
 };
 typedef struct Lisp_Coding_System Lisp_Coding_System;
 
-DECLARE_LRECORD (coding_system, Lisp_Coding_System);
+DECLARE_LISP_OBJECT (coding_system, Lisp_Coding_System);
 #define XCODING_SYSTEM(x) XRECORD (x, coding_system, Lisp_Coding_System)
 #define wrap_coding_system(p) wrap_record (p, coding_system)
 #define CODING_SYSTEMP(x) RECORDP (x, coding_system)
@@ -230,7 +230,8 @@
   ccl_coding_system,
   shift_jis_coding_system,
   big5_coding_system,
-  unicode_coding_system
+  unicode_coding_system,
+  fixed_width_coding_system
 };
 
 struct coding_system_methods
@@ -318,6 +319,28 @@
 				  const unsigned char *src,
 				  unsigned_char_dynarr *dst, Bytecount n);
 
+  /* Query method: Check whether the buffer text between point and END
+     can be encoded by this coding system. Returns
+     either nil (meaning the text can be encoded by the coding system) or a
+     range table object describing the stretches that the coding system
+     cannot encode.
+     
+     Possible values for flags are below, search for
+     QUERY_METHOD_IGNORE_INVALID_SEQUENCES.
+
+     Coding systems are expected to be able to behave sensibly with all
+     possible octets on decoding, which is why this method is only available
+     for encoding. */
+  Lisp_Object (*query_method) (Lisp_Object coding_system, struct buffer *buf,
+                               Charbpos end, int flags);
+
+  /* Same as the previous method, but this works in the context of
+     lstreams. (Where the data do need to be copied, unfortunately.)  The
+     intention is to implement the query method for the mswindows-multibyte
+     coding systems in terms of a query_lstream method. */
+  Lisp_Object (*query_lstream_method) (struct coding_stream *str,
+                                       const Ibyte *start, Bytecount n);
+
   /* Coding mark method: Mark any Lisp objects in the type-specific data
      attached to `struct coding_stream'.  Optional. */
   void (*mark_coding_stream_method) (struct coding_stream *str);
@@ -387,6 +410,24 @@
   int coding_data_size;
 };
 
+/* Values for flags, as passed to query_method. */
+
+#define QUERY_METHOD_IGNORE_INVALID_SEQUENCES 0x0001
+#define QUERY_METHOD_ERRORP                   0x0002
+#define QUERY_METHOD_HIGHLIGHT                0x0004
+
+enum query_coding_failure_reasons
+  {
+    query_coding_succeeded = 0,
+    query_coding_unencodable = 1, 
+    query_coding_invalid_sequence = 2
+  }; 
+
+extern Lisp_Object Qquery_coding_warning_face;
+
+Lisp_Object default_query_method (Lisp_Object, struct buffer *, Charbpos,
+                                  int);
+
 /***** Calling a coding-system method *****/
 
 #define RAW_CODESYSMETH(cs, m) ((cs)->methods->m##_method)
@@ -413,7 +454,6 @@
 #define XCODESYSMETH_OR_GIVEN(cs, m, args, given) \
   CODESYSMETH_OR_GIVEN (XCODING_SYSTEM (cs), m, args, given)
 
-
 /***** Defining new coding-system types *****/
 
 extern const struct sized_memory_description coding_system_empty_extra_description;
@@ -477,6 +517,7 @@
   ty##_coding_system_methods->extra_description =			\
     &coding_system_empty_extra_description;				\
   ty##_coding_system_methods->enumtype = ty##_coding_system;		\
+  ty##_coding_system_methods->query_method = default_query_method;      \
   defsymbol_nodump (&ty##_coding_system_methods->predicate_symbol,	\
                     pred_sym);						\
   add_entry_to_coding_system_type_list (ty##_coding_system_methods);	\
@@ -583,6 +624,8 @@
 #define CODING_SYSTEM_AUTO_EOL_WRAPPER(codesys) ((codesys)->auto_eol_wrapper)
 #define CODING_SYSTEM_SUBSIDIARY_PARENT(codesys) ((codesys)->subsidiary_parent)
 #define CODING_SYSTEM_CANONICAL(codesys) ((codesys)->canonical)
+#define CODING_SYSTEM_SAFE_CHARSETS(codesys) ((codesys)->safe_charsets)
+#define CODING_SYSTEM_SAFE_CHARS(codesys) ((codesys)->safe_chars)
 
 #define CODING_SYSTEM_CHAIN_CHAIN(codesys) \
   (CODING_SYSTEM_TYPE_DATA (codesys, chain)->chain)
@@ -623,6 +666,10 @@
   CODING_SYSTEM_SUBSIDIARY_PARENT (XCODING_SYSTEM (codesys))
 #define XCODING_SYSTEM_CANONICAL(codesys) \
   CODING_SYSTEM_CANONICAL (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_SAFE_CHARSETS(codesys) \
+  CODING_SYSTEM_SAFE_CHARSETS (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_SAFE_CHARS(codesys) \
+  CODING_SYSTEM_SAFE_CHARS (XCODING_SYSTEM (codesys))
 
 #define XCODING_SYSTEM_CHAIN_CHAIN(codesys) \
   CODING_SYSTEM_CHAIN_CHAIN (XCODING_SYSTEM (codesys))
@@ -1023,6 +1070,7 @@
 #ifdef MULE
 DECLARE_CODING_SYSTEM_TYPE (iso2022);
 DECLARE_CODING_SYSTEM_TYPE (ccl);
+DECLARE_CODING_SYSTEM_TYPE (fixed_width);
 DECLARE_CODING_SYSTEM_TYPE (shift_jis);
 DECLARE_CODING_SYSTEM_TYPE (big5);
 #endif
@@ -1046,7 +1094,7 @@
 Ichar decode_big5_char (int o1, int o2);
 void add_entry_to_coding_system_type_list (struct coding_system_methods *m);
 Lisp_Object make_internal_coding_system (Lisp_Object existing,
-					 Ascbyte *prefix,
+					 const Ascbyte *prefix,
 					 Lisp_Object type,
 					 Lisp_Object description,
 					 Lisp_Object props);