Merge from mainline.
[bpt/emacs.git] / src / coding.h
index a7196f9..85e153d 100644 (file)
@@ -1,8 +1,7 @@
 /* Header for coding system handler.
 /* Header for coding system handler.
-   Copyright (C) 2001, 2002, 2003, 2004, 2005,
-                 2006, 2007, 2008  Free Software Foundation, Inc.
+   Copyright (C) 2001-2011  Free Software Foundation, Inc.
    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-     2005, 2006, 2007, 2008
+     2005, 2006, 2007, 2008, 2009, 2010, 2011
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H14PRO021
    Copyright (C) 2003
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H14PRO021
    Copyright (C) 2003
@@ -306,6 +305,37 @@ enum coding_result_code
    ASCII characters (usually '?') for unsupported characters.  */
 #define CODING_MODE_SAFE_ENCODING              0x20
 
    ASCII characters (usually '?') for unsupported characters.  */
 #define CODING_MODE_SAFE_ENCODING              0x20
 
+  /* For handling composition sequence.  */
+#include "composite.h"
+
+enum composition_state
+  {
+    COMPOSING_NO,
+    COMPOSING_CHAR,
+    COMPOSING_RULE,
+    COMPOSING_COMPONENT_CHAR,
+    COMPOSING_COMPONENT_RULE
+  };
+
+/* Structure for the current composition status.  */
+struct composition_status
+{
+  enum composition_state state;
+  enum composition_method method;
+  int old_form;                  /* 0:pre-21 form, 1:post-21 form */
+  int length;            /* number of elements produced in charbuf */
+  int nchars;            /* number of characters composed */
+  int ncomps;            /* number of composition components */
+  /* Maximum carryover is for the case of COMPOSITION_WITH_RULE_ALTCHARS.
+     See the comment in coding.c.  */
+  int carryover[4              /* annotation header */
+               + MAX_COMPOSITION_COMPONENTS * 3 - 2 /* ALTs and RULEs */
+               + 2                                  /* intermediate -1 -1 */
+               + MAX_COMPOSITION_COMPONENTS         /* CHARs */
+               ];
+};
+
+
 /* Structure of the field `spec.iso_2022' in the structure
    `coding_system'.  */
 struct iso_2022_spec
 /* Structure of the field `spec.iso_2022' in the structure
    `coding_system'.  */
 struct iso_2022_spec
@@ -327,6 +357,21 @@ struct iso_2022_spec
 
   /* Set to 1 temporarily only when processing at beginning of line.  */
   int bol;
 
   /* Set to 1 temporarily only when processing at beginning of line.  */
   int bol;
+
+  /* If positive, we are now scanning CTEXT extended segment.  */
+  int ctext_extended_segment_len;
+
+  /* If nonzero, we are now scanning embedded UTF-8 sequence.  */
+  int embedded_utf_8;
+
+  /* The current composition.  */
+  struct composition_status cmp_status;
+};
+
+struct emacs_mule_spec
+{
+  int full_support;
+  struct composition_status cmp_status;
 };
 
 struct ccl_spec;
 };
 
 struct ccl_spec;
@@ -387,11 +432,11 @@ struct coding_system
       struct ccl_spec *ccl;    /* Defined in ccl.h.  */
       struct utf_16_spec utf_16;
       enum utf_bom_type utf_8_bom;
       struct ccl_spec *ccl;    /* Defined in ccl.h.  */
       struct utf_16_spec utf_16;
       enum utf_bom_type utf_8_bom;
-      int emacs_mule_full_support;
+      struct emacs_mule_spec emacs_mule;
     } spec;
 
   int max_charset_id;
     } spec;
 
   int max_charset_id;
-  char *safe_charsets;
+  unsigned char *safe_charsets;
 
   /* The following two members specify how binary 8-bit code 128..255
      are represented in source and destination text respectively.  1
 
   /* The following two members specify how binary 8-bit code 128..255
      are represented in source and destination text respectively.  1
@@ -404,7 +449,7 @@ struct coding_system
      -1 in setup_coding_system, and updated by detect_coding.  So,
      when this is equal to the byte length of the text being
      converted, we can skip the actual conversion process.  */
      -1 in setup_coding_system, and updated by detect_coding.  So,
      when this is equal to the byte length of the text being
      converted, we can skip the actual conversion process.  */
-  int head_ascii;
+  EMACS_INT head_ascii;
 
   /* The following members are set by encoding/decoding routine.  */
   EMACS_INT produced, produced_char, consumed, consumed_char;
 
   /* The following members are set by encoding/decoding routine.  */
   EMACS_INT produced, produced_char, consumed, consumed_char;
@@ -453,10 +498,10 @@ struct coding_system
 
   int default_char;
 
 
   int default_char;
 
-  int (*detector) P_ ((struct coding_system *,
-                      struct coding_detection_info *));
-  void (*decoder) P_ ((struct coding_system *));
-  int (*encoder) P_ ((struct coding_system *));
+  int (*detector) (struct coding_system *,
+                   struct coding_detection_info *);
+  void (*decoder) (struct coding_system *);
+  int (*encoder) (struct coding_system *);
 };
 
 /* Meanings of bits in the member `common_flags' of the structure
 };
 
 /* Meanings of bits in the member `common_flags' of the structure
@@ -584,7 +629,7 @@ struct coding_system
     if (j1 & 1)                                                \
       {                                                        \
        s1 = (j1 <= 0x25 ? 0xF0 + (j1 - 0x21) / 2       \
     if (j1 & 1)                                                \
       {                                                        \
        s1 = (j1 <= 0x25 ? 0xF0 + (j1 - 0x21) / 2       \
-             : j1 <= 0x27 ? 0xF3 + (j1 - 0x2D) / 2     \
+             : j1 <= 0x2F ? 0xF3 + (j1 - 0x2D) / 2     \
              : 0xF5 + (j1 - 0x6F) / 2);                \
        s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F);         \
       }                                                        \
              : 0xF5 + (j1 - 0x6F) / 2);                \
        s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F);         \
       }                                                        \
@@ -640,37 +685,32 @@ struct coding_system
    ? code_convert_string_norecord (str, Vlocale_coding_system, 0)         \
    : str)
 
    ? code_convert_string_norecord (str, Vlocale_coding_system, 0)         \
    : str)
 
-/* Used by the gtk menu code.  Note that this encodes utf-8, not
-   utf-8-emacs, so it's not a no-op.  */
+/* Note that this encodes utf-8, not utf-8-emacs, so it's not a no-op.  */
 #define ENCODE_UTF_8(str) code_convert_string_norecord (str, Qutf_8, 1)
 
 /* Extern declarations.  */
 #define ENCODE_UTF_8(str) code_convert_string_norecord (str, Qutf_8, 1)
 
 /* Extern declarations.  */
-extern Lisp_Object code_conversion_save P_ ((int, int));
-extern int decoding_buffer_size P_ ((struct coding_system *, int));
-extern int encoding_buffer_size P_ ((struct coding_system *, int));
-extern void setup_coding_system P_ ((Lisp_Object, struct coding_system *));
-extern Lisp_Object coding_charset_list P_ ((struct coding_system *));
-extern void detect_coding P_ ((struct coding_system *));
-extern Lisp_Object code_convert_region P_ ((Lisp_Object, Lisp_Object,
-                                           Lisp_Object, Lisp_Object,
-                                           int, int));
-extern Lisp_Object code_convert_string P_ ((Lisp_Object, Lisp_Object,
-                                           Lisp_Object, int, int, int));
-extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object,
-                                                    int));
-extern Lisp_Object raw_text_coding_system P_ ((Lisp_Object));
-extern Lisp_Object coding_inherit_eol_type P_ ((Lisp_Object, Lisp_Object));
-
-extern int decode_coding_gap P_ ((struct coding_system *,
-                                 EMACS_INT, EMACS_INT));
-extern int encode_coding_gap P_ ((struct coding_system *,
-                                 EMACS_INT, EMACS_INT));
-extern void decode_coding_object P_ ((struct coding_system *,
-                                     Lisp_Object, EMACS_INT, EMACS_INT,
-                                     EMACS_INT, EMACS_INT, Lisp_Object));
-extern void encode_coding_object P_ ((struct coding_system *,
-                                     Lisp_Object, EMACS_INT, EMACS_INT,
-                                     EMACS_INT, EMACS_INT, Lisp_Object));
+extern Lisp_Object code_conversion_save (int, int);
+extern int decoding_buffer_size (struct coding_system *, int);
+extern int encoding_buffer_size (struct coding_system *, int);
+extern void setup_coding_system (Lisp_Object, struct coding_system *);
+extern Lisp_Object coding_charset_list (struct coding_system *);
+extern Lisp_Object coding_system_charset_list (Lisp_Object);
+extern Lisp_Object code_convert_string (Lisp_Object, Lisp_Object,
+                                        Lisp_Object, int, int, int);
+extern Lisp_Object code_convert_string_norecord (Lisp_Object, Lisp_Object,
+                                                 int);
+extern Lisp_Object raw_text_coding_system (Lisp_Object);
+extern Lisp_Object coding_inherit_eol_type (Lisp_Object, Lisp_Object);
+extern Lisp_Object complement_process_encoding_system (Lisp_Object);
+
+extern int decode_coding_gap (struct coding_system *,
+                              EMACS_INT, EMACS_INT);
+extern void decode_coding_object (struct coding_system *,
+                                  Lisp_Object, EMACS_INT, EMACS_INT,
+                                  EMACS_INT, EMACS_INT, Lisp_Object);
+extern void encode_coding_object (struct coding_system *,
+                                  Lisp_Object, EMACS_INT, EMACS_INT,
+                                  EMACS_INT, EMACS_INT, Lisp_Object);
 
 /* Macros for backward compatibility.  */
 
 
 /* Macros for backward compatibility.  */
 
@@ -687,13 +727,14 @@ extern void encode_coding_object P_ ((struct coding_system *,
 
 
 #define decode_coding_string(coding, string, nocopy)                   \
 
 
 #define decode_coding_string(coding, string, nocopy)                   \
-  decode_coding_object (coding, string, 0, 0, XSTRING (string)->size,  \
-                       STRING_BYTES (XSTRING (string)), Qt)
+  decode_coding_object (coding, string, 0, 0, SCHARS (string),         \
+                       SBYTES (string), Qt)
 
 #define encode_coding_string(coding, string, nocopy)                   \
 
 #define encode_coding_string(coding, string, nocopy)                   \
-  (encode_coding_object (coding, string, 0, 0, XSTRING (string)->size, \
-                        STRING_BYTES (XSTRING (string)), Qt),          \
-   (coding)->dst_object)
+  (STRING_MULTIBYTE(string) ?                                          \
+    (encode_coding_object (coding, string, 0, 0, SCHARS (string),      \
+                          SBYTES (string), Qt),                        \
+     (coding)->dst_object) : (string))
 
 
 #define decode_coding_c_string(coding, src, bytes, dst_object)         \
 
 
 #define decode_coding_c_string(coding, src, bytes, dst_object)         \
@@ -705,15 +746,14 @@ extern void encode_coding_object P_ ((struct coding_system *,
   } while (0)
 
 
   } while (0)
 
 
-extern Lisp_Object preferred_coding_system P_ (());
+extern Lisp_Object preferred_coding_system (void);
 
 
 extern Lisp_Object Qutf_8, Qutf_8_emacs;
 
 
 
 extern Lisp_Object Qutf_8, Qutf_8_emacs;
 
-extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;
+extern Lisp_Object Qcoding_category_index;
 extern Lisp_Object Qcoding_system_p;
 extern Lisp_Object Qraw_text, Qemacs_mule, Qno_conversion, Qundecided;
 extern Lisp_Object Qcoding_system_p;
 extern Lisp_Object Qraw_text, Qemacs_mule, Qno_conversion, Qundecided;
-extern Lisp_Object Qiso_2022;
 extern Lisp_Object Qbuffer_file_coding_system;
 
 extern Lisp_Object Qunix, Qdos, Qmac;
 extern Lisp_Object Qbuffer_file_coding_system;
 
 extern Lisp_Object Qunix, Qdos, Qmac;
@@ -721,63 +761,24 @@ extern Lisp_Object Qunix, Qdos, Qmac;
 extern Lisp_Object Qtranslation_table;
 extern Lisp_Object Qtranslation_table_id;
 
 extern Lisp_Object Qtranslation_table;
 extern Lisp_Object Qtranslation_table_id;
 
-/* Mnemonic strings to indicate each type of end-of-line.  */
-extern Lisp_Object eol_mnemonic_unix, eol_mnemonic_dos, eol_mnemonic_mac;
-/* Mnemonic string to indicate type of end-of-line is not yet decided.  */
-extern Lisp_Object eol_mnemonic_undecided;
-
 #ifdef emacs
 extern Lisp_Object Qfile_coding_system;
 extern Lisp_Object Qcall_process, Qcall_process_region;
 extern Lisp_Object Qstart_process, Qopen_network_stream;
 extern Lisp_Object Qwrite_region;
 
 #ifdef emacs
 extern Lisp_Object Qfile_coding_system;
 extern Lisp_Object Qcall_process, Qcall_process_region;
 extern Lisp_Object Qstart_process, Qopen_network_stream;
 extern Lisp_Object Qwrite_region;
 
-extern char *emacs_strerror P_ ((int));
-
-/* Coding-system for reading files and receiving data from process.  */
-extern Lisp_Object Vcoding_system_for_read;
-/* Coding-system for writing files and sending data to process.  */
-extern Lisp_Object Vcoding_system_for_write;
-/* Coding-system actually used in the latest I/O.  */
-extern Lisp_Object Vlast_coding_system_used;
-/* Coding-system to use with system messages (e.g. strerror).  */
-extern Lisp_Object Vlocale_coding_system;
-
-/* If non-zero, process buffer inherits the coding system used to decode
-   the subprocess output.  */
-extern int inherit_process_coding_system;
+extern char *emacs_strerror (int);
 
 /* Coding system to be used to encode text for terminal display when
    terminal coding system is nil.  */
 extern struct coding_system safe_terminal_coding;
 
 
 /* Coding system to be used to encode text for terminal display when
    terminal coding system is nil.  */
 extern struct coding_system safe_terminal_coding;
 
-/* Default coding systems used for process I/O.  */
-extern Lisp_Object Vdefault_process_coding_system;
-
-/* Function to call to force a user to force select a propert coding
-   system.  */
-extern Lisp_Object Vselect_safe_coding_system_function;
-
-/* If nonzero, on writing a file, Vselect_safe_coding_system_function
-   is called even if Vcoding_system_for_write is non-nil.  */
-extern int coding_system_require_warning;
-
-/* Coding system for file names, or nil if none.  */
-extern Lisp_Object Vfile_name_coding_system;
-
-/* Coding system for file names used only when
-   Vfile_name_coding_system is nil.  */
-extern Lisp_Object Vdefault_file_name_coding_system;
-
 #endif
 
 /* Error signaled when there's a problem with detecting coding system */
 extern Lisp_Object Qcoding_system_error;
 
 extern char emacs_mule_bytes[256];
 #endif
 
 /* Error signaled when there's a problem with detecting coding system */
 extern Lisp_Object Qcoding_system_error;
 
 extern char emacs_mule_bytes[256];
-extern int emacs_mule_string_char P_ ((unsigned char *));
+extern int emacs_mule_string_char (unsigned char *);
 
 #endif /* EMACS_CODING_H */
 
 #endif /* EMACS_CODING_H */
-
-/* arch-tag: 2bc3b4fa-6870-4f64-8135-b962b2d290e4
-   (do not change this comment) */