#define MIN_CHAR_HALFWIDTH_KATAKANA 0xFF61
#define MAX_CHAR_HALFWIDTH_KATAKANA 0xFF9F
+#define MIN_CHAR_OBS_94x94 0xE00000
+#define MAX_CHAR_OBS_94x94 (0xE00000 + 94 * 94 * 14 - 1)
+
#define MIN_CHAR_94 0xE90940
#define MAX_CHAR_94 (MIN_CHAR_94 + 94 * 80 - 1)
#define MIN_CHAR_96 (MIN_CHAR_94 + 94 * 80)
MAKE_CHAR (Lisp_Object charset, int c1, int c2)
{
Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (charset);
- int idx;
+ int ofs, idx;
Lisp_Object ch;
if (!EQ (decoding_table, Qnil)
- && (0 <= (idx = c1 - (XCHARSET_CHARS (charset) == 94 ? 33 : 32)))
+ && (0 <= (idx =
+ c1 - (ofs = (XCHARSET_CHARS (charset) == 94 ? 33 : 32))))
&& (idx < XVECTOR_LENGTH (decoding_table))
&& !EQ (ch = XVECTOR_DATA(decoding_table)[idx], Qnil))
- return XCHAR (ch);
- else if (EQ (charset, Vcharset_katakana_jisx0201))
+ {
+ if (VECTORP (ch))
+ {
+ if ((0 <= (idx = c2 - ofs))
+ && (idx < XVECTOR_LENGTH (ch))
+ && !EQ (ch = XVECTOR_DATA(ch)[idx], Qnil))
+ return XCHAR (ch);
+ }
+ else
+ return XCHAR (ch);
+ }
+ if (EQ (charset, Vcharset_katakana_jisx0201))
if (c1 < 0x60)
return c1 + MIN_CHAR_HALFWIDTH_KATAKANA - 33;
else
/* return MIN_CHAR_94 + ('I' - '0') * 94 + (c1 - 33); */
return ' ';
else if (XCHARSET_UCS_MAX (charset))
- return (XCHARSET_DIMENSION (charset) == 1
- ?
- c1 - XCHARSET_BYTE_OFFSET (charset)
- :
- (c1 - XCHARSET_BYTE_OFFSET (charset)) * XCHARSET_CHARS (charset)
- + c2 - XCHARSET_BYTE_OFFSET (charset))
- - XCHARSET_CODE_OFFSET (charset) + XCHARSET_UCS_MIN (charset);
+ {
+ Emchar code
+ = (XCHARSET_DIMENSION (charset) == 1
+ ?
+ c1 - XCHARSET_BYTE_OFFSET (charset)
+ :
+ (c1 - XCHARSET_BYTE_OFFSET (charset)) * XCHARSET_CHARS (charset)
+ + c2 - XCHARSET_BYTE_OFFSET (charset))
+ - XCHARSET_CODE_OFFSET (charset) + XCHARSET_UCS_MIN (charset);
+ if ((code < XCHARSET_UCS_MIN (charset))
+ || (XCHARSET_UCS_MAX (charset) < code))
+ signal_simple_error ("Arguments makes invalid character",
+ make_char (code));
+ return code;
+ }
else if (XCHARSET_DIMENSION (charset) == 1)
{
switch (XCHARSET_CHARS (charset))
INLINE void
breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2)
{
- if (c < MIN_CHAR_94)
+ if (c < MIN_CHAR_OBS_94x94)
{
Lisp_Object charsets = Vdefault_coded_charset_priority_list;
while (!EQ (charsets, Qnil))
*c2 = c & 0xff;
}
}
+ else if (c <= MAX_CHAR_OBS_94x94)
+ {
+ *charset
+ = CHARSET_BY_ATTRIBUTES (CHARSET_TYPE_94X94,
+ ((c - MIN_CHAR_OBS_94x94) / (94 * 94)) + '@',
+ CHARSET_LEFT_TO_RIGHT);
+ *c1 = (((c - MIN_CHAR_OBS_94x94) / 94) % 94) + 33;
+ *c2 = ((c - MIN_CHAR_OBS_94x94) % 94) + 33;
+ }
else if (c <= MAX_CHAR_94)
{
*charset