Function: decode-sjis-char
decode-sjis-char is a function defined in coding.c.
Signature
(decode-sjis-char CODE)
Documentation
Decode a Japanese character which has CODE in shift_jis encoding.
Return the corresponding character.
Source Code
// Defined in /usr/src/emacs/src/coding.c
{
Lisp_Object spec, attrs, val;
struct charset *charset_roman, *charset_kanji, *charset_kana, *charset;
EMACS_INT ch;
int c;
CHECK_FIXNAT (code);
ch = XFIXNAT (code);
CHECK_CODING_SYSTEM_GET_SPEC (Vsjis_coding_system, spec);
attrs = AREF (spec, 0);
if (ASCII_CHAR_P (ch)
&& ! NILP (CODING_ATTR_ASCII_COMPAT (attrs)))
return code;
val = CODING_ATTR_CHARSET_LIST (attrs);
charset_roman = CHARSET_FROM_ID (XFIXNUM (XCAR (val))), val = XCDR (val);
charset_kana = CHARSET_FROM_ID (XFIXNUM (XCAR (val))), val = XCDR (val);
charset_kanji = CHARSET_FROM_ID (XFIXNUM (XCAR (val)));
if (ch <= 0x7F)
{
c = ch;
charset = charset_roman;
}
else if (ch >= 0xA0 && ch < 0xDF)
{
c = ch - 0x80;
charset = charset_kana;
}
else
{
EMACS_INT c1 = ch >> 8;
int c2 = ch & 0xFF;
if (c1 < 0x81 || (c1 > 0x9F && c1 < 0xE0) || c1 > 0xEF
|| c2 < 0x40 || c2 == 0x7F || c2 > 0xFC)
error ("Invalid code: %"pI"d", ch);
c = ch;
SJIS_TO_JIS (c);
charset = charset_kanji;
}
c = DECODE_CHAR (charset, c);
if (c < 0)
error ("Invalid code: %"pI"d", ch);
return make_fixnum (c);
}