
/*
 * EUC-KR
 */

/* Specification: RFC 1557 */

static int
euc_kr_mbtowc (conv_t conv, wchar_t *pwc, const unsigned char *s, int n)
{
  unsigned char c = *s;
  /* Code set 0 (ASCII or KS C 5636-1993) */
  if (c < 0x80)
    return ascii_mbtowc(conv,pwc,s,n);
  /* Code set 1 (KS C 5601-1992) */
  if (c >= 0xa1 && c < 0xff) {
    if (n < 2)
      return RET_TOOFEW(0);
    {
      unsigned char c2 = s[1];
      if (c2 >= 0xa1 && c2 < 0xff) {
        unsigned char buf[2];
        buf[0] = c-0x80; buf[1] = c2-0x80;
        return ksc5601_mbtowc(conv,pwc,buf,2);
      } else
        return RET_ILSEQ;
    }
  }
  return RET_ILSEQ;
}

static int
euc_kr_wctomb (conv_t conv, unsigned char *r, wchar_t wc, int n)
{
  unsigned char buf[3];
  int ret;

  /* Code set 0 (ASCII or KS C 5636-1993) */
  ret = ascii_wctomb(conv,r,wc,n);
  if (ret != RET_ILSEQ)
    return ret;

  /* Code set 1 (KS C 5601-1992) */
  ret = ksc5601_wctomb(conv,buf,wc,2);
  if (ret != RET_ILSEQ) {
    if (ret != 2) abort();
    if (n < 2)
      return RET_TOOSMALL;
    r[0] = buf[0]+0x80;
    r[1] = buf[1]+0x80;
    return 2;
  }

  if (conv->transliterate) {
    /* Decompose Hangul into Jamo */
    ret = johab_hangul_decompose(conv,buf,wc);
    if (ret != RET_ILSEQ) {
      int i;
      if (n < 2*ret)
        return RET_TOOSMALL;
      for (i = 0; i < ret; i++) {
        r[0] = 0xa4;
        r[1] = 0xa0+buf[i];
        r += 2;
      }
      return 2*ret;
    }
  }

  return RET_ILSEQ;
}
