Blame iconvdata/euc-jisx0213.c

Packit Service 82fcde
/* Conversion from and to EUC-JISX0213.
Packit Service 82fcde
   Copyright (C) 2002-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
   Contributed by Bruno Haible <bruno@clisp.org>, 2002.
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 <gconv.h>
Packit Service 82fcde
Packit Service 82fcde
/* The structure of EUC-JISX0213 is as follows:
Packit Service 82fcde
Packit Service 82fcde
   0x00..0x7F: ASCII
Packit Service 82fcde
Packit Service 82fcde
   0x8E{A1..FE}: JISX0201 Katakana, with prefix 0x8E, offset by +0x80.
Packit Service 82fcde
Packit Service 82fcde
   0x8F{A1..FE}{A1..FE}: JISX0213 plane 2, with prefix 0x8F, offset by +0x8080.
Packit Service 82fcde
Packit Service 82fcde
   0x{A1..FE}{A1..FE}: JISX0213 plane 1, offset by +0x8080.
Packit Service 82fcde
Packit Service 82fcde
   Note that some JISX0213 characters are not contained in Unicode 3.2
Packit Service 82fcde
   and are therefore best represented as sequences of Unicode characters.
Packit Service 82fcde
*/
Packit Service 82fcde
Packit Service 82fcde
#include "jisx0213.h"
Packit Service 82fcde
Packit Service 82fcde
/* Definitions used in the body of the `gconv' function.  */
Packit Service 82fcde
#define CHARSET_NAME		"EUC-JISX0213//"
Packit Service 82fcde
#define FROM_LOOP		from_euc_jisx0213
Packit Service 82fcde
#define TO_LOOP			to_euc_jisx0213
Packit Service 82fcde
#define DEFINE_INIT		1
Packit Service 82fcde
#define DEFINE_FINI		1
Packit Service 82fcde
#define ONE_DIRECTION		0
Packit Service 82fcde
#define FROM_LOOP_MIN_NEEDED_FROM	1
Packit Service 82fcde
#define FROM_LOOP_MAX_NEEDED_FROM	3
Packit Service 82fcde
#define FROM_LOOP_MIN_NEEDED_TO		4
Packit Service 82fcde
#define FROM_LOOP_MAX_NEEDED_TO		8
Packit Service 82fcde
#define TO_LOOP_MIN_NEEDED_FROM		4
Packit Service 82fcde
#define TO_LOOP_MAX_NEEDED_FROM		4
Packit Service 82fcde
#define TO_LOOP_MIN_NEEDED_TO		1
Packit Service 82fcde
#define TO_LOOP_MAX_NEEDED_TO		3
Packit Service 82fcde
#define PREPARE_LOOP \
Packit Service 82fcde
  int saved_state;							      \
Packit Service 82fcde
  int *statep = &data->__statep->__count;
Packit Service 82fcde
#define EXTRA_LOOP_ARGS		, statep
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Since we might have to reset input pointer we must be able to save
Packit Service 82fcde
   and restore the state.  */
Packit Service 82fcde
#define SAVE_RESET_STATE(Save) \
Packit Service 82fcde
  if (Save)								      \
Packit Service 82fcde
    saved_state = *statep;						      \
Packit Service 82fcde
  else									      \
Packit Service 82fcde
    *statep = saved_state
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* During EUC-JISX0213 to UCS-4 conversion, the COUNT element of the state
Packit Service 82fcde
   contains the last UCS-4 character, shifted by 3 bits.
Packit Service 82fcde
   During UCS-4 to EUC-JISX0213 conversion, the COUNT element of the state
Packit Service 82fcde
   contains the last two bytes to be output, shifted by 3 bits.  */
Packit Service 82fcde
Packit Service 82fcde
/* Since this is a stateful encoding we have to provide code which resets
Packit Service 82fcde
   the output state to the initial state.  This has to be done during the
Packit Service 82fcde
   flushing.  */
Packit Service 82fcde
#define EMIT_SHIFT_TO_INIT \
Packit Service 82fcde
  if (data->__statep->__count != 0)					      \
Packit Service 82fcde
    {									      \
Packit Service 82fcde
      if (FROM_DIRECTION)						      \
Packit Service 82fcde
	{								      \
Packit Service 82fcde
	  if (__glibc_likely (outbuf + 4 <= outend))			      \
Packit Service 82fcde
	    {								      \
Packit Service 82fcde
	      /* Write out the last character.  */			      \
Packit Service 82fcde
	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
Packit Service 82fcde
	      outbuf += sizeof (uint32_t);				      \
Packit Service 82fcde
	      data->__statep->__count = 0;				      \
Packit Service 82fcde
	    }								      \
Packit Service 82fcde
	  else								      \
Packit Service 82fcde
	    /* We don't have enough room in the output buffer.  */	      \
Packit Service 82fcde
	    status = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
	}								      \
Packit Service 82fcde
      else								      \
Packit Service 82fcde
	{								      \
Packit Service 82fcde
	  if (__glibc_likely (outbuf + 2 <= outend))			      \
Packit Service 82fcde
	    {								      \
Packit Service 82fcde
	      /* Write out the last character.  */			      \
Packit Service 82fcde
	      uint32_t lasttwo = data->__statep->__count >> 3;		      \
Packit Service 82fcde
	      *outbuf++ = (lasttwo >> 8) & 0xff;			      \
Packit Service 82fcde
	      *outbuf++ = lasttwo & 0xff;				      \
Packit Service 82fcde
	      data->__statep->__count = 0;				      \
Packit Service 82fcde
	    }								      \
Packit Service 82fcde
	  else								      \
Packit Service 82fcde
	    /* We don't have enough room in the output buffer.  */	      \
Packit Service 82fcde
	    status = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
	}								      \
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* First define the conversion function from EUC-JISX0213 to UCS-4.  */
Packit Service 82fcde
#define MIN_NEEDED_INPUT	FROM_LOOP_MIN_NEEDED_FROM
Packit Service 82fcde
#define MAX_NEEDED_INPUT	FROM_LOOP_MAX_NEEDED_FROM
Packit Service 82fcde
#define MIN_NEEDED_OUTPUT	FROM_LOOP_MIN_NEEDED_TO
Packit Service 82fcde
#define MAX_NEEDED_OUTPUT	FROM_LOOP_MAX_NEEDED_TO
Packit Service 82fcde
#define LOOPFCT			FROM_LOOP
Packit Service 82fcde
#define BODY \
Packit Service 82fcde
  {									      \
Packit Service 82fcde
    uint32_t ch;							      \
Packit Service 82fcde
									      \
Packit Service 82fcde
    /* Determine whether there is a buffered character pending.  */	      \
Packit Service 82fcde
    ch = *statep >> 3;							      \
Packit Service 82fcde
    if (__glibc_likely (ch == 0))					      \
Packit Service 82fcde
      {									      \
Packit Service 82fcde
	/* No - so look at the next input byte.  */			      \
Packit Service 82fcde
	ch = *inptr;							      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	if (ch < 0x80)							      \
Packit Service 82fcde
	  /* Plain ASCII character.  */					      \
Packit Service 82fcde
	  ++inptr;							      \
Packit Service 82fcde
	else if ((ch >= 0xa1 && ch <= 0xfe) || ch == 0x8e || ch == 0x8f)      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* Two or three byte character.  */				      \
Packit Service 82fcde
	    uint32_t ch2;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    if (__glibc_unlikely (inptr + 1 >= inend))			      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		/* The second byte is not available.  */		      \
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
									      \
Packit Service 82fcde
	    /* The second byte must be >= 0xa1 and <= 0xfe.  */		      \
Packit Service 82fcde
	    if (__glibc_unlikely (ch2 < 0xa1 || ch2 > 0xfe))		      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		/* This is an illegal character.  */			      \
Packit Service 82fcde
		STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    if (ch == 0x8e)						      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		/* Half-width katakana.  */				      \
Packit Service 82fcde
		if (__glibc_unlikely (ch2 > 0xdf))			      \
Packit Service 82fcde
		  STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		ch = ch2 + 0xfec0;					      \
Packit Service 82fcde
		inptr += 2;						      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
	    else							      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		const unsigned char *endp;				      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		if (ch == 0x8f)						      \
Packit Service 82fcde
		  {							      \
Packit Service 82fcde
		    /* JISX 0213 plane 2.  */				      \
Packit Service 82fcde
		    uint32_t ch3;					      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		    if (__glibc_unlikely (inptr + 2 >= inend))		      \
Packit Service 82fcde
		      {							      \
Packit Service 82fcde
			/* The third byte is not available.  */		      \
Packit Service 82fcde
			result = __GCONV_INCOMPLETE_INPUT;		      \
Packit Service 82fcde
			break;						      \
Packit Service 82fcde
		      }							      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		    ch3 = inptr[2];					      \
Packit Service 82fcde
		    endp = inptr + 3;					      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		    ch = jisx0213_to_ucs4 (0x200 - 0x80 + ch2, ch3 ^ 0x80);   \
Packit Service 82fcde
		  }							      \
Packit Service 82fcde
		else							      \
Packit Service 82fcde
		  {							      \
Packit Service 82fcde
		    /* JISX 0213 plane 1.  */				      \
Packit Service 82fcde
		    endp = inptr + 2;					      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		    ch = jisx0213_to_ucs4 (0x100 - 0x80 + ch, ch2 ^ 0x80);    \
Packit Service 82fcde
		  }							      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		if (ch == 0)						      \
Packit Service 82fcde
		  /* This is an illegal character.  */			      \
Packit Service 82fcde
		  STANDARD_FROM_LOOP_ERR_HANDLER (1);			      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		inptr = endp;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		if (ch < 0x80)						      \
Packit Service 82fcde
		  {							      \
Packit Service 82fcde
		    /* It's a combining character.  */			      \
Packit Service 82fcde
		    uint32_t u1 = __jisx0213_to_ucs_combining[ch - 1][0];     \
Packit Service 82fcde
		    uint32_t u2 = __jisx0213_to_ucs_combining[ch - 1][1];     \
Packit Service 82fcde
									      \
Packit Service 82fcde
		    put32 (outptr, u1);					      \
Packit Service 82fcde
		    outptr += 4;					      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		    /* See whether we have room for two characters.  */	      \
Packit Service 82fcde
		    if (outptr + 4 <= outend)				      \
Packit Service 82fcde
		      {							      \
Packit Service 82fcde
			put32 (outptr, u2);				      \
Packit Service 82fcde
			outptr += 4;					      \
Packit Service 82fcde
			continue;					      \
Packit Service 82fcde
		      }							      \
Packit Service 82fcde
									      \
Packit Service 82fcde
		    /* Otherwise store only the first character now, and      \
Packit Service 82fcde
		       put the second one into the queue.  */		      \
Packit Service 82fcde
		    *statep = u2 << 3;					      \
Packit Service 82fcde
		    /* Tell the caller why we terminate the loop.  */	      \
Packit Service 82fcde
		    result = __GCONV_FULL_OUTPUT;			      \
Packit Service 82fcde
		    break;						      \
Packit Service 82fcde
		  }							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
	  }								      \
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
									      \
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 EXTRA_LOOP_DECLS	, int *statep
Packit Service 82fcde
#define ONEBYTE_BODY \
Packit Service 82fcde
  {									      \
Packit Service 82fcde
    if (c < 0x80)							      \
Packit Service 82fcde
      return 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, from UCS-4 to EUC-JISX0213.  */
Packit Service 82fcde
Packit Service 82fcde
/* Composition tables for each of the relevant combining characters.  */
Packit Service 82fcde
static const struct
Packit Service 82fcde
{
Packit Service 82fcde
  uint16_t base;
Packit Service 82fcde
  uint16_t composed;
Packit Service 82fcde
} comp_table_data[] =
Packit Service 82fcde
{
Packit Service 82fcde
#define COMP_TABLE_IDX_02E5 0
Packit Service 82fcde
#define COMP_TABLE_LEN_02E5 1
Packit Service 82fcde
  { 0xabe4, 0xabe5 }, /* 0x12B65 = 0x12B64 U+02E5 */
Packit Service 82fcde
#define COMP_TABLE_IDX_02E9 (COMP_TABLE_IDX_02E5 + COMP_TABLE_LEN_02E5)
Packit Service 82fcde
#define COMP_TABLE_LEN_02E9 1
Packit Service 82fcde
  { 0xabe0, 0xabe6 }, /* 0x12B66 = 0x12B60 U+02E9 */
Packit Service 82fcde
#define COMP_TABLE_IDX_0300 (COMP_TABLE_IDX_02E9 + COMP_TABLE_LEN_02E9)
Packit Service 82fcde
#define COMP_TABLE_LEN_0300 5
Packit Service 82fcde
  { 0xa9dc, 0xabc4 }, /* 0x12B44 = 0x1295C U+0300 */
Packit Service 82fcde
  { 0xabb8, 0xabc8 }, /* 0x12B48 = 0x12B38 U+0300 */
Packit Service 82fcde
  { 0xabb7, 0xabca }, /* 0x12B4A = 0x12B37 U+0300 */
Packit Service 82fcde
  { 0xabb0, 0xabcc }, /* 0x12B4C = 0x12B30 U+0300 */
Packit Service 82fcde
  { 0xabc3, 0xabce }, /* 0x12B4E = 0x12B43 U+0300 */
Packit Service 82fcde
#define COMP_TABLE_IDX_0301 (COMP_TABLE_IDX_0300 + COMP_TABLE_LEN_0300)
Packit Service 82fcde
#define COMP_TABLE_LEN_0301 4
Packit Service 82fcde
  { 0xabb8, 0xabc9 }, /* 0x12B49 = 0x12B38 U+0301 */
Packit Service 82fcde
  { 0xabb7, 0xabcb }, /* 0x12B4B = 0x12B37 U+0301 */
Packit Service 82fcde
  { 0xabb0, 0xabcd }, /* 0x12B4D = 0x12B30 U+0301 */
Packit Service 82fcde
  { 0xabc3, 0xabcf }, /* 0x12B4F = 0x12B43 U+0301 */
Packit Service 82fcde
#define COMP_TABLE_IDX_309A (COMP_TABLE_IDX_0301 + COMP_TABLE_LEN_0301)
Packit Service 82fcde
#define COMP_TABLE_LEN_309A 14
Packit Service 82fcde
  { 0xa4ab, 0xa4f7 }, /* 0x12477 = 0x1242B U+309A */
Packit Service 82fcde
  { 0xa4ad, 0xa4f8 }, /* 0x12478 = 0x1242D U+309A */
Packit Service 82fcde
  { 0xa4af, 0xa4f9 }, /* 0x12479 = 0x1242F U+309A */
Packit Service 82fcde
  { 0xa4b1, 0xa4fa }, /* 0x1247A = 0x12431 U+309A */
Packit Service 82fcde
  { 0xa4b3, 0xa4fb }, /* 0x1247B = 0x12433 U+309A */
Packit Service 82fcde
  { 0xa5ab, 0xa5f7 }, /* 0x12577 = 0x1252B U+309A */
Packit Service 82fcde
  { 0xa5ad, 0xa5f8 }, /* 0x12578 = 0x1252D U+309A */
Packit Service 82fcde
  { 0xa5af, 0xa5f9 }, /* 0x12579 = 0x1252F U+309A */
Packit Service 82fcde
  { 0xa5b1, 0xa5fa }, /* 0x1257A = 0x12531 U+309A */
Packit Service 82fcde
  { 0xa5b3, 0xa5fb }, /* 0x1257B = 0x12533 U+309A */
Packit Service 82fcde
  { 0xa5bb, 0xa5fc }, /* 0x1257C = 0x1253B U+309A */
Packit Service 82fcde
  { 0xa5c4, 0xa5fd }, /* 0x1257D = 0x12544 U+309A */
Packit Service 82fcde
  { 0xa5c8, 0xa5fe }, /* 0x1257E = 0x12548 U+309A */
Packit Service 82fcde
  { 0xa6f5, 0xa6f8 }, /* 0x12678 = 0x12675 U+309A */
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
#define MIN_NEEDED_INPUT	TO_LOOP_MIN_NEEDED_FROM
Packit Service 82fcde
#define MAX_NEEDED_INPUT	TO_LOOP_MAX_NEEDED_FROM
Packit Service 82fcde
#define MIN_NEEDED_OUTPUT	TO_LOOP_MIN_NEEDED_TO
Packit Service 82fcde
#define MAX_NEEDED_OUTPUT	TO_LOOP_MAX_NEEDED_TO
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 ((*statep >> 3) != 0)						      \
Packit Service 82fcde
      {									      \
Packit Service 82fcde
	/* Attempt to combine the last character with this one.  */	      \
Packit Service 82fcde
	uint16_t lasttwo = *statep >> 3;				      \
Packit Service 82fcde
	unsigned int idx;						      \
Packit Service 82fcde
	unsigned int len;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	if (ch == 0x02e5)						      \
Packit Service 82fcde
	  idx = COMP_TABLE_IDX_02E5, len = COMP_TABLE_LEN_02E5;		      \
Packit Service 82fcde
	else if (ch == 0x02e9)						      \
Packit Service 82fcde
	  idx = COMP_TABLE_IDX_02E9, len = COMP_TABLE_LEN_02E9;		      \
Packit Service 82fcde
	else if (ch == 0x0300)						      \
Packit Service 82fcde
	  idx = COMP_TABLE_IDX_0300, len = COMP_TABLE_LEN_0300;		      \
Packit Service 82fcde
	else if (ch == 0x0301)						      \
Packit Service 82fcde
	  idx = COMP_TABLE_IDX_0301, len = COMP_TABLE_LEN_0301;		      \
Packit Service 82fcde
	else if (ch == 0x309a)						      \
Packit Service 82fcde
	  idx = COMP_TABLE_IDX_309A, len = COMP_TABLE_LEN_309A;		      \
Packit Service 82fcde
	else								      \
Packit Service 82fcde
	  goto not_combining;						      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	do								      \
Packit Service 82fcde
	  if (comp_table_data[idx].base == lasttwo)			      \
Packit Service 82fcde
	    break;							      \
Packit Service 82fcde
	while (++idx, --len > 0);					      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	if (len > 0)							      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* Output the combined character.  */			      \
Packit Service 82fcde
	    if (__glibc_unlikely (outptr + 1 >= outend))		      \
Packit Service 82fcde
	      {								      \
Packit Service 82fcde
		result = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
		break;							      \
Packit Service 82fcde
	      }								      \
Packit Service 82fcde
	    lasttwo = comp_table_data[idx].composed;			      \
Packit Service 82fcde
	    *outptr++ = (lasttwo >> 8) & 0xff;				      \
Packit Service 82fcde
	    *outptr++ = lasttwo & 0xff;					      \
Packit Service 82fcde
	    *statep = 0;						      \
Packit Service 82fcde
	    inptr += 4;							      \
Packit Service 82fcde
	    continue;							      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
      not_combining:							      \
Packit Service 82fcde
	/* Output the buffered character.  */				      \
Packit Service 82fcde
	if (__glibc_unlikely (outptr + 1 >= outend))			      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    result = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
	    break;							      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
	*outptr++ = (lasttwo >> 8) & 0xff;				      \
Packit Service 82fcde
	*outptr++ = lasttwo & 0xff;					      \
Packit Service 82fcde
	*statep = 0;							      \
Packit Service 82fcde
	continue;							      \
Packit Service 82fcde
      }									      \
Packit Service 82fcde
									      \
Packit Service 82fcde
    if (ch < 0x80)							      \
Packit Service 82fcde
      /* Plain ASCII character.  */					      \
Packit Service 82fcde
      *outptr++ = ch;							      \
Packit Service 82fcde
    else if (ch >= 0xff61 && ch <= 0xff9f)				      \
Packit Service 82fcde
      {									      \
Packit Service 82fcde
	/* Half-width katakana.  */					      \
Packit Service 82fcde
	if (__glibc_unlikely (outptr + 1 >= outend))			      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    result = __GCONV_FULL_OUTPUT;				      \
Packit Service 82fcde
	    break;							      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
	*outptr++ = 0x8e;						      \
Packit Service 82fcde
	*outptr++ = ch - 0xfec0;					      \
Packit Service 82fcde
      }									      \
Packit Service 82fcde
    else								      \
Packit Service 82fcde
      {									      \
Packit Service 82fcde
	uint32_t jch = ucs4_to_jisx0213 (ch);				      \
Packit Service 82fcde
	if (jch == 0)							      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    UNICODE_TAG_HANDLER (ch, 4);				      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    /* Illegal character.  */					      \
Packit Service 82fcde
	    STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	if (jch & 0x0080)						      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* A possible match in comp_table_data.  We have to buffer it.  */\
Packit Service 82fcde
									      \
Packit Service 82fcde
	    /* We know it's a JISX 0213 plane 1 character.  */		      \
Packit Service 82fcde
	    assert ((jch & 0x8000) == 0);				      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	    *statep = (jch | 0x8080) << 3;				      \
Packit Service 82fcde
	    inptr += 4;							      \
Packit Service 82fcde
	    continue;							      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
									      \
Packit Service 82fcde
	if (jch & 0x8000)						      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* JISX 0213 plane 2.  */					      \
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
	    *outptr++ = 0x8f;						      \
Packit Service 82fcde
	  }								      \
Packit Service 82fcde
	else								      \
Packit Service 82fcde
	  {								      \
Packit Service 82fcde
	    /* JISX 0213 plane 1.  */					      \
Packit Service 82fcde
	    if (__glibc_unlikely (outptr + 1 >= 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++ = (jch >> 8) | 0x80;					      \
Packit Service 82fcde
	*outptr++ = (jch & 0xff) | 0x80;				      \
Packit Service 82fcde
      }									      \
Packit Service 82fcde
									      \
Packit Service 82fcde
    inptr += 4;								      \
Packit Service 82fcde
  }
Packit Service 82fcde
#define LOOP_NEED_FLAGS
Packit Service 82fcde
#define EXTRA_LOOP_DECLS	, int *statep
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>