Blame iconvdata/johab.c

Packit Service 82fcde
/* Mapping tables for JOHAB handling.
Packit Service 82fcde
   Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
   Contributed by Jungshik Shin <jshin@pantheon.yale.edu>
Packit Service 82fcde
   and Ulrich Drepper <drepper@cygnus.com>, 1998.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <dlfcn.h>
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#include <ksc5601.h>
Packit Service 82fcde
Packit Service 82fcde
/* The table for Bit pattern to Hangul Jamo
Packit Service 82fcde
   5 bits each are used to encode
Packit Service 82fcde
   leading consonants(19 + 1 filler), medial vowels(21 + 1 filler)
Packit Service 82fcde
   and trailing consonants(27 + 1 filler).
Packit Service 82fcde
Packit Service 82fcde
   KS C 5601-1992 Annex 3 Table 2
Packit Service 82fcde
   0 : Filler, -1: invalid, >= 1 : valid
Packit Service 82fcde
Packit Service 82fcde
 */
Packit Service 82fcde
static const int init[32] =
Packit Service 82fcde
{
Packit Service 82fcde
  -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
Packit Service 82fcde
  19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
Packit Service 82fcde
};
Packit Service 82fcde
static const int mid[32] =
Packit Service 82fcde
{
Packit Service 82fcde
  -1, -1, 0, 1, 2, 3, 4, 5,
Packit Service 82fcde
  -1, -1, 6, 7, 8, 9, 10, 11,
Packit Service 82fcde
  -1, -1, 12, 13, 14, 15, 16, 17,
Packit Service 82fcde
  -1, -1, 18, 19, 20, 21, -1, -1
Packit Service 82fcde
};
Packit Service 82fcde
static const int final[32] =
Packit Service 82fcde
{
Packit Service 82fcde
  -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
Packit Service 82fcde
  -1, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
   Hangul Jamo in Johab to Unicode 2.0 : Unicode 2.0
Packit Service 82fcde
   defines 51 Hangul Compatibility Jamos in the block [0x3131,0x314e]
Packit Service 82fcde
Packit Service 82fcde
   It's to be considered later which Jamo block to use, Compatibility
Packit Service 82fcde
   block [0x3131,0x314e] or Hangul Conjoining Jamo block, [0x1100,0x11ff]
Packit Service 82fcde
Packit Service 82fcde
 */
Packit Service 82fcde
static const uint32_t init_to_ucs[19] =
Packit Service 82fcde
{
Packit Service 82fcde
  0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142,
Packit Service 82fcde
  0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b,
Packit Service 82fcde
  0x314c, 0x314d, 0x314e
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static const uint32_t final_to_ucs[31] =
Packit Service 82fcde
{
Packit Service 82fcde
  L'\0', L'\0', 0x3133, L'\0', 0x3135, 0x3136, L'\0', L'\0',
Packit Service 82fcde
  0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f,
Packit Service 82fcde
  0x3140, L'\0', L'\0', 0x3144, L'\0', L'\0', L'\0', L'\0',
Packit Service 82fcde
  L'\0', L'\0', L'\0', L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/* The following three arrays are used to convert
Packit Service 82fcde
   precomposed Hangul syllables in [0xac00,0xd???]
Packit Service 82fcde
   to Jamo bit patterns for Johab encoding
Packit Service 82fcde
Packit Service 82fcde
   cf. : KS C 5601-1992, Annex3 Table 2
Packit Service 82fcde
Packit Service 82fcde
   Arrays are used to speed up things although it's possible
Packit Service 82fcde
   to get the same result arithmetically.
Packit Service 82fcde
Packit Service 82fcde
 */
Packit Service 82fcde
static const int init_to_bit[19] =
Packit Service 82fcde
{
Packit Service 82fcde
  0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00,
Packit Service 82fcde
  0xa000, 0xa400, 0xa800, 0xac00, 0xb000, 0xb400,
Packit Service 82fcde
  0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00,
Packit Service 82fcde
  0xd000
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static const int mid_to_bit[21] =
Packit Service 82fcde
{
Packit Service 82fcde
	  0x0060, 0x0080, 0x00a0, 0x00c0, 0x00e0,
Packit Service 82fcde
  0x0140, 0x0160, 0x0180, 0x01a0, 0x01c0, 0x1e0,
Packit Service 82fcde
  0x0240, 0x0260, 0x0280, 0x02a0, 0x02c0, 0x02e0,
Packit Service 82fcde
  0x0340, 0x0360, 0x0380, 0x03a0
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static const int final_to_bit[28] =
Packit Service 82fcde
{
Packit Service 82fcde
  1, 2, 3, 4, 5, 6, 7, 8, 9, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
Packit Service 82fcde
  0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/* The conversion table from
Packit Service 82fcde
   UCS4 Hangul Compatibility Jamo in [0x3131,0x3163]
Packit Service 82fcde
   to Johab
Packit Service 82fcde
Packit Service 82fcde
   cf. 1. KS C 5601-1992 Annex 3 Table 2
Packit Service 82fcde
   2. Unicode 2.0 manual
Packit Service 82fcde
Packit Service 82fcde
 */
Packit Service 82fcde
static const uint16_t jamo_from_ucs_table[51] =
Packit Service 82fcde
{
Packit Service 82fcde
  0x8841, 0x8c41,
Packit Service 82fcde
  0x8444,
Packit Service 82fcde
  0x9041,
Packit Service 82fcde
  0x8446, 0x8447,
Packit Service 82fcde
  0x9441, 0x9841, 0x9c41,
Packit Service 82fcde
  0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450,
Packit Service 82fcde
  0xa041, 0xa441, 0xa841,
Packit Service 82fcde
  0x8454,
Packit Service 82fcde
  0xac41, 0xb041, 0xb441, 0xb841, 0xbc41,
Packit Service 82fcde
  0xc041, 0xc441, 0xc841, 0xcc41, 0xd041,
Packit Service 82fcde
  0x8461, 0x8481, 0x84a1, 0x84c1, 0x84e1,
Packit Service 82fcde
  0x8541, 0x8561, 0x8581, 0x85a1, 0x85c1, 0x85e1,
Packit Service 82fcde
  0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1,
Packit Service 82fcde
  0x8741, 0x8761, 0x8781, 0x87a1
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
static uint32_t
Packit Service 82fcde
johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
Packit Service 82fcde
{
Packit Service 82fcde
  if (idx <= 0xdefe)
Packit Service 82fcde
    return (uint32_t) __ksc5601_sym_to_ucs[(c1 - 0xd9) * 188 + c2
Packit Service 82fcde
					   - (c2 > 0x90 ? 0x43 : 0x31)];
Packit Service 82fcde
  else
Packit Service 82fcde
    return (uint32_t) __ksc5601_hanja_to_ucs[(c1 - 0xe0) * 188 + c2
Packit Service 82fcde
					     - (c2 > 0x90 ? 0x43 : 0x31)];
Packit Service 82fcde
}
Packit Service 82fcde
/* Definitions used in the body of the `gconv' function.  */
Packit Service 82fcde
#define CHARSET_NAME		"JOHAB//"
Packit Service 82fcde
#define FROM_LOOP		from_johab
Packit Service 82fcde
#define TO_LOOP			to_johab
Packit Service 82fcde
#define DEFINE_INIT		1
Packit Service 82fcde
#define DEFINE_FINI		1
Packit Service 82fcde
#define MIN_NEEDED_FROM		1
Packit Service 82fcde
#define MAX_NEEDED_FROM		2
Packit Service 82fcde
#define MIN_NEEDED_TO		4
Packit Service 82fcde
#define ONE_DIRECTION		0
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* First define the conversion function from JOHAB to UCS4.  */
Packit Service 82fcde
#define MIN_NEEDED_INPUT	MIN_NEEDED_FROM
Packit Service 82fcde
#define MAX_NEEDED_INPUT	MAX_NEEDED_FROM
Packit Service 82fcde
#define MIN_NEEDED_OUTPUT	MIN_NEEDED_TO
Packit Service 82fcde
#define LOOPFCT			FROM_LOOP
Packit Service 82fcde
#define BODY \
Packit Service 82fcde
  {									      \
Packit Service 82fcde
    uint32_t ch = *inptr;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
    if (ch <= 0x7f)							      \
Packit Service 82fcde
      {									      \
Packit Service 82fcde
	/* Plain ISO646-KR.  */						      \
Packit Service 82fcde
	if (ch == 0x5c)							      \
Packit Service 82fcde
	  ch = 0x20a9; /* half-width Korean Currency WON sign */	      \
Packit Service 82fcde
	++inptr;							      \
Packit Service 82fcde
      }									      \
Packit Service 82fcde
    /* Johab : 1. Hangul						      \
Packit Service 82fcde
       1st byte : 0x84-0xd3						      \
Packit Service 82fcde
       2nd byte : 0x41-0x7e, 0x81-0xfe					      \
Packit Service 82fcde
       2. Hanja & Symbol  :						      \
Packit Service 82fcde
       1st byte : 0xd8-0xde, 0xe0-0xf9					      \
Packit Service 82fcde
       2nd byte : 0x31-0x7e, 0x91-0xfe					      \
Packit Service 82fcde
       0xd831-0xd87e and 0xd891-0xd8fe are user-defined area */		      \
Packit Service 82fcde
    else								      \
Packit Service 82fcde
      {									      \
Packit Service 82fcde
	if (__builtin_expect (ch > 0xf9, 0)				      \
Packit Service 82fcde
	    || __builtin_expect (ch == 0xdf, 0)				      \
Packit Service 82fcde
	    || (__builtin_expect (ch > 0x7e, 0) && ch < 0x84)		      \
Packit Service 82fcde
	    || (__builtin_expect (ch > 0xd3, 0) && ch < 0xd9))		      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* These are illegal.  */					      \
Packit Service 82fcde
	    STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
	else								      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* Two-byte character.  First test whether the next		      \
Packit Service 82fcde
	       character is also available.  */				      \
Packit Service 82fcde
	    uint32_t ch2;						      \
Packit Service 82fcde
	    uint_fast32_t idx;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    if (__glibc_unlikely (inptr + 1 >= inend))			      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		/* The second character is not available.  Store the	      \
Packit Service 82fcde
		   intermediate result.  */				      \
Packit Service 82fcde
		result = __GCONV_INCOMPLETE_INPUT;			      \
Packit Service 82fcde
		break;							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    ch2 = inptr[1];						      \
Packit Service 82fcde
	    idx = ch * 256 + ch2;					      \
Packit Service 82fcde
	    if (__glibc_likely (ch <= 0xd3))				      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		/* Hangul */						      \
Packit Service 82fcde
		int_fast32_t i, m, f;					      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		i = init[(idx & 0x7c00) >> 10];				      \
Packit Service 82fcde
		m = mid[(idx & 0x03e0) >> 5];				      \
Packit Service 82fcde
		f = final[idx & 0x001f];				      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		if (__builtin_expect (i == -1, 0)			      \
Packit Service 82fcde
		    || __builtin_expect (m == -1, 0)			      \
Packit Service 82fcde
		    || __builtin_expect (f == -1, 0))			      \
Packit Service 82fcde
		  {							      \
Packit Service 82fcde
		    /* This is illegal.  */				      \
Packit Service 82fcde
		    STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
Packit Service 82fcde
		  }							      \
Packit Service 82fcde
		else if (i > 0 && m > 0)				      \
Packit Service 82fcde
		  ch = ((i - 1) * 21 + (m - 1)) * 28 + f + 0xac00;	      \
Packit Service 82fcde
		else if (i > 0 && m == 0 && f == 0)			      \
Packit Service 82fcde
		  ch = init_to_ucs[i - 1];				      \
Packit Service 82fcde
		else if (i == 0 && m > 0 && f == 0)			      \
Packit Service 82fcde
		  ch = 0x314e + m;	/* 0x314f + m - 1 */		      \
Packit Service 82fcde
		else if (__builtin_expect ((i | m) == 0, 1)		      \
Packit Service 82fcde
			 && __builtin_expect (f > 0, 1))		      \
Packit Service 82fcde
		  ch = final_to_ucs[f - 1];	/* round trip?? */	      \
Packit Service 82fcde
		else							      \
Packit Service 82fcde
		  {							      \
Packit Service 82fcde
		    /* This is illegal.  */				      \
Packit Service 82fcde
		    STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
Packit Service 82fcde
		  }							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
	    else							      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		if (__builtin_expect (ch2 < 0x31, 0)			      \
Packit Service 82fcde
		    || (__builtin_expect (ch2 > 0x7e, 0) && ch2 < 0x91)	      \
Packit Service 82fcde
		    || __builtin_expect (ch2, 0) == 0xff		      \
Packit Service 82fcde
		    || (__builtin_expect (ch, 0) == 0xd9 && ch2 > 0xe8)	      \
Packit Service 82fcde
		    || (__builtin_expect (ch, 0) == 0xda		      \
Packit Service 82fcde
			&& ch2 > 0xa0 && ch2 < 0xd4)			      \
Packit Service 82fcde
		    || (__builtin_expect (ch, 0) == 0xde && ch2 > 0xf1))      \
Packit Service 82fcde
		  {							      \
Packit Service 82fcde
		    /* This is illegal.  */				      \
Packit Service 82fcde
		    STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
Packit Service 82fcde
		  }							      \
Packit Service 82fcde
		else							      \
Packit Service 82fcde
		  {							      \
Packit Service 82fcde
		    ch = johab_sym_hanja_to_ucs (idx, ch, ch2);		      \
Packit Service 82fcde
		    /* if (idx <= 0xdefe)				      \
Packit Service 82fcde
			 ch = __ksc5601_sym_to_ucs[(ch - 0xd9) * 192	      \
Packit Service 82fcde
						   + ch2 - (ch2 > 0x90	      \
Packit Service 82fcde
							    ? 0x43 : 0x31)];  \
Packit Service 82fcde
		       else						      \
Packit Service 82fcde
			 ch = __ksc5601_hanja_to_ucs[(ch - 0xe0) *192	      \
Packit Service 82fcde
						     + ch2 -  (ch2 > 0x90     \
Packit Service 82fcde
							       ?0x43 : 0x31)];\
Packit Service 82fcde
		    */							      \
Packit Service 82fcde
		  }							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	if (__glibc_unlikely (ch == 0))					      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* This is an illegal character.  */			      \
Packit Service 82fcde
	    STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	inptr += 2;							      \
Packit Service 82fcde
      }									      \
Packit Service 82fcde
									      \
Packit Service 82fcde
    put32 (outptr, ch);							      \
Packit Service 82fcde
    outptr += 4;							      \
Packit Service 82fcde
  }
Packit Service 82fcde
#define LOOP_NEED_FLAGS
Packit Service 82fcde
#define ONEBYTE_BODY \
Packit Service 82fcde
  {									      \
Packit Service 82fcde
    if (c <= 0x7f)							      \
Packit Service 82fcde
      return (c == 0x5c ? 0x20a9 : c);					      \
Packit Service 82fcde
    else								      \
Packit Service 82fcde
      return WEOF;							      \
Packit Service 82fcde
  }
Packit Service 82fcde
#include <iconv/loop.c>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Next, define the other direction.  */
Packit Service 82fcde
#define MIN_NEEDED_INPUT	MIN_NEEDED_TO
Packit Service 82fcde
#define MIN_NEEDED_OUTPUT	MIN_NEEDED_FROM
Packit Service 82fcde
#define MAX_NEEDED_OUTPUT	MAX_NEEDED_FROM
Packit Service 82fcde
#define LOOPFCT			TO_LOOP
Packit Service 82fcde
#define BODY \
Packit Service 82fcde
  {									      \
Packit Service 82fcde
    uint32_t ch = get32 (inptr);					      \
Packit Service 82fcde
    /*									      \
Packit Service 82fcde
       if (ch >= (sizeof (from_ucs4_lat1) / sizeof (from_ucs4_lat1[0])))      \
Packit Service 82fcde
	 {								      \
Packit Service 82fcde
	   if (ch >= 0x0391 && ch <= 0x0451)				      \
Packit Service 82fcde
	     cp = from_ucs4_greek[ch - 0x391];				      \
Packit Service 82fcde
	   else if (ch >= 0x2010 && ch <= 0x9fa0)			      \
Packit Service 82fcde
	     cp = from_ucs4_cjk[ch - 0x02010];				      \
Packit Service 82fcde
	   else								      \
Packit Service 82fcde
	     break;							      \
Packit Service 82fcde
	 }								      \
Packit Service 82fcde
       else								      \
Packit Service 82fcde
	 cp = from_ucs4_lat1[ch];					      \
Packit Service 82fcde
    */									      \
Packit Service 82fcde
									      \
Packit Service 82fcde
    if (ch <= 0x7f && ch != 0x5c)					      \
Packit Service 82fcde
      *outptr++ = ch;							      \
Packit Service 82fcde
    else								      \
Packit Service 82fcde
      {									      \
Packit Service 82fcde
	if (ch >= 0xac00 && ch <= 0xd7a3)				      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    if (__glibc_unlikely (outptr + 2 > outend))			      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		result = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
		break;							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    ch -= 0xac00;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    ch = (init_to_bit[ch / 588]	  /* 21 * 28 = 588 */		      \
Packit Service 82fcde
		  + mid_to_bit[(ch / 28) % 21]/* (ch % (21 * 28)) / 28 */     \
Packit Service 82fcde
		  + final_to_bit[ch %  28]);  /* (ch % (21 * 28)) % 28 */     \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    *outptr++ = ch / 256;					      \
Packit Service 82fcde
	    *outptr++ = ch % 256;					      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
	/* KS C 5601-1992 Annex 3 regards  0xA4DA(Hangul Filler : U3164)      \
Packit Service 82fcde
	   as symbol */							      \
Packit Service 82fcde
	else if (ch >= 0x3131 && ch <= 0x3163)				      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    ch = jamo_from_ucs_table[ch - 0x3131];			      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    if (__glibc_unlikely (outptr + 2 > outend))			      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		result = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
		break;							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    *outptr++ = ch / 256;					      \
Packit Service 82fcde
	    *outptr++ = ch % 256;					      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
	else if ((ch >= 0x4e00 && ch <= 0x9fa5)				      \
Packit Service 82fcde
		 || (ch >= 0xf900 && ch <= 0xfa0b))			      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    size_t written;						      \
Packit Service 82fcde
	    uint32_t temp;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    written = ucs4_to_ksc5601_hanja (ch, outptr, outend - outptr);    \
Packit Service 82fcde
	    if (__builtin_expect (written, 1) == 0)			      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		result = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
		break;							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
	    if (__glibc_unlikely (written == __UNKNOWN_10646_CHAR))	      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		STANDARD_TO_LOOP_ERR_HANDLER (4);			      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    outptr[0] -= 0x4a;						      \
Packit Service 82fcde
	    outptr[1] -= 0x21;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    temp = outptr[0] * 94 + outptr[1];				      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    outptr[0] = 0xe0 + temp / 188;				      \
Packit Service 82fcde
	    outptr[1] = temp % 188;					      \
Packit Service 82fcde
	    outptr[1] += outptr[1] >= 78 ? 0x43 : 0x31;			      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    outptr += 2;						      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
	else if (ch == 0x20a9)						      \
Packit Service 82fcde
	  *outptr++ = 0x5c;						      \
Packit Service 82fcde
	else								      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    size_t written;						      \
Packit Service 82fcde
	    uint32_t temp;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr);      \
Packit Service 82fcde
	    if (__builtin_expect (written, 1) == 0)			      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		result = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
		break;							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
	    if (__builtin_expect (written == __UNKNOWN_10646_CHAR, 0)	      \
Packit Service 82fcde
		|| (outptr[0] == 0x22 && outptr[1] > 0x68))		      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		UNICODE_TAG_HANDLER (ch, 4);				      \
Packit Service 82fcde
		STANDARD_TO_LOOP_ERR_HANDLER (4);			      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    temp = (outptr[0] < 0x4a ? outptr[0] + 0x191 : outptr[0] + 0x176);\
Packit Service 82fcde
	    outptr[1] += (temp % 2 ? 0x5e : 0);				      \
Packit Service 82fcde
	    outptr[1] += (outptr[1] < 0x6f ? 0x10 : 0x22);		      \
Packit Service 82fcde
	    outptr[0] = temp / 2;					      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    outptr += 2;						      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
      }									      \
Packit Service 82fcde
									      \
Packit Service 82fcde
    inptr += 4;								      \
Packit Service 82fcde
  }
Packit Service 82fcde
#define LOOP_NEED_FLAGS
Packit Service 82fcde
#include <iconv/loop.c>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Now define the toplevel functions.  */
Packit Service 82fcde
#include <iconv/skeleton.c>