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);
}