X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=9829e9520024096ac111807db31f9c3ea811e6fd;hb=92f1cdbb5e6da16bde918d79cf9a660055bd4441;hp=7c873a8e9c2f8ca81aaf45d1409ade6861b80861;hpb=3648cddb72b844beb5acbf38ec88f6768600c0ea;p=chise%2Fxemacs-chise.git- diff --git a/src/char-ucs.h b/src/char-ucs.h index 7c873a8..9829e95 100644 --- a/src/char-ucs.h +++ b/src/char-ucs.h @@ -20,59 +20,53 @@ Boston, MA 02111-1307, USA. */ /* Rewritten by MORIOKA Tomohiko . */ -#ifndef _XEMACS_CHAR_UCS_H -#define _XEMACS_CHAR_UCS_H +#ifndef INCLUDED_char_ucs_h_ +#define INCLUDED_char_ucs_h_ #define valid_char_p(ch) 1 #define CHAR_ASCII_P(ch) ((ch) <= 0x7F) -DECLARE_LRECORD (char_byte_table, struct Lisp_Char_Byte_Table); -#define XCHAR_BYTE_TABLE(x) \ - XRECORD (x, char_byte_table, struct Lisp_Char_Byte_Table) -#define XSETCHAR_BYTE_TABLE(x, p) XSETRECORD (x, p, char_byte_table) -#define CHAR_BYTE_TABLE_P(x) RECORDP (x, char_byte_table) -#define GC_CHAR_BYTE_TABLE_P(x) GC_RECORDP (x, char_byte_table) -/* #define CHECK_CHAR_BYTE_TABLE(x) CHECK_RECORD (x, char_byte_table) - char table entries should never escape to Lisp */ - -struct Lisp_Char_Byte_Table +struct Lisp_Byte_Table { struct lcrecord_header header; Lisp_Object property[256]; }; - - -DECLARE_LRECORD (char_code_table, struct Lisp_Char_Code_Table); -#define XCHAR_CODE_TABLE(x) \ - XRECORD (x, char_code_table, struct Lisp_Char_Code_Table) -#define XSETCHAR_CODE_TABLE(x, p) XSETRECORD (x, p, char_code_table) -#define CHAR_CODE_TABLE_P(x) RECORDP (x, char_code_table) -#define GC_CHAR_CODE_TABLE_P(x) GC_RECORDP (x, char_code_table) -/* #define CHECK_CHAR_CODE_TABLE(x) CHECK_RECORD (x, char_code_table) +typedef struct Lisp_Byte_Table Lisp_Byte_Table; + +DECLARE_LRECORD (byte_table, Lisp_Byte_Table); +#define XBYTE_TABLE(x) XRECORD (x, byte_table, Lisp_Byte_Table) +#define XSETBYTE_TABLE(x, p) XSETRECORD (x, p, byte_table) +#define BYTE_TABLE_P(x) RECORDP (x, byte_table) +#define GC_BYTE_TABLE_P(x) GC_RECORDP (x, byte_table) +/* #define CHECK_BYTE_TABLE(x) CHECK_RECORD (x, byte_table) char table entries should never escape to Lisp */ -struct Lisp_Char_Code_Table + +struct Lisp_Char_ID_Table { struct lcrecord_header header; Lisp_Object table; }; +typedef struct Lisp_Char_ID_Table Lisp_Char_ID_Table; + +DECLARE_LRECORD (char_id_table, Lisp_Char_ID_Table); +#define XCHAR_ID_TABLE(x) XRECORD (x, char_id_table, Lisp_Char_ID_Table) +#define XSETCHAR_ID_TABLE(x, p) XSETRECORD (x, p, char_id_table) +#define CHAR_ID_TABLE_P(x) RECORDP (x, char_id_table) +#define GC_CHAR_ID_TABLE_P(x) GC_RECORDP (x, char_id_table) +/* #define CHECK_CHAR_ID_TABLE(x) CHECK_RECORD (x, char_id_table) + char table entries should never escape to Lisp */ + -Lisp_Object get_char_code_table (Emchar ch, Lisp_Object table); +Lisp_Object get_char_id_table (Emchar ch, Lisp_Object table); -extern Lisp_Object Vcharset_ucs; -extern Lisp_Object Vcharset_ucs_bmp; +extern Lisp_Object Vcharset_mojikyo; extern Lisp_Object Vcharset_latin_jisx0201; -extern Lisp_Object Vcharset_latin_iso8859_2; -extern Lisp_Object Vcharset_latin_iso8859_3; -extern Lisp_Object Vcharset_latin_iso8859_4; -extern Lisp_Object Vcharset_latin_iso8859_9; -extern Lisp_Object Vcharset_latin_viscii_lower; -extern Lisp_Object Vcharset_latin_viscii_upper; /************************************************************************/ @@ -256,7 +250,10 @@ struct Lisp_Charset int id; Lisp_Object name; - Lisp_Object doc_string, registry, short_name, long_name; + Lisp_Object doc_string; + Lisp_Object registry; + Lisp_Object short_name; + Lisp_Object long_name; Lisp_Object reverse_direction_charset; @@ -293,9 +290,10 @@ struct Lisp_Charset /* Offset for each byte */ Emchar byte_offset; }; +typedef struct Lisp_Charset Lisp_Charset; -DECLARE_LRECORD (charset, struct Lisp_Charset); -#define XCHARSET(x) XRECORD (x, charset, struct Lisp_Charset) +DECLARE_LRECORD (charset, Lisp_Charset); +#define XCHARSET(x) XRECORD (x, charset, Lisp_Charset) #define XSETCHARSET(x, p) XSETRECORD (x, p, charset) #define CHARSETP(x) RECORDP (x, charset) #define GC_CHARSETP(x) GC_RECORDP (x, charset) @@ -364,6 +362,8 @@ struct charset_lookup { /* Table of charsets indexed by type/final-byte/direction. */ Lisp_Object charset_by_attributes[4][128]; + + Charset_ID next_allocated_leading_byte; }; extern struct charset_lookup *chlook; @@ -372,8 +372,8 @@ extern struct charset_lookup *chlook; /* int not Bufbyte even though that is the actual type of a leading byte. This way, out-ot-range values will get caught rather than automatically truncated. */ -INLINE Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb); -INLINE Lisp_Object +INLINE_HEADER Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb); +INLINE_HEADER Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb) { assert (lb >= MIN_LEADING_BYTE && @@ -428,7 +428,8 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb) #define MIN_CHAR_MOJIKYO 0xE00000 #define MIN_CHAR_DAIKANWA MIN_CHAR_MOJIKYO #define MAX_CHAR_DAIKANWA 0xE0FFFF -#define MAX_CHAR_MOJIKYO 0xE9093F +/* #define MAX_CHAR_MOJIKYO 0xE9093F */ +#define MAX_CHAR_MOJIKYO (MIN_CHAR_MOJIKYO + 94 * 60 * 22) #define MIN_CHAR_94 0xE90940 #define MAX_CHAR_94 (MIN_CHAR_94 + 94 * 80 - 1) @@ -445,8 +446,8 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb) Emchar make_builtin_char (Lisp_Object charset, int c1, int c2); -INLINE Emchar DECODE_CHAR (Lisp_Object charset, int code_point); -INLINE Emchar +INLINE_HEADER Emchar DECODE_CHAR (Lisp_Object charset, int code_point); +INLINE_HEADER Emchar DECODE_CHAR (Lisp_Object charset, int code_point) { int dim = XCHARSET_DIMENSION (charset); @@ -474,14 +475,43 @@ DECODE_CHAR (Lisp_Object charset, int code_point) if (XCHARSET_DIMENSION (charset) == 1) return make_builtin_char (charset, code_point, 0); else - return make_builtin_char (charset, code_point >> 8, code_point & 255); + { + int plane = LEADING_BYTE_MOJIKYO_PJ_1 - XCHARSET_ID (charset); + + if ( (0 <= plane) && (plane <= 21) ) + { + int c1 = code_point >> 8; + int c2 = code_point & 255; + + if (c1 < 16 + 32) + return ' '; + else if (c1 < 16 + 32 + 30) + return DECODE_CHAR (Vcharset_mojikyo, + plane * (94 * 60) + + (c1 - (16 + 32)) * 94 + + (c2 - 33) + + 1); + else if (c1 < 18 + 32 + 30) + return ' '; + else if (c1 < 18 + 32 + 60) + return DECODE_CHAR (Vcharset_mojikyo, + plane * (94 * 60) + + (c1 - (18 + 32)) * 94 + + (c2 - 33) + + 1); + else + return ' '; + } + else + return make_builtin_char (charset, code_point >> 8, code_point & 255); + } } /* Return a character whose charset is CHARSET and position-codes are C1 and C2. TYPE9N character ignores C2. */ -INLINE Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2); -INLINE Emchar +INLINE_HEADER Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2); +INLINE_HEADER Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2) { if (XCHARSET_DIMENSION (charset) == 1) @@ -495,11 +525,11 @@ extern Lisp_Object Vcharacter_attribute_table; int encode_builtin_char_1 (Emchar c, Lisp_Object* charset); int range_charset_code_point (Lisp_Object charset, Emchar ch); -INLINE int charset_code_point (Lisp_Object charset, Emchar ch); -INLINE int +INLINE_HEADER int charset_code_point (Lisp_Object charset, Emchar ch); +INLINE_HEADER int charset_code_point (Lisp_Object charset, Emchar ch) { - Lisp_Object cdef = get_char_code_table (ch, Vcharacter_attribute_table); + Lisp_Object cdef = get_char_id_table (ch, Vcharacter_attribute_table); if (!NILP (cdef)) { @@ -514,11 +544,11 @@ charset_code_point (Lisp_Object charset, Emchar ch) extern Lisp_Object Vdefault_coded_charset_priority_list; EXFUN (Ffind_charset, 1); -INLINE int encode_char_1 (Emchar c, Lisp_Object* charset); -INLINE int +INLINE_HEADER int encode_char_1 (Emchar c, Lisp_Object* charset); +INLINE_HEADER int encode_char_1 (Emchar c, Lisp_Object* charset) { - Lisp_Object cdef = get_char_code_table (c, Vcharacter_attribute_table); + Lisp_Object cdef = get_char_id_table (c, Vcharacter_attribute_table); if (!EQ (cdef, Qnil)) { @@ -527,11 +557,11 @@ encode_char_1 (Emchar c, Lisp_Object* charset) while (!EQ (charsets, Qnil)) { - int code_point; - *charset = Ffind_charset (Fcar (charsets)); if (!EQ (*charset, Qnil)) { + int code_point; + if (!NILP (field = Fassq (*charset, cdef))) return XINT (Fcdr (field)); else if ((code_point @@ -546,13 +576,40 @@ encode_char_1 (Emchar c, Lisp_Object* charset) return encode_builtin_char_1 (c, charset); } -#define ENCODE_CHAR(ch, charset) encode_char_1 (ch, &(charset)) +INLINE_HEADER int encode_char_2 (Emchar ch, Lisp_Object* charset); +INLINE_HEADER int +encode_char_2 (Emchar ch, Lisp_Object* charset) +{ + int code_point = encode_char_1 (ch, charset); -INLINE void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2); -INLINE void + if (EQ (*charset, Vcharset_mojikyo)) + { + int plane, byte1, byte2; + + code_point--; + plane = code_point / (94 * 60); + byte1 = (code_point % (94 * 60)) / 94; + if (byte1 < 30) + byte1 += 16 + 32; + else + byte1 += 18 + 32; + byte2 = code_point % 94 + 33; + *charset + = CHARSET_BY_LEADING_BYTE (LEADING_BYTE_MOJIKYO_PJ_1 - plane); + return (byte1 << 8) | byte2; + } + else + return code_point; +} + +#define ENCODE_CHAR(ch, charset) encode_char_2 (ch, &(charset)) + +INLINE_HEADER void +breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2); +INLINE_HEADER void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) { - int code_point = encode_char_1 (c, charset); + int code_point = encode_char_2 (c, charset); if (code_point >= 0) { @@ -577,14 +634,13 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) #define BREAKUP_CHAR(ch, charset, b1, b2) \ breakup_char_1 (ch, &(charset), &(b1), &(b2)) -INLINE Lisp_Object CHAR_CHARSET (Emchar ch); -INLINE Lisp_Object +INLINE_HEADER Lisp_Object CHAR_CHARSET (Emchar ch); +INLINE_HEADER Lisp_Object CHAR_CHARSET (Emchar ch) { Lisp_Object charset; - int b1, b2; - - BREAKUP_CHAR(ch, charset, b1, b2); + + ENCODE_CHAR (ch, charset); return charset; } @@ -603,4 +659,4 @@ extern Lisp_Object Vcharset_chinese_big5_2; extern Lisp_Object Vcharset_japanese_jisx0208; extern Lisp_Object Vcharset_japanese_jisx0212; -#endif /* _XEMACS_CHAR_UCS_H */ +#endif /* INCLUDED_char_ucs_h_ */