/[emacs]/emacs/src/coding.h
ViewVC logotype

Diff of /emacs/src/coding.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.67 by fx, Mon Jun 2 18:49:53 2003 UTC revision 1.67.2.1 by handa, Mon Sep 8 12:48:10 2003 UTC
# Line 1  Line 1 
1  /* Header for coding system handler.  /* Header for coding system handler.
2     Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN.     Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN.
3     Licensed to the Free Software Foundation.       Licensed to the Free Software Foundation.
4       Copyright (C) 2003
5         National Institute of Advanced Industrial Science and Technology (AIST)
6         Registration Number H13PRO009
7    
8  This file is part of GNU Emacs.  This file is part of GNU Emacs.
9    
# Line 22  Boston, MA 02111-1307, USA.  */ Line 25  Boston, MA 02111-1307, USA.  */
25  #ifndef EMACS_CODING_H  #ifndef EMACS_CODING_H
26  #define EMACS_CODING_H  #define EMACS_CODING_H
27    
28  #include "ccl.h"  /* Index to arguments of Fdefine_coding_system_internal.  */
29    
30  /*** EMACS' INTERNAL FORMAT (emacs-mule) section ***/  enum define_coding_system_arg_index
   
 /* All code (1-byte) of Emacs' internal format is classified into one  
    of the followings.  See also `charset.h'.  */  
 enum emacs_code_class_type  
31    {    {
32      EMACS_control_code,         /* Control codes in the range      coding_arg_name,
33                                     0x00..0x1F and 0x7F except for the      coding_arg_mnemonic,
34                                     following two codes.  */      coding_arg_coding_type,
35      EMACS_linefeed_code,        /* 0x0A (linefeed) to denote      coding_arg_charset_list,
36                                     end-of-line.  */      coding_arg_ascii_compatible_p,
37      EMACS_carriage_return_code, /* 0x0D (carriage-return) to be used      coding_arg_decode_translation_table,
38                                     in selective display mode.  */      coding_arg_encode_translation_table,
39      EMACS_ascii_code,           /* ASCII characters.  */      coding_arg_post_read_conversion,
40      EMACS_leading_code_2,       /* Base leading code of official      coding_arg_pre_write_conversion,
41                                     TYPE9N character.  */      coding_arg_default_char,
42      EMACS_leading_code_3,       /* Base leading code of private TYPE9N      coding_arg_for_unibyte,
43                                     or official TYPE9Nx9N character.  */      coding_arg_plist,
44      EMACS_leading_code_4,       /* Base leading code of private      coding_arg_eol_type,
45                                     TYPE9Nx9N character.  */      coding_arg_max
     EMACS_invalid_code          /* Invalid code, i.e. a base leading  
                                    code not yet assigned to any  
                                    charset, or a code of the range  
                                    0xA0..0xFF.  */  
46    };    };
47    
48  extern enum emacs_code_class_type emacs_code_class[256];  enum define_coding_iso2022_arg_index
   
 /*** ISO2022 section ***/  
   
 /* Macros to define code of control characters for ISO2022's functions.  */  
                         /* code */      /* function */  
 #define ISO_CODE_LF     0x0A            /* line-feed */  
 #define ISO_CODE_CR     0x0D            /* carriage-return */  
 #define ISO_CODE_SO     0x0E            /* shift-out */  
 #define ISO_CODE_SI     0x0F            /* shift-in */  
 #define ISO_CODE_SS2_7  0x19            /* single-shift-2 for 7-bit code */  
 #define ISO_CODE_ESC    0x1B            /* escape */  
 #define ISO_CODE_SS2    0x8E            /* single-shift-2 */  
 #define ISO_CODE_SS3    0x8F            /* single-shift-3 */  
 #define ISO_CODE_CSI    0x9B            /* control-sequence-introduce */  
   
 /* All code (1-byte) of ISO2022 is classified into one of the  
    followings.  */  
 enum iso_code_class_type  
49    {    {
50      ISO_control_0,              /* Control codes in the range      coding_arg_iso2022_initial = coding_arg_max,
51                                     0x00..0x1F and 0x7F, except for the      coding_arg_iso2022_reg_usage,
52                                     following 5 codes.  */      coding_arg_iso2022_request,
53      ISO_carriage_return,        /* ISO_CODE_CR (0x0D) */      coding_arg_iso2022_flags,
54      ISO_shift_out,              /* ISO_CODE_SO (0x0E) */      coding_arg_iso2022_max
     ISO_shift_in,               /* ISO_CODE_SI (0x0F) */  
     ISO_single_shift_2_7,       /* ISO_CODE_SS2_7 (0x19) */  
     ISO_escape,                 /* ISO_CODE_SO (0x1B) */  
     ISO_control_1,              /* Control codes in the range  
                                    0x80..0x9F, except for the  
                                    following 3 codes.  */  
     ISO_single_shift_2,         /* ISO_CODE_SS2 (0x8E) */  
     ISO_single_shift_3,         /* ISO_CODE_SS3 (0x8F) */  
     ISO_control_sequence_introducer, /* ISO_CODE_CSI (0x9B) */  
     ISO_0x20_or_0x7F,           /* Codes of the values 0x20 or 0x7F.  */  
     ISO_graphic_plane_0,        /* Graphic codes in the range 0x21..0x7E.  */  
     ISO_0xA0_or_0xFF,           /* Codes of the values 0xA0 or 0xFF.  */  
     ISO_graphic_plane_1         /* Graphic codes in the range 0xA1..0xFE.  */  
55    };    };
56    
57  /** The macros CODING_FLAG_ISO_XXX defines a flag bit of the `flags'  enum define_coding_utf16_arg_index
58    element in the structure `coding_system'.  This information is used    {
59    while encoding a text to ISO2022.  **/      coding_arg_utf16_bom = coding_arg_max,
60        coding_arg_utf16_endian,
61  /* If set, produce short-form designation sequence (e.g. ESC $ A)      coding_arg_utf16_max
62     instead of long-form sequence (e.g. ESC $ ( A).  */    };
 #define CODING_FLAG_ISO_SHORT_FORM      0x0001  
63    
64  /* If set, reset graphic planes and registers at end-of-line to the  enum define_coding_ccl_arg_index
65     initial state.  */    {
66  #define CODING_FLAG_ISO_RESET_AT_EOL    0x0002      coding_arg_ccl_decoder = coding_arg_max,
67        coding_arg_ccl_encoder,
68        coding_arg_ccl_valids,
69        coding_arg_ccl_max
70      };
71    
72  /* If set, reset graphic planes and registers before any control  extern Lisp_Object Vcoding_system_hash_table;
    characters to the initial state.  */  
 #define CODING_FLAG_ISO_RESET_AT_CNTL   0x0004  
73    
74  /* If set, encode by 7-bit environment.  */  /* Enumeration of coding system type.  */
 #define CODING_FLAG_ISO_SEVEN_BITS      0x0008  
75    
76  /* If set, use locking-shift function.  */  enum coding_system_type
77  #define CODING_FLAG_ISO_LOCKING_SHIFT   0x0010    {
78        coding_type_charset,
79        coding_type_utf_8,
80        coding_type_utf_16,
81        coding_type_iso_2022,
82        coding_type_emacs_mule,
83        coding_type_sjis,
84        coding_type_ccl,
85        coding_type_raw_text,
86        coding_type_undecided,
87        coding_type_max
88      };
89    
 /* If set, use single-shift function.  Overwrite  
    CODING_FLAG_ISO_LOCKING_SHIFT.  */  
 #define CODING_FLAG_ISO_SINGLE_SHIFT    0x0020  
90    
91  /* If set, designate JISX0201-Roman instead of ASCII.  */  /* Enumeration of end-of-line format type.  */
 #define CODING_FLAG_ISO_USE_ROMAN       0x0040  
92    
93  /* If set, designate JISX0208-1978 instead of JISX0208-1983.  */  enum end_of_line_type
94  #define CODING_FLAG_ISO_USE_OLDJIS      0x0080    {
95        eol_lf,             /* Line-feed only, same as Emacs' internal
96                               format.  */
97        eol_crlf,           /* Sequence of carriage-return and
98                               line-feed.  */
99        eol_cr,             /* Carriage-return only.  */
100        eol_any,            /* Accept any of above.  Produce line-feed
101                               only.  */
102        eol_undecided,      /* This value is used to denote that the
103                               eol-type is not yet undecided.  */
104        eol_type_max
105      };
106    
107  /* If set, do not produce ISO6429's direction specifying sequence.  */  /* Enumeration of index to an attribute vector of a coding system.  */
 #define CODING_FLAG_ISO_NO_DIRECTION    0x0100  
108    
109  /* If set, assume designation states are reset at beginning of line on  enum coding_attr_index
110     output.  */    {
111  #define CODING_FLAG_ISO_INIT_AT_BOL     0x0200      coding_attr_base_name,
112        coding_attr_docstring,
113        coding_attr_mnemonic,
114        coding_attr_type,
115        coding_attr_charset_list,
116        coding_attr_ascii_compat,
117        coding_attr_decode_tbl,
118        coding_attr_encode_tbl,
119        coding_attr_post_read,
120        coding_attr_pre_write,
121        coding_attr_default_char,
122        coding_attr_for_unibyte,
123        coding_attr_plist,
124    
125        coding_attr_category,
126        coding_attr_safe_charsets,
127    
128        /* The followings are extra attributes for each type.  */
129        coding_attr_charset_valids,
130    
131        coding_attr_ccl_decoder,
132        coding_attr_ccl_encoder,
133        coding_attr_ccl_valids,
134    
135        coding_attr_iso_initial,
136        coding_attr_iso_usage,
137        coding_attr_iso_request,
138        coding_attr_iso_flags,
139    
140  /* If set, designation sequence should be placed at beginning of line      coding_attr_utf_16_bom,
141     on output.  */      coding_attr_utf_16_endian,
 #define CODING_FLAG_ISO_DESIGNATE_AT_BOL 0x0400  
142    
143  /* If set, do not encode unsafe characters on output.  */      coding_attr_emacs_mule_full,
 #define CODING_FLAG_ISO_SAFE            0x0800  
144    
145  /* If set, extra latin codes (128..159) are accepted as a valid code      coding_attr_last_index
146     on input.  */    };
 #define CODING_FLAG_ISO_LATIN_EXTRA     0x1000  
147    
 /* If set, use designation escape sequence.  */  
 #define CODING_FLAG_ISO_DESIGNATION     0x10000  
148    
149  /* A character to be produced on output if encoding of the original  #define CODING_ATTR_BASE_NAME(attrs)    AREF (attrs, coding_attr_base_name)
150     character is inhibitted by CODING_MODE_INHIBIT_UNENCODABLE_CHAR.  #define CODING_ATTR_TYPE(attrs)         AREF (attrs, coding_attr_type)
151     It must be an ASCII character.  */  #define CODING_ATTR_CHARSET_LIST(attrs) AREF (attrs, coding_attr_charset_list)
152  #define CODING_REPLACEMENT_CHARACTER '?'  #define CODING_ATTR_MNEMONIC(attrs)     AREF (attrs, coding_attr_mnemonic)
153    #define CODING_ATTR_DOCSTRING(attrs)    AREF (attrs, coding_attr_docstring)
154    #define CODING_ATTR_ASCII_COMPAT(attrs) AREF (attrs, coding_attr_ascii_compat)
155    #define CODING_ATTR_DECODE_TBL(attrs)   AREF (attrs, coding_attr_decode_tbl)
156    #define CODING_ATTR_ENCODE_TBL(attrs)   AREF (attrs, coding_attr_encode_tbl)
157    #define CODING_ATTR_POST_READ(attrs)    AREF (attrs, coding_attr_post_read)
158    #define CODING_ATTR_PRE_WRITE(attrs)    AREF (attrs, coding_attr_pre_write)
159    #define CODING_ATTR_DEFAULT_CHAR(attrs) AREF (attrs, coding_attr_default_char)
160    #define CODING_ATTR_FOR_UNIBYTE(attrs)  AREF (attrs, coding_attr_for_unibyte)
161    #define CODING_ATTR_FLUSHING(attrs)     AREF (attrs, coding_attr_flushing)
162    #define CODING_ATTR_PLIST(attrs)        AREF (attrs, coding_attr_plist)
163    #define CODING_ATTR_CATEGORY(attrs)     AREF (attrs, coding_attr_category)
164    #define CODING_ATTR_SAFE_CHARSETS(attrs)AREF (attrs, coding_attr_safe_charsets)
165    
166    
167    #define CODING_ID_ATTRS(id)     \
168      (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 0))
169    
170    #define CODING_ID_ALIASES(id)   \
171      (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 1))
172    
173    #define CODING_ID_EOL_TYPE(id)  \
174      (AREF (HASH_VALUE (XHASH_TABLE (Vcoding_system_hash_table), id), 2))
175    
176    #define CODING_ID_NAME(id) \
177      (HASH_KEY (XHASH_TABLE (Vcoding_system_hash_table), id))
178    
179    #define CODING_SYSTEM_SPEC(coding_system_symbol)        \
180      (Fgethash (coding_system_symbol, Vcoding_system_hash_table, Qnil))
181    
182    #define CODING_SYSTEM_ID(coding_system_symbol)                  \
183      hash_lookup (XHASH_TABLE (Vcoding_system_hash_table),         \
184                   coding_system_symbol, NULL)
185    
186  /* Structure of the field `spec.iso2022' in the structure `coding_system'.  */  #define CODING_SYSTEM_P(coding_system_symbol)   \
187  struct iso2022_spec    (! NILP (CODING_SYSTEM_SPEC (coding_system_symbol)))
 {  
   /* The current graphic register invoked to each graphic plane.  */  
   int current_invocation[2];  
188    
189    /* The current charset designated to each graphic register.  */  #define CHECK_CODING_SYSTEM(x)                          \
190    int current_designation[4];    do {                                                  \
191        if (!CODING_SYSTEM_P (x))                           \
192          wrong_type_argument (Qcoding_system_p, (x));      \
193      } while (0)
194    
   /* A charset initially designated to each graphic register.  */  
   int initial_designation[4];  
195    
196    /* If not -1, it is a graphic register specified in an invalid  #define CHECK_CODING_SYSTEM_GET_SPEC(x, spec)           \
197       designation sequence.  */    do {                                                  \
198    int last_invalid_designation_register;      spec = CODING_SYSTEM_SPEC (x);                      \
199        if (NILP (spec))                                    \
200    /* A graphic register to which each charset should be designated.  */        x = wrong_type_argument (Qcoding_system_p, (x));  \
201    unsigned char requested_designation[MAX_CHARSET + 1];    } while (0)
   
   /* A revision number to be specified for each charset on encoding.  
      The value 255 means no revision number for the corresponding  
      charset.  */  
   unsigned char charset_revision_number[MAX_CHARSET + 1];  
202    
   /* Set to 1 temporarily only when graphic register 2 or 3 is invoked  
      by single-shift while encoding.  */  
   int single_shifting;  
203    
204    /* Set to 1 temporarily only when processing at beginning of line.  */  #define CHECK_CODING_SYSTEM_GET_ID(x, id)                       \
205    int bol;    do                                                            \
206  };      {                                                           \
207          id = CODING_SYSTEM_ID (x);                                \
208          if (id < 0)                                               \
209            x = wrong_type_argument (Qcoding_system_p, (x));        \
210        } while (0)
211    
 /* Macros to access each field in the structure `spec.iso2022'.  */  
 #define CODING_SPEC_ISO_INVOCATION(coding, plane) \  
   (coding)->spec.iso2022.current_invocation[plane]  
 #define CODING_SPEC_ISO_DESIGNATION(coding, reg) \  
   (coding)->spec.iso2022.current_designation[reg]  
 #define CODING_SPEC_ISO_INITIAL_DESIGNATION(coding, reg) \  
   (coding)->spec.iso2022.initial_designation[reg]  
 #define CODING_SPEC_ISO_REQUESTED_DESIGNATION(coding, charset) \  
   (coding)->spec.iso2022.requested_designation[charset]  
 #define CODING_SPEC_ISO_REVISION_NUMBER(coding, charset) \  
   (coding)->spec.iso2022.charset_revision_number[charset]  
 #define CODING_SPEC_ISO_SINGLE_SHIFTING(coding) \  
   (coding)->spec.iso2022.single_shifting  
 #define CODING_SPEC_ISO_BOL(coding) \  
   (coding)->spec.iso2022.bol  
   
 /* A value which may appear in  
    coding->spec.iso2022.requested_designation indicating that the  
    corresponding charset does not request any graphic register to be  
    designated.  */  
 #define CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION 4  
   
 /* Return a charset which is currently designated to the graphic plane  
    PLANE in the coding-system CODING.  */  
 #define CODING_SPEC_ISO_PLANE_CHARSET(coding, plane)    \  
   ((CODING_SPEC_ISO_INVOCATION (coding, plane) < 0)     \  
    ? -1                                                 \  
    : CODING_SPEC_ISO_DESIGNATION (coding,               \  
                                   CODING_SPEC_ISO_INVOCATION (coding, plane)))  
   
 /*** BIG5 section ***/  
   
 /* Macros to denote each type of BIG5 coding system.  */  
 #define CODING_FLAG_BIG5_HKU    0x00 /* BIG5-HKU is one of variants of  
                                         BIG5 developed by Hong Kong  
                                         University.  */  
 #define CODING_FLAG_BIG5_ETEN   0x01 /* BIG5_ETen is one of variants  
                                         of BIG5 developed by the  
                                         company ETen in Taiwan.  */  
212    
213  /*** GENERAL section ***/  /*** GENERAL section ***/
214    
215  /* Types of coding system.  */  /* Enumeration of result code of code conversion.  */
216  enum coding_type  enum coding_result_code
217    {    {
218      coding_type_no_conversion,  /* A coding system which requires no      CODING_RESULT_SUCCESS,
219                                     conversion for reading and writing      CODING_RESULT_INSUFFICIENT_SRC,
220                                     including end-of-line format.  */      CODING_RESULT_INSUFFICIENT_DST,
221      coding_type_emacs_mule,     /* A coding system used in Emacs'      CODING_RESULT_INCONSISTENT_EOL,
222                                     buffer and string.  Requires no      CODING_RESULT_INSUFFICIENT_CMP,
223                                     conversion for reading and writing      CODING_RESULT_INTERRUPT,
224                                     except for end-of-line format.  */      CODING_RESULT_INSUFFICIENT_MEM
     coding_type_undecided,      /* A coding system which requires  
                                    automatic detection of a real  
                                    coding system.  */  
     coding_type_sjis,           /* SJIS coding system for Japanese.  */  
     coding_type_iso2022,        /* Any coding system of ISO2022  
                                    variants.  */  
     coding_type_big5,           /* BIG5 coding system for Chinese.  */  
     coding_type_ccl,            /* The coding system of which decoder  
                                    and encoder are written in CCL.  */  
     coding_type_raw_text        /* A coding system for a text  
                                    containing random 8-bit code which  
                                    does not require code conversion  
                                    except for end-of-line format. */  
225    };    };
226    
 /* Formats of end-of-line.  */  
 #define CODING_EOL_LF   0       /* Line-feed only, same as Emacs'  
                                    internal format.  */  
 #define CODING_EOL_CRLF 1       /* Sequence of carriage-return and  
                                    line-feed.  */  
 #define CODING_EOL_CR   2       /* Carriage-return only.  */  
 #define CODING_EOL_UNDECIDED 3  /* This value is used to denote the  
                                    eol-type is not yet decided.  */  
 #define CODING_EOL_INCONSISTENT 4 /* This value is used to denote the  
                                      eol-type is not consistent  
                                      through the file.  */  
   
 /* 1 iff composing.  */  
 #define COMPOSING_P(coding) ((int) coding->composing > (int) COMPOSITION_NO)  
   
 #define COMPOSITION_DATA_SIZE 4080  
 #define COMPOSITION_DATA_MAX_BUNCH_LENGTH (4 + MAX_COMPOSITION_COMPONENTS*2)  
   
 /* Data structure to hold information about compositions of text that  
    is being decoded or encode.  ISO 2022 base code conversion routines  
    handle special ESC sequences for composition specification.  But,  
    they can't get/put such information directly from/to a buffer in  
    the deepest place.  So, they store or retrieve the information  
    through this structure.  
   
    The encoder stores the information in this structure when it meets  
    ESC sequences for composition while encoding codes, then, after all  
    text codes are encoded, puts `composition' properties on the text  
    by referring to the structure.  
   
    The decoder at first stores the information of a text to be  
    decoded, then, while decoding codes, generates ESC sequences for  
    composition at proper places by referring to the structure.  */  
   
 struct composition_data  
 {  
   /* The character position of the first character to be encoded or  
      decoded.  START and END (see below) are relative to this  
      position.  */  
   int char_offset;  
   
   /* The composition data.  These elements are repeated for each  
      composition:  
         LENGTH START END METHOD [ COMPONENT ... ]  
      where,  
         LENGTH is the number of elements for this composition.  
   
         START and END are starting and ending character positions of  
         the composition relative to `char_offset'.  
   
         METHOD is one of `enum composing_status' specifying the way of  
         composition.  
   
         COMPONENT is a character or an encoded composition rule.  */  
   int data[COMPOSITION_DATA_SIZE];  
   
   /* The number of elements in `data' currently used.  */  
   int used;  
   
   /* Pointers to the previous and next structures.  When `data' is  
      filled up, another structure is allocated and linked in `next'.  
      The new structure has backward link to this structure in `prev'.  
      The number of chained structures depends on how many compositions  
      the text being encoded or decoded contains.  */  
   struct composition_data *prev, *next;  
 };  
   
 /* Macros used for the member `result' of the struct  
    coding_system.  */  
 #define CODING_FINISH_NORMAL            0  
 #define CODING_FINISH_INSUFFICIENT_SRC  1  
 #define CODING_FINISH_INSUFFICIENT_DST  2  
 #define CODING_FINISH_INCONSISTENT_EOL  3  
 #define CODING_FINISH_INSUFFICIENT_CMP  4  
 #define CODING_FINISH_INTERRUPT         5  
227    
228  /* Macros used for the member `mode' of the struct coding_system.  */  /* Macros used for the member `mode' of the struct coding_system.  */
229    
# Line 330  struct composition_data Line 232  struct composition_data
232  #define CODING_MODE_INHIBIT_INCONSISTENT_EOL    0x01  #define CODING_MODE_INHIBIT_INCONSISTENT_EOL    0x01
233    
234  /* If set, the decoding/encoding routines treat the current data as  /* If set, the decoding/encoding routines treat the current data as
235     the last block of the whole text to be converted, and do     the last block of the whole text to be converted, and do the
236     appropriate finishing job.  */     appropriate finishing job.  */
237  #define CODING_MODE_LAST_BLOCK                  0x02  #define CODING_MODE_LAST_BLOCK                  0x02
238    
# Line 338  struct composition_data Line 240  struct composition_data
240     enables selective display.  */     enables selective display.  */
241  #define CODING_MODE_SELECTIVE_DISPLAY           0x04  #define CODING_MODE_SELECTIVE_DISPLAY           0x04
242    
 /* If set, replace unencodabae characters by `?' on encoding.  */  
 #define CODING_MODE_INHIBIT_UNENCODABLE_CHAR    0x08  
   
243  /* This flag is used by the decoding/encoding routines on the fly.  If  /* This flag is used by the decoding/encoding routines on the fly.  If
244     set, it means that right-to-left text is being processed.  */     set, it means that right-to-left text is being processed.  */
245  #define CODING_MODE_DIRECTION                   0x10  #define CODING_MODE_DIRECTION                   0x08
246    
247  struct coding_system  #define CODING_MODE_FIXED_DESTINATION           0x10
248    
249    #define CODING_MODE_SAFE_ENCODING               0x20
250    
251    /* Structure of the field `spec.iso_2022' in the structure
252       `coding_system'.  */
253    struct iso_2022_spec
254  {  {
255    /* Type of the coding system.  */    /* Bit-wise-or of CODING_ISO_FLAG_XXX.  */
256    enum coding_type type;    unsigned flags;
257    
258      /* The current graphic register invoked to each graphic plane.  */
259      int current_invocation[2];
260    
261    /* Type of end-of-line format (LF, CRLF, or CR) of the coding system.  */    /* The current charset designated to each graphic register.  The
262    int eol_type;       value -1 means that not charset is designated, -2 means that
263         there was an invalid designation previously.  */
264      int current_designation[4];
265    
266      /* Set to 1 temporarily only when graphic register 2 or 3 is invoked
267         by single-shift while encoding.  */
268      int single_shifting;
269    
270      /* Set to 1 temporarily only when processing at beginning of line.  */
271      int bol;
272    };
273    
274    struct ccl_spec;
275    
276    enum utf_16_bom_type
277      {
278        utf_16_detect_bom,
279        utf_16_without_bom,
280        utf_16_with_bom
281      };
282    
283    enum utf_16_endian_type
284      {
285        utf_16_big_endian,
286        utf_16_little_endian
287      };
288    
289    struct utf_16_spec
290    {
291      enum utf_16_bom_type bom;
292      enum utf_16_endian_type endian;
293      int surrogate;
294    };
295    
296    struct coding_detection_info
297    {
298      /* Values of these members are bitwise-OR of CATEGORY_MASK_XXXs.  */
299      /* Which categories are already checked.  */
300      int checked;
301      /* Which categories are strongly found.  */
302      int found;
303      /* Which categories are rejected.  */
304      int rejected;
305    };
306    
307    
308    struct coding_system
309    {
310      /* ID number of the coding system.  This is an index to
311         Vcoding_system_hash_table.  This value is set by
312         setup_coding_system.  At the early stage of building time, this
313         value is -1 in the array coding_categories to indicate that no
314         coding-system of that category is yet defined.  */
315      int id;
316    
317    /* Flag bits of the coding system.  The meaning of each bit is common    /* Flag bits of the coding system.  The meaning of each bit is common
318       to all types of coding systems.  */       to all types of coding systems.  */
319    unsigned int common_flags;    int common_flags;
   
   /* Flag bits of the coding system.  The meaning of each bit depends  
      on the type of the coding system.  */  
   unsigned int flags;  
320    
321    /* Mode bits of the coding system.  See the comments of the macros    /* Mode bits of the coding system.  See the comments of the macros
322       CODING_MODE_XXX.  */       CODING_MODE_XXX.  */
323    unsigned int mode;    unsigned int mode;
324    
   /* The current status of composition handling.  */  
   int composing;  
   
   /* 1 iff the next character is a composition rule.  */  
   int composition_rule_follows;  
   
   /* Information of compositions are stored here on decoding and set  
      in advance on encoding.  */  
   struct composition_data *cmp_data;  
   
   /* Index to cmp_data->data for the first element for the current  
      composition.  */  
   int cmp_data_start;  
   
   /* Index to cmp_data->data for the current element for the current  
      composition.  */  
   int cmp_data_index;  
   
325    /* Detailed information specific to each type of coding system.  */    /* Detailed information specific to each type of coding system.  */
326    union spec    union
327      {      {
328        struct iso2022_spec iso2022;        struct iso_2022_spec iso_2022;
329        struct ccl_spec ccl;      /* Defined in ccl.h.  */        struct ccl_spec *ccl;     /* Defined in ccl.h.  */
330          struct utf_16_spec utf_16;
331          int emacs_mule_full_support;
332      } spec;      } spec;
333    
334    /* Index number of coding category of the coding system.  */    int max_charset_id;
335    int category_idx;    char *safe_charsets;
336    
337    /* The following two members specify how characters 128..159 are    /* The following two members specify how binary 8-bit code 128..255
338       represented in source and destination text respectively.  1 means       are represented in source and destination text respectively.  1
339       they are represented by 2-byte sequence, 0 means they are       means they are represented by 2-byte sequence, 0 means they are
340       represented by 1-byte as is (see the comment in charset.h).  */       represented by 1-byte as is (see the comment in character.h).  */
341    unsigned src_multibyte : 1;    unsigned src_multibyte : 1;
342    unsigned dst_multibyte : 1;    unsigned dst_multibyte : 1;
343    
# Line 404  struct coding_system Line 345  struct coding_system
345       -1 in setup_coding_system, and updated by detect_coding.  So,       -1 in setup_coding_system, and updated by detect_coding.  So,
346       when this is equal to the byte length of the text being       when this is equal to the byte length of the text being
347       converted, we can skip the actual conversion process.  */       converted, we can skip the actual conversion process.  */
348    int heading_ascii;    int head_ascii;
349    
350    /* The following members are set by encoding/decoding routine.  */    /* The following members are set by encoding/decoding routine.  */
351    int produced, produced_char, consumed, consumed_char;    EMACS_INT produced, produced_char, consumed, consumed_char;
352    
353    /* Number of error source data found in a decoding routine.  */    /* Number of error source data found in a decoding routine.  */
354    int errors;    int errors;
355    
356    /* Finish status of code conversion.  It should be one of macros    /* Store the positions of error source data. */
357       CODING_FINISH_XXXX.  */    EMACS_INT *error_positions;
   int result;  
358    
359    /* If nonzero, suppress error notification.  */    /* Finish status of code conversion.  */
360    int suppress_error;    enum coding_result_code result;
361    
362    /* The following members are all Lisp symbols.  We don't have to    /* The following members are all Lisp symbols.  We don't have to
363       protect them from GC because the current garbage collection       protect them from GC because the current garbage collection
364       doesn't relocate Lisp symbols.  But, when it is changed, we must       doesn't relocate Lisp symbols.  But, when it is changed, we must
365       find a way to protect them.  */       find a way to protect them.  */
366    
367    /* Backward pointer to the Lisp symbol of the coding system.  */    EMACS_INT src_pos, src_pos_byte, src_chars, src_bytes;
368    Lisp_Object symbol;    Lisp_Object src_object;
369      const unsigned char *source;
370    /* Lisp function (symbol) to be called after decoding to do  
371       additional conversion, or nil.  */    EMACS_INT dst_pos, dst_pos_byte, dst_bytes;
372    Lisp_Object post_read_conversion;    Lisp_Object dst_object;
373      unsigned char *destination;
374    /* Lisp function (symbol) to be called before encoding to do  
375       additional conversion, or nil.  */    int chars_at_source;
376    Lisp_Object pre_write_conversion;  
377      /* If an element is non-negative, it is a character code.
378    /* Character translation tables to look up, or nil.  */  
379    Lisp_Object translation_table_for_decode;       If it is in the range -128..-1, it is a 8-bit character code
380    Lisp_Object translation_table_for_encode;       minus 256.
381    
382         If it is less than -128, it specifies the start of an annotation
383         chunk.  The length of the chunk is -128 minus the value of the
384         element.  The following elements are OFFSET, ANNOTATION-TYPE, and
385         a sequence of actual data for the annotation.  OFFSET is a
386         character position offset from dst_pos or src_pos,
387         ANNOTATION-TYPE specfies the meaning of the annotation and how to
388         handle the following data..  */
389      int *charbuf;
390      int charbuf_size, charbuf_used;
391    
392      /* Set to 1 if charbuf contains an annotation.  */
393      int annotated;
394    
395      unsigned char carryover[64];
396      int carryover_bytes;
397    
398      int default_char;
399    
400      int (*detector) P_ ((struct coding_system *,
401                           struct coding_detection_info *));
402      void (*decoder) P_ ((struct coding_system *));
403      int (*encoder) P_ ((struct coding_system *));
404  };  };
405    
406  #define CODING_REQUIRE_FLUSHING_MASK    1  /* Meanings of bits in the member `common_flags' of the structure
407  #define CODING_REQUIRE_DECODING_MASK    2     coding_system.  The lowest 8 bits are reserved for various kind of
408  #define CODING_REQUIRE_ENCODING_MASK    4     annotations (currently two of them are used).  */
409  #define CODING_REQUIRE_DETECTION_MASK   8  #define CODING_ANNOTATION_MASK                  0x00FF
410    #define CODING_ANNOTATE_COMPOSITION_MASK        0x0001
411    #define CODING_ANNOTATE_DIRECTION_MASK          0x0002
412    #define CODING_ANNOTATE_CHARSET_MASK            0x0003
413    #define CODING_FOR_UNIBYTE_MASK                 0x0100
414    #define CODING_REQUIRE_FLUSHING_MASK            0x0200
415    #define CODING_REQUIRE_DECODING_MASK            0x0400
416    #define CODING_REQUIRE_ENCODING_MASK            0x0800
417    #define CODING_REQUIRE_DETECTION_MASK           0x1000
418    #define CODING_RESET_AT_BOL_MASK                0x2000
419    
420    /* Return 1 if the coding context CODING requires annotaion
421       handling.  */
422    #define CODING_REQUIRE_ANNOTATION(coding) \
423      ((coding)->common_flags & CODING_ANNOTATION_MASK)
424    
425    /* Return 1 if the coding context CODING prefers decoding into unibyte.  */
426    #define CODING_FOR_UNIBYTE(coding) \
427      ((coding)->common_flags & CODING_FOR_UNIBYTE_MASK)
428    
429  /* Return 1 if the coding system CODING requires specific code to be  /* Return 1 if the coding context CODING requires specific code to be
430     attached at the tail of converted text.  */     attached at the tail of converted text.  */
431  #define CODING_REQUIRE_FLUSHING(coding) \  #define CODING_REQUIRE_FLUSHING(coding) \
432    ((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK)    ((coding)->common_flags & CODING_REQUIRE_FLUSHING_MASK)
433    
434  /* Return 1 if the coding system CODING requires code conversion on  /* Return 1 if the coding context CODING requires code conversion on
435     decoding.  */     decoding.  */
436  #define CODING_REQUIRE_DECODING(coding) \  #define CODING_REQUIRE_DECODING(coding) \
437    ((coding)->dst_multibyte              \    ((coding)->dst_multibyte              \
438     || (coding)->common_flags & CODING_REQUIRE_DECODING_MASK)     || (coding)->common_flags & CODING_REQUIRE_DECODING_MASK)
439    
440  /* Return 1 if the coding system CODING requires code conversion on  
441    /* Return 1 if the coding context CODING requires code conversion on
442     encoding.  */     encoding.  */
443  #define CODING_REQUIRE_ENCODING(coding) \  #define CODING_REQUIRE_ENCODING(coding)                         \
444    ((coding)->src_multibyte              \    ((coding)->src_multibyte                                      \
445     || (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK)     || (coding)->common_flags & CODING_REQUIRE_ENCODING_MASK     \
446       || (coding)->mode & CODING_MODE_SELECTIVE_DISPLAY)
447    
448    
449  /* Return 1 if the coding system CODING requires some kind of code  /* Return 1 if the coding context CODING requires some kind of code
450     detection.  */     detection.  */
451  #define CODING_REQUIRE_DETECTION(coding) \  #define CODING_REQUIRE_DETECTION(coding) \
452    ((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK)    ((coding)->common_flags & CODING_REQUIRE_DETECTION_MASK)
453    
454  /* Return 1 if the coding system CODING requires code conversion on  /* Return 1 if the coding context CODING requires code conversion on
455     decoding or some kind of code detection.  */     decoding or some kind of code detection.  */
456  #define CODING_MAY_REQUIRE_DECODING(coding)     \  #define CODING_MAY_REQUIRE_DECODING(coding)     \
457    (CODING_REQUIRE_DECODING (coding)             \    (CODING_REQUIRE_DECODING (coding)             \
458     || CODING_REQUIRE_DETECTION (coding))     || CODING_REQUIRE_DETECTION (coding))
459    
 /* Index for each coding category in `coding_category_table' */  
 #define CODING_CATEGORY_IDX_EMACS_MULE  0  
 #define CODING_CATEGORY_IDX_SJIS        1  
 #define CODING_CATEGORY_IDX_ISO_7       2  
 #define CODING_CATEGORY_IDX_ISO_7_TIGHT 3  
 #define CODING_CATEGORY_IDX_ISO_8_1     4  
 #define CODING_CATEGORY_IDX_ISO_8_2     5  
 #define CODING_CATEGORY_IDX_ISO_7_ELSE  6  
 #define CODING_CATEGORY_IDX_ISO_8_ELSE  7  
 #define CODING_CATEGORY_IDX_CCL         8  
 #define CODING_CATEGORY_IDX_BIG5        9  
 #define CODING_CATEGORY_IDX_UTF_8       10  
 #define CODING_CATEGORY_IDX_UTF_16_BE   11  
 #define CODING_CATEGORY_IDX_UTF_16_LE   12  
 #define CODING_CATEGORY_IDX_RAW_TEXT    13  
 #define CODING_CATEGORY_IDX_BINARY      14  
 #define CODING_CATEGORY_IDX_MAX         15  
   
 /* Definitions of flag bits returned by the function  
    detect_coding_mask ().  */  
 #define CODING_CATEGORY_MASK_EMACS_MULE (1 << CODING_CATEGORY_IDX_EMACS_MULE)  
 #define CODING_CATEGORY_MASK_SJIS       (1 << CODING_CATEGORY_IDX_SJIS)  
 #define CODING_CATEGORY_MASK_ISO_7      (1 << CODING_CATEGORY_IDX_ISO_7)  
 #define CODING_CATEGORY_MASK_ISO_7_TIGHT (1 << CODING_CATEGORY_IDX_ISO_7_TIGHT)  
 #define CODING_CATEGORY_MASK_ISO_8_1    (1 << CODING_CATEGORY_IDX_ISO_8_1)  
 #define CODING_CATEGORY_MASK_ISO_8_2    (1 << CODING_CATEGORY_IDX_ISO_8_2)  
 #define CODING_CATEGORY_MASK_ISO_7_ELSE (1 << CODING_CATEGORY_IDX_ISO_7_ELSE)  
 #define CODING_CATEGORY_MASK_ISO_8_ELSE (1 << CODING_CATEGORY_IDX_ISO_8_ELSE)  
 #define CODING_CATEGORY_MASK_CCL        (1 << CODING_CATEGORY_IDX_CCL)  
 #define CODING_CATEGORY_MASK_BIG5       (1 << CODING_CATEGORY_IDX_BIG5)  
 #define CODING_CATEGORY_MASK_UTF_8      (1 << CODING_CATEGORY_IDX_UTF_8)  
 #define CODING_CATEGORY_MASK_UTF_16_BE  (1 << CODING_CATEGORY_IDX_UTF_16_BE)  
 #define CODING_CATEGORY_MASK_UTF_16_LE  (1 << CODING_CATEGORY_IDX_UTF_16_LE)  
 #define CODING_CATEGORY_MASK_RAW_TEXT   (1 << CODING_CATEGORY_IDX_RAW_TEXT)  
 #define CODING_CATEGORY_MASK_BINARY     (1 << CODING_CATEGORY_IDX_BINARY)  
   
 /* This value is returned if detect_coding_mask () find nothing other  
    than ASCII characters.  */  
 #define CODING_CATEGORY_MASK_ANY        \  
   (  CODING_CATEGORY_MASK_EMACS_MULE    \  
    | CODING_CATEGORY_MASK_SJIS          \  
    | CODING_CATEGORY_MASK_ISO_7         \  
    | CODING_CATEGORY_MASK_ISO_7_TIGHT   \  
    | CODING_CATEGORY_MASK_ISO_8_1       \  
    | CODING_CATEGORY_MASK_ISO_8_2       \  
    | CODING_CATEGORY_MASK_ISO_7_ELSE    \  
    | CODING_CATEGORY_MASK_ISO_8_ELSE    \  
    | CODING_CATEGORY_MASK_CCL           \  
    | CODING_CATEGORY_MASK_BIG5          \  
    | CODING_CATEGORY_MASK_UTF_8         \  
    | CODING_CATEGORY_MASK_UTF_16_BE     \  
    | CODING_CATEGORY_MASK_UTF_16_LE)  
   
 #define CODING_CATEGORY_MASK_ISO_7BIT \  
   (CODING_CATEGORY_MASK_ISO_7 | CODING_CATEGORY_MASK_ISO_7_TIGHT)  
   
 #define CODING_CATEGORY_MASK_ISO_8BIT \  
   (CODING_CATEGORY_MASK_ISO_8_1 | CODING_CATEGORY_MASK_ISO_8_2)  
   
 #define CODING_CATEGORY_MASK_ISO_SHIFT \  
   (CODING_CATEGORY_MASK_ISO_7_ELSE | CODING_CATEGORY_MASK_ISO_8_ELSE)  
   
 #define CODING_CATEGORY_MASK_ISO        \  
   (  CODING_CATEGORY_MASK_ISO_7BIT      \  
    | CODING_CATEGORY_MASK_ISO_SHIFT     \  
    | CODING_CATEGORY_MASK_ISO_8BIT)  
   
 #define CODING_CATEGORY_MASK_UTF_16_BE_LE \  
    (CODING_CATEGORY_MASK_UTF_16_BE | CODING_CATEGORY_MASK_UTF_16_LE)  
   
460  /* Macros to decode or encode a character of JISX0208 in SJIS.  S1 and  /* Macros to decode or encode a character of JISX0208 in SJIS.  S1 and
461     S2 are the 1st and 2nd position-codes of JISX0208 in SJIS coding     S2 are the 1st and 2nd position-codes of JISX0208 in SJIS coding
462     system.  C1 and C2 are the 1st and 2nd position codes of Emacs'     system.  C1 and C2 are the 1st and 2nd position codes of Emacs'
463     internal format.  */     internal format.  */
464    
465  #define DECODE_SJIS(s1, s2, c1, c2)                     \  #define SJIS_TO_JIS(code)                               \
466    do {                                                  \    do {                                                  \
467      if (s2 >= 0x9F)                                     \      int s1, s2, j1, j2;                                 \
468        c1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0),        \                                                          \
469        c2 = s2 - 0x7E;                                   \      s1 = (code) >> 8, s2 = (code) & 0xFF;               \
470      else                                                \                                                          \
471        c1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1),      \      if (s2 >= 0x9F)                                     \
472        c2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F);           \        (j1 = s1 * 2 - (s1 >= 0xE0 ? 0x160 : 0xE0),       \
473           j2 = s2 - 0x7E);                                 \
474        else                                                \
475          (j1 = s1 * 2 - ((s1 >= 0xE0) ? 0x161 : 0xE1),     \
476           j2 = s2 - ((s2 >= 0x7F) ? 0x20 : 0x1F));         \
477        (code) = (j1 << 8) | j2;                            \
478    } while (0)    } while (0)
479    
480  #define ENCODE_SJIS(c1, c2, s1, s2)                     \  
481    #define JIS_TO_SJIS(code)                               \
482    do {                                                  \    do {                                                  \
483      if (c1 & 1)                                         \      int s1, s2, j1, j2;                                 \
484        s1 = c1 / 2 + ((c1 < 0x5F) ? 0x71 : 0xB1),        \                                                          \
485        s2 = c2 + ((c2 >= 0x60) ? 0x20 : 0x1F);           \      j1 = (code) >> 8, j2 = (code) & 0xFF;               \
486        if (j1 & 1)                                         \
487          (s1 = j1 / 2 + ((j1 < 0x5F) ? 0x71 : 0xB1),       \
488           s2 = j2 + ((j2 >= 0x60) ? 0x20 : 0x1F));         \
489      else                                                \      else                                                \
490        s1 = c1 / 2 + ((c1 < 0x5F) ? 0x70 : 0xB0),        \        (s1 = j1 / 2 + ((j1 < 0x5F) ? 0x70 : 0xB0),       \
491        s2 = c2 + 0x7E;                                   \         s2 = j2 + 0x7E);                                 \
492        (code) = (s1 << 8) | s2;                            \
493    } while (0)    } while (0)
494    
495    
496  /* Encode the file name NAME using the specified coding system  /* Encode the file name NAME using the specified coding system
497     for file names, if any.  */     for file names, if any.  */
498  #define ENCODE_FILE(name)                                                  \  #define ENCODE_FILE(name)                                                  \
# Line 579  struct coding_system Line 504  struct coding_system
504        ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \        ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \
505        : name))        : name))
506    
507    
508  /* Decode the file name NAME using the specified coding system  /* Decode the file name NAME using the specified coding system
509     for file names, if any.  */     for file names, if any.  */
510  #define DECODE_FILE(name)                                                  \  #define DECODE_FILE(name)                                                  \
# Line 590  struct coding_system Line 516  struct coding_system
516        ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \        ? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 0) \
517        : name))        : name))
518    
519    
520  #ifdef WINDOWSNT  #ifdef WINDOWSNT
521  /* Encode the string STR using the specified coding system  /* Encode the string STR using the specified coding system
522     for w32 system functions, if any.  */     for w32 system functions, if any.  */
523  #define ENCODE_SYSTEM(str)                                                 \  #define ENCODE_SYSTEM(str)                                              \
524    (! NILP (Vlocale_coding_system)                                          \    (! NILP (Vlocale_coding_system)                                       \
525     && XFASTINT (Vlocale_coding_system) != 0                                \     && XFASTINT (Vlocale_coding_system) != 0                             \
526     ? code_convert_string_norecord (str, Vlocale_coding_system, 1)          \     ? code_convert_string_norecord (str, Vlocale_coding_system, 1)       \
527     : str)     : str)
528    
529  /* Decode the string STR using the specified coding system  /* Decode the string STR using the specified coding system
530     for w32 system functions, if any.  */     for w32 system functions, if any.  */
531  #define DECODE_SYSTEM(name)                                                \  #define DECODE_SYSTEM(name)                                             \
532    (! NILP (Vlocale_coding_system)                                          \    (! NILP (Vlocale_coding_system)                                       \
533     && XFASTINT (Vlocale_coding_system) != 0                                \     && XFASTINT (Vlocale_coding_system) != 0                             \
534     ? code_convert_string_norecord (str, Vlocale_coding_system, 0)          \     ? code_convert_string_norecord (str, Vlocale_coding_system, 0)       \
535     : str)     : str)
536    
537  #else /* WINDOWSNT */  #else /* WINDOWSNT */
# Line 614  struct coding_system Line 541  struct coding_system
541    
542  #endif /* !WINDOWSNT */  #endif /* !WINDOWSNT */
543    
 #define ENCODE_UTF_8(str) code_convert_string_norecord (str, Qutf_8, 1)  
   
544  /* Extern declarations.  */  /* Extern declarations.  */
545  extern int decode_coding P_ ((struct coding_system *, const unsigned char *,  extern Lisp_Object make_conversion_work_buffer P_ ((int, int));
                               unsigned char *, int, int));  
 extern int encode_coding P_ ((struct coding_system *, const unsigned char *,  
                               unsigned char *, int, int));  
 extern void coding_save_composition P_ ((struct coding_system *, int, int,  
                                          Lisp_Object));  
 extern void coding_free_composition_data P_ ((struct coding_system *));  
 extern void coding_adjust_composition_offset P_ ((struct coding_system *,  
                                                   int));  
 extern void coding_allocate_composition_data P_ ((struct coding_system *,  
                                                   int));  
 extern void coding_restore_composition P_ ((struct coding_system *,  
                                             Lisp_Object));  
 extern int code_convert_region P_ ((int, int, int, int, struct coding_system *,  
                                     int, int));  
 extern Lisp_Object run_pre_post_conversion_on_str P_ ((Lisp_Object,  
                                                        struct coding_system *,  
                                                        int));  
546  extern int decoding_buffer_size P_ ((struct coding_system *, int));  extern int decoding_buffer_size P_ ((struct coding_system *, int));
547  extern int encoding_buffer_size P_ ((struct coding_system *, int));  extern int encoding_buffer_size P_ ((struct coding_system *, int));
548  extern void detect_coding P_ ((struct coding_system *, const unsigned char *,  extern void setup_coding_system P_ ((Lisp_Object, struct coding_system *));
549                                 int));  extern void detect_coding P_ ((struct coding_system *));
550  extern void detect_eol P_ ((struct coding_system *, const unsigned char *,  extern Lisp_Object code_convert_region P_ ((Lisp_Object, Lisp_Object,
551                              int));                                              Lisp_Object, Lisp_Object,
552  extern int setup_coding_system P_ ((Lisp_Object, struct coding_system *));                                              int, int));
553  extern Lisp_Object code_convert_string P_ ((Lisp_Object,  extern Lisp_Object code_convert_string P_ ((Lisp_Object, Lisp_Object,
554                                              struct coding_system *, int, int));                                              Lisp_Object, int, int, int));
 extern Lisp_Object code_convert_string1 P_ ((Lisp_Object, Lisp_Object,  
                                              Lisp_Object, int));  
555  extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object,  extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object,
556                                                       int));                                                       int));
557  extern void setup_raw_text_coding_system P_ ((struct coding_system *));  extern Lisp_Object raw_text_coding_system P_ ((Lisp_Object));
558  extern Lisp_Object encode_coding_string P_ ((Lisp_Object,  extern Lisp_Object coding_inherit_eol_type P_ ((Lisp_Object, Lisp_Object));
559                                               struct coding_system *, int));  
560  extern Lisp_Object decode_coding_string P_ ((Lisp_Object,  extern int decode_coding_gap P_ ((struct coding_system *,
561                                               struct coding_system *, int));                                    EMACS_INT, EMACS_INT));
562    extern int encode_coding_gap P_ ((struct coding_system *,
563                                      EMACS_INT, EMACS_INT));
564    extern void decode_coding_object P_ ((struct coding_system *,
565                                          Lisp_Object, EMACS_INT, EMACS_INT,
566                                          EMACS_INT, EMACS_INT, Lisp_Object));
567    extern void encode_coding_object P_ ((struct coding_system *,
568                                          Lisp_Object, EMACS_INT, EMACS_INT,
569                                          EMACS_INT, EMACS_INT, Lisp_Object));
570    
571    #define decode_coding_region(coding, from, to)          \
572      decode_coding_object (coding, Fcurrent_buffer (),     \
573                            from, CHAR_TO_BYTE (from),      \
574                            to, CHAR_TO_BYTE (to), Fcurrent_buffer ())
575    
576    
577    #define encode_coding_region(coding, from, to)          \
578      encode_coding_object (coding, Fcurrent_buffer (),     \
579                            from, CHAR_TO_BYTE (from),      \
580                            to, CHAR_TO_BYTE (to), Fcurrent_buffer ())
581    
582    
583    #define decode_coding_string(coding, string, nocopy)                    \
584      decode_coding_object (coding, string, 0, 0, XSTRING (string)->size,   \
585                            STRING_BYTES (XSTRING (string)), Qt)
586    
587    #define encode_coding_string(coding, string, nocopy)                    \
588      (encode_coding_object (coding, string, 0, 0, XSTRING (string)->size,  \
589                             STRING_BYTES (XSTRING (string)), Qt),          \
590       (coding)->dst_object)
591    
592    
593    #define decode_coding_c_string(coding, src, bytes, dst_object)          \
594      do {                                                                  \
595        (coding)->source = (src);                                           \
596        (coding)->src_chars = (coding)->src_bytes = (bytes);                \
597        decode_coding_object ((coding), Qnil, 0, 0, (bytes), (bytes),       \
598                              (dst_object));                                \
599      } while (0)
600    
601    
602    extern Lisp_Object preferred_coding_system P_ (());
603    
604    
605    extern Lisp_Object Qutf_8, Qutf_8_emacs;
606    
607  extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;  extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;
608  extern Lisp_Object Qraw_text, Qemacs_mule;  extern Lisp_Object Qcoding_system_p;
609    extern Lisp_Object Qraw_text, Qemacs_mule, Qno_conversion, Qundecided;
610    extern Lisp_Object Qiso_2022;
611  extern Lisp_Object Qbuffer_file_coding_system;  extern Lisp_Object Qbuffer_file_coding_system;
612  extern Lisp_Object Vcoding_category_list;  
613  extern Lisp_Object Qutf_8;  extern Lisp_Object Qunix, Qdos, Qmac;
614    
615  extern Lisp_Object Qtranslation_table;  extern Lisp_Object Qtranslation_table;
616  extern Lisp_Object Qtranslation_table_id;  extern Lisp_Object Qtranslation_table_id;
# Line 702  extern struct coding_system safe_termina Line 655  extern struct coding_system safe_termina
655     function `set-keyboard-coding-system'.  */     function `set-keyboard-coding-system'.  */
656  extern struct coding_system keyboard_coding;  extern struct coding_system keyboard_coding;
657    
 /* Default coding system to be used to write a file.  */  
 extern struct coding_system default_buffer_file_coding;  
   
658  /* Default coding systems used for process I/O.  */  /* Default coding systems used for process I/O.  */
659  extern Lisp_Object Vdefault_process_coding_system;  extern Lisp_Object Vdefault_process_coding_system;
660    
661  /* Function to call to force a user to force select a proper coding  /* Function to call to force a user to force select a propert coding
662     system.  */     system.  */
663  extern Lisp_Object Vselect_safe_coding_system_function;  extern Lisp_Object Vselect_safe_coding_system_function;
664    
# Line 728  extern Lisp_Object Vdefault_file_name_co Line 678  extern Lisp_Object Vdefault_file_name_co
678  /* Error signaled when there's a problem with detecting coding system */  /* Error signaled when there's a problem with detecting coding system */
679  extern Lisp_Object Qcoding_system_error;  extern Lisp_Object Qcoding_system_error;
680    
681    extern char emacs_mule_bytes[256];
682    extern int emacs_mule_string_char P_ ((unsigned char *));
683    
684  #endif /* EMACS_CODING_H */  #endif /* EMACS_CODING_H */

Legend:
Removed from v.1.67  
changed lines
  Added in v.1.67.2.1

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26