Blame iconvdata/johab.c

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