Blame iconvdata/armscii-8.c

Packit 6c4009
/* Conversion to and from ARMSCII-8
Packit 6c4009
   Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
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
Packit 6c4009
/* Definitions used in the body of the `gconv' function.  */
Packit 6c4009
#define CHARSET_NAME		"ARMSCII-8//"
Packit 6c4009
#define FROM_LOOP		from_armscii_8
Packit 6c4009
#define TO_LOOP			to_armscii_8
Packit 6c4009
#define DEFINE_INIT		1
Packit 6c4009
#define DEFINE_FINI		1
Packit 6c4009
#define MIN_NEEDED_FROM		1
Packit 6c4009
#define MIN_NEEDED_TO		4
Packit 6c4009
#define ONE_DIRECTION		0
Packit 6c4009
Packit 6c4009
Packit 6c4009
static const uint16_t map_from_armscii_8[0xfe - 0xa2 + 1] =
Packit 6c4009
  {
Packit 6c4009
    0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, 0x2014, 0x002e,
Packit 6c4009
    0x055d, 0x002c, 0x002d, 0x058a, 0x2026, 0x055c, 0x055b, 0x055e,
Packit 6c4009
    0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, 0x0534, 0x0564,
Packit 6c4009
    0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, 0x0538, 0x0568,
Packit 6c4009
    0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, 0x053c, 0x056c,
Packit 6c4009
    0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, 0x0540, 0x0570,
Packit 6c4009
    0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, 0x0544, 0x0574,
Packit 6c4009
    0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, 0x0548, 0x0578,
Packit 6c4009
    0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, 0x054c, 0x057c,
Packit 6c4009
    0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, 0x0550, 0x0580,
Packit 6c4009
    0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, 0x0554, 0x0584,
Packit 6c4009
    0x0555, 0x0585, 0x0556, 0x0586, 0x055a
Packit 6c4009
  };
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* First define the conversion function from ARMSCII-8 to UCS4.  */
Packit 6c4009
#define MIN_NEEDED_INPUT	MIN_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
    uint_fast8_t ch = *inptr;						      \
Packit 6c4009
									      \
Packit 6c4009
    if (ch <= 0xa0)							      \
Packit 6c4009
      {									      \
Packit 6c4009
        /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */  \
Packit 6c4009
        *((uint32_t *) outptr) = ch;					      \
Packit 6c4009
        outptr += sizeof (uint32_t);					      \
Packit 6c4009
      }									      \
Packit 6c4009
    else if (ch >= 0xa2 && ch <= 0xfe)					      \
Packit 6c4009
      {									      \
Packit 6c4009
        /* Use the table.  */						      \
Packit 6c4009
        *((uint32_t *) outptr) = map_from_armscii_8[ch - 0xa2];		      \
Packit 6c4009
        outptr += sizeof (uint32_t);					      \
Packit 6c4009
      }									      \
Packit 6c4009
    else								      \
Packit 6c4009
      {									      \
Packit 6c4009
	/* This is an illegal character.  */				      \
Packit 6c4009
	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
Packit 6c4009
      }									      \
Packit 6c4009
									      \
Packit 6c4009
    ++inptr;								      \
Packit 6c4009
  }
Packit 6c4009
#define LOOP_NEED_FLAGS
Packit 6c4009
#define ONEBYTE_BODY \
Packit 6c4009
  {									      \
Packit 6c4009
    if (c <= 0xa0)							      \
Packit 6c4009
      /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */    \
Packit 6c4009
      return c;								      \
Packit 6c4009
    else if (c >= 0xa2 && c <= 0xfe)					      \
Packit 6c4009
      /* Use the table.  */						      \
Packit 6c4009
      return map_from_armscii_8[c - 0xa2];				      \
Packit 6c4009
    else								      \
Packit 6c4009
      return WEOF;							      \
Packit 6c4009
  }
Packit 6c4009
#include <iconv/loop.c>
Packit 6c4009
Packit 6c4009
Packit 6c4009
static const unsigned char map_to_armscii_8[0x58a - 0x531 + 1] =
Packit 6c4009
  {
Packit 6c4009
    0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc0,
Packit 6c4009
    0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0,
Packit 6c4009
    0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0,
Packit 6c4009
    0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0,
Packit 6c4009
    0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0x00, 0x00,
Packit 6c4009
    0x00, 0xfe, 0xb0, 0xaf, 0xaa, 0xb1, 0x00, 0x00,
Packit 6c4009
    0xb3, 0xb5, 0xb7, 0xb9, 0xbb, 0xbd, 0xbf, 0xc1,
Packit 6c4009
    0xc3, 0xc5, 0xc7, 0xc9, 0xcb, 0xcd, 0xcf, 0xd1,
Packit 6c4009
    0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1,
Packit 6c4009
    0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1,
Packit 6c4009
    0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0xa2, 0x00,
Packit 6c4009
    0xa3, 0xad
Packit 6c4009
  };
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 LOOPFCT			TO_LOOP
Packit 6c4009
#define BODY \
Packit 6c4009
  {									      \
Packit 6c4009
    uint32_t ch = *((const uint32_t *) inptr);				      \
Packit 6c4009
									      \
Packit 6c4009
    if (ch <= 0xa0)							      \
Packit 6c4009
      /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */    \
Packit 6c4009
      *outptr = (unsigned char) ch;					      \
Packit 6c4009
    else if (ch == 0xab)						      \
Packit 6c4009
      *outptr = 0xa7;							      \
Packit 6c4009
    else if (ch == 0xbb)						      \
Packit 6c4009
      *outptr = 0xa6;							      \
Packit 6c4009
    else if (ch >= 0x531 && ch <= 0x58a)				      \
Packit 6c4009
      {									      \
Packit 6c4009
	unsigned char oc = map_to_armscii_8[ch - 0x531];		      \
Packit 6c4009
									      \
Packit 6c4009
	if (oc == 0)							      \
Packit 6c4009
	  /* No valid mapping.  */					      \
Packit 6c4009
	  goto err;							      \
Packit 6c4009
									      \
Packit 6c4009
	*outptr = oc;							      \
Packit 6c4009
      }									      \
Packit 6c4009
    else if (ch == 0x2014)						      \
Packit 6c4009
      *outptr = 0xa8;							      \
Packit 6c4009
    else if (ch == 0x2026)						      \
Packit 6c4009
      *outptr = 0xae;							      \
Packit 6c4009
    else								      \
Packit 6c4009
      {									      \
Packit 6c4009
	UNICODE_TAG_HANDLER (ch, 4);					      \
Packit 6c4009
									      \
Packit 6c4009
	/* We have an illegal character.  */				      \
Packit 6c4009
      err:								      \
Packit 6c4009
	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
Packit 6c4009
      }									      \
Packit 6c4009
    ++outptr;								      \
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>