X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Ftext-coding.c;h=35e85230a38c98ce021ac45a01fea7316f47149e;hb=a3fdbd7c9b63c0ce35da43753b5622ac859325b4;hp=7ba047ee61064a1b16af7acd426507508a6233a8;hpb=17154b8643a42a405158c07a3dbabeb83144c438;p=chise%2Fxemacs-chise.git diff --git a/src/text-coding.c b/src/text-coding.c index 7ba047e..35e8523 100644 --- a/src/text-coding.c +++ b/src/text-coding.c @@ -47,17 +47,17 @@ Lisp_Object Vcoding_system_for_write; Lisp_Object Vfile_name_coding_system; /* Table of symbols identifying each coding category. */ -Lisp_Object coding_category_symbol[CODING_CATEGORY_LAST + 1]; +Lisp_Object coding_category_symbol[CODING_CATEGORY_LAST]; struct file_coding_dump { /* Coding system currently associated with each coding category. */ - Lisp_Object coding_category_system[CODING_CATEGORY_LAST + 1]; + Lisp_Object coding_category_system[CODING_CATEGORY_LAST]; /* Table of all coding categories in decreasing order of priority. This describes a permutation of the possible coding categories. */ - int coding_category_by_priority[CODING_CATEGORY_LAST + 1]; + int coding_category_by_priority[CODING_CATEGORY_LAST]; #if defined(MULE) && !defined(UTF2000) Lisp_Object ucs_to_mule_table[65536]; @@ -65,7 +65,7 @@ struct file_coding_dump { } *fcd; static const struct lrecord_description fcd_description_1[] = { - { XD_LISP_OBJECT_ARRAY, offsetof (struct file_coding_dump, coding_category_system), CODING_CATEGORY_LAST + 1 }, + { XD_LISP_OBJECT_ARRAY, offsetof (struct file_coding_dump, coding_category_system), CODING_CATEGORY_LAST }, #if defined(MULE) && !defined(UTF2000) { XD_LISP_OBJECT_ARRAY, offsetof (struct file_coding_dump, ucs_to_mule_table), countof (fcd->ucs_to_mule_table) }, #endif @@ -197,8 +197,10 @@ static int detect_coding_big5 (struct detection_state *st, const Extbyte *src, size_t n); static void decode_coding_big5 (Lstream *decoding, const Extbyte *src, unsigned_char_dynarr *dst, size_t n); -static void encode_coding_big5 (Lstream *encoding, const Bufbyte *src, - unsigned_char_dynarr *dst, size_t n); +void char_encode_big5 (struct encoding_stream *str, Emchar c, + unsigned_char_dynarr *dst, unsigned int *flags); +void char_finish_big5 (struct encoding_stream *str, + unsigned_char_dynarr *dst, unsigned int *flags); static int detect_coding_ucs4 (struct detection_state *st, const Extbyte *src, size_t n); @@ -1465,7 +1467,7 @@ decode_coding_category (Lisp_Object symbol) int i; CHECK_SYMBOL (symbol); - for (i = 0; i <= CODING_CATEGORY_LAST; i++) + for (i = 0; i < CODING_CATEGORY_LAST; i++) if (EQ (coding_category_symbol[i], symbol)) return i; @@ -1481,7 +1483,7 @@ Return a list of all recognized coding categories. int i; Lisp_Object list = Qnil; - for (i = CODING_CATEGORY_LAST; i >= 0; i--) + for (i = CODING_CATEGORY_LAST - 1; i >= 0; i--) list = Fcons (coding_category_symbol[i], list); return list; } @@ -1495,13 +1497,13 @@ previously. */ (list)) { - int category_to_priority[CODING_CATEGORY_LAST + 1]; + int category_to_priority[CODING_CATEGORY_LAST]; int i, j; Lisp_Object rest; /* First generate a list that maps coding categories to priorities. */ - for (i = 0; i <= CODING_CATEGORY_LAST; i++) + for (i = 0; i < CODING_CATEGORY_LAST; i++) category_to_priority[i] = -1; /* Highest priority comes from the specified list. */ @@ -1518,7 +1520,7 @@ previously. /* Now go through the existing categories by priority to retrieve the categories not yet specified and preserve their priority order. */ - for (j = 0; j <= CODING_CATEGORY_LAST; j++) + for (j = 0; j < CODING_CATEGORY_LAST; j++) { int cat = fcd->coding_category_by_priority[j]; if (category_to_priority[cat] < 0) @@ -1528,7 +1530,7 @@ previously. /* Now we need to construct the inverse of the mapping we just constructed. */ - for (i = 0; i <= CODING_CATEGORY_LAST; i++) + for (i = 0; i < CODING_CATEGORY_LAST; i++) fcd->coding_category_by_priority[category_to_priority[i]] = i; /* Phew! That was confusing. */ @@ -1543,7 +1545,7 @@ Return a list of coding categories in descending order of priority. int i; Lisp_Object list = Qnil; - for (i = CODING_CATEGORY_LAST; i >= 0; i--) + for (i = CODING_CATEGORY_LAST - 1; i >= 0; i--) list = Fcons (coding_category_symbol[fcd->coding_category_by_priority[i]], list); return list; @@ -1793,7 +1795,7 @@ coding_system_from_mask (int mask) #endif /* Look through the coding categories by priority and find the first one that is allowed. */ - for (i = 0; i <= CODING_CATEGORY_LAST; i++) + for (i = 0; i < CODING_CATEGORY_LAST; i++) { cat = fcd->coding_category_by_priority[i]; if ((mask & (1 << cat)) && @@ -1991,7 +1993,7 @@ type. Optional arg BUFFER defaults to the current buffer. #ifdef MULE decst.mask = postprocess_iso2022_mask (decst.mask); #endif - for (i = CODING_CATEGORY_LAST; i >= 0; i--) + for (i = CODING_CATEGORY_LAST - 1; i >= 0; i--) { int sys = fcd->coding_category_by_priority[i]; if (decst.mask & (1 << sys)) @@ -2224,10 +2226,11 @@ COMPOSE_ADD_CHAR(struct decoding_stream *str, { if (CODING_SYSTEM_DISABLE_COMPOSITION (str->codesys)) DECODE_ADD_UCS_CHAR (character, dst); - else if (!CHAR_ID_TABLE_P (str->combining_table)) + else if (!CHAR_TABLEP (str->combining_table)) { Lisp_Object ret - = get_char_id_table (character, Vcharacter_composition_table); + = get_char_id_table (XCHAR_TABLE(Vcharacter_composition_table), + character); if (NILP (ret)) DECODE_ADD_UCS_CHAR (character, dst); @@ -2241,12 +2244,15 @@ COMPOSE_ADD_CHAR(struct decoding_stream *str, else { Lisp_Object ret - = get_char_id_table (character, str->combining_table); + = get_char_id_table (XCHAR_TABLE(str->combining_table), + character); if (CHARP (ret)) { Emchar char2 = XCHARVAL (ret); - ret = get_char_id_table (char2, Vcharacter_composition_table); + ret = + get_char_id_table (XCHAR_TABLE(Vcharacter_composition_table), + char2); if (NILP (ret)) { DECODE_ADD_UCS_CHAR (char2, dst); @@ -2260,7 +2266,7 @@ COMPOSE_ADD_CHAR(struct decoding_stream *str, str->combining_table = ret; } } - else if (CHAR_ID_TABLE_P (ret)) + else if (CHAR_TABLEP (ret)) { str->combined_chars[str->combined_char_count++] = character; str->combining_table = ret; @@ -2901,6 +2907,10 @@ reset_encoding_stream (struct encoding_stream *str) str->encode_char = &char_encode_shift_jis; str->finish = &char_finish_shift_jis; break; + case CODESYS_BIG5: + str->encode_char = &char_encode_big5; + str->finish = &char_finish_big5; + break; default: break; } @@ -3016,9 +3026,6 @@ mule_encode (Lstream *encoding, const Bufbyte *src, encode_coding_no_conversion (encoding, src, dst, n); break; #ifdef MULE - case CODESYS_BIG5: - encode_coding_big5 (encoding, src, dst, n); - break; case CODESYS_CCL: str->ccl.last_block = str->flags & CODING_STATE_END; /* When applying ccl program to stream, MUST NOT set NULL @@ -3619,66 +3626,71 @@ decode_coding_big5 (Lstream *decoding, const Extbyte *src, /* Convert internally-formatted data to Big5. */ -static void -encode_coding_big5 (Lstream *encoding, const Bufbyte *src, - unsigned_char_dynarr *dst, size_t n) +void +char_encode_big5 (struct encoding_stream *str, Emchar ch, + unsigned_char_dynarr *dst, unsigned int *flags) { -#ifndef UTF2000 - unsigned char c; - struct encoding_stream *str = ENCODING_STREAM_DATA (encoding); - unsigned int flags = str->flags; - unsigned int ch = str->ch; eol_type_t eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys); - while (n--) + if (ch == '\n') { - c = *src++; - if (c == '\n') - { - if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT) - Dynarr_add (dst, '\r'); - if (eol_type != EOL_CR) - Dynarr_add (dst, '\n'); - } - else if (BYTE_ASCII_P (c)) - { - /* ASCII. */ - Dynarr_add (dst, c); - } - else if (BUFBYTE_LEADING_BYTE_P (c)) + if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT) + Dynarr_add (dst, '\r'); + if (eol_type != EOL_CR) + Dynarr_add (dst, ch); + } + else + { +#ifdef UTF2000 + int code_point; + + if ((code_point = charset_code_point (Vcharset_ascii, ch)) >= 0) + Dynarr_add (dst, code_point); + else if ((code_point + = charset_code_point (Vcharset_chinese_big5, ch)) >= 0) { - if (c == LEADING_BYTE_CHINESE_BIG5_1 || - c == LEADING_BYTE_CHINESE_BIG5_2) - { - /* A recognized leading byte. */ - ch = c; - continue; /* not done with this character. */ - } - /* otherwise just ignore this character. */ + Dynarr_add (dst, code_point >> 8); + Dynarr_add (dst, code_point & 0xFF); } - else if (ch == LEADING_BYTE_CHINESE_BIG5_1 || - ch == LEADING_BYTE_CHINESE_BIG5_2) + else if ((code_point + = charset_code_point (Vcharset_chinese_big5_1, ch)) >= 0) { - /* Previous char was a recognized leading byte. */ - ch = (ch << 8) | c; - continue; /* not done with this character. */ + unsigned int I + = ((code_point >> 8) - 33) * (0xFF - 0xA1) + + ((code_point & 0xFF) - 33); + unsigned char b1 = I / BIG5_SAME_ROW + 0xA1; + unsigned char b2 = I % BIG5_SAME_ROW; + + b2 += b2 < 0x3F ? 0x40 : 0x62; + Dynarr_add (dst, b1); + Dynarr_add (dst, b2); } - else if (ch) + else if ((code_point + = charset_code_point (Vcharset_chinese_big5_2, ch)) >= 0) { - /* Encountering second byte of a Big5 character. */ + unsigned int I + = ((code_point >> 8) - 33) * (0xFF - 0xA1) + + ((code_point & 0xFF) - 33); unsigned char b1, b2; - ENCODE_BIG5 (ch >> 8, ch & 0xFF, c, b1, b2); + I += BIG5_SAME_ROW * (0xC9 - 0xA1); + b1 = I / BIG5_SAME_ROW + 0xA1; + b2 = I % BIG5_SAME_ROW; + b2 += b2 < 0x3F ? 0x40 : 0x62; Dynarr_add (dst, b1); Dynarr_add (dst, b2); } - - ch = 0; + else + Dynarr_add (dst, '?'); +#else +#endif } +} - str->flags = flags; - str->ch = ch; -#endif +void +char_finish_big5 (struct encoding_stream *str, unsigned_char_dynarr *dst, + unsigned int *flags) +{ } @@ -5787,10 +5799,10 @@ vars_of_file_coding (void) int i; fcd = xnew (struct file_coding_dump); - dumpstruct (&fcd, &fcd_description); + dump_add_root_struct_ptr (&fcd, &fcd_description); /* Initialize to something reasonable ... */ - for (i = 0; i <= CODING_CATEGORY_LAST; i++) + for (i = 0; i < CODING_CATEGORY_LAST; i++) { fcd->coding_category_system[i] = Qnil; fcd->coding_category_by_priority[i] = i; @@ -5854,7 +5866,7 @@ complex_vars_of_file_coding (void) make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ); the_codesys_prop_dynarr = Dynarr_new (codesys_prop); - dumpstruct (&the_codesys_prop_dynarr, &codesys_prop_dynarr_description); + dump_add_root_struct_ptr (&the_codesys_prop_dynarr, &codesys_prop_dynarr_description); #define DEFINE_CODESYS_PROP(Prop_Type, Sym) do \ { \ @@ -5930,7 +5942,7 @@ complex_vars_of_file_coding (void) #if defined(MULE) && !defined(UTF2000) { - unsigned int i; + size_t i; for (i = 0; i < countof (fcd->ucs_to_mule_table); i++) fcd->ucs_to_mule_table[i] = Qnil;