(root)/
glibc-2.38/
iconvdata/
armscii-8.c
       1  /* Conversion to and from ARMSCII-8
       2     Copyright (C) 1997-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <dlfcn.h>
      20  #include <stdint.h>
      21  
      22  /* Definitions used in the body of the `gconv' function.  */
      23  #define CHARSET_NAME		"ARMSCII-8//"
      24  #define FROM_LOOP		from_armscii_8
      25  #define TO_LOOP			to_armscii_8
      26  #define DEFINE_INIT		1
      27  #define DEFINE_FINI		1
      28  #define MIN_NEEDED_FROM		1
      29  #define MIN_NEEDED_TO		4
      30  #define ONE_DIRECTION		0
      31  
      32  
      33  static const uint16_t map_from_armscii_8[0xfe - 0xa2 + 1] =
      34    {
      35      0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, 0x2014, 0x002e,
      36      0x055d, 0x002c, 0x002d, 0x058a, 0x2026, 0x055c, 0x055b, 0x055e,
      37      0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, 0x0534, 0x0564,
      38      0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, 0x0538, 0x0568,
      39      0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, 0x053c, 0x056c,
      40      0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, 0x0540, 0x0570,
      41      0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, 0x0544, 0x0574,
      42      0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, 0x0548, 0x0578,
      43      0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, 0x054c, 0x057c,
      44      0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, 0x0550, 0x0580,
      45      0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, 0x0554, 0x0584,
      46      0x0555, 0x0585, 0x0556, 0x0586, 0x055a
      47    };
      48  
      49  
      50  /* First define the conversion function from ARMSCII-8 to UCS4.  */
      51  #define MIN_NEEDED_INPUT	MIN_NEEDED_FROM
      52  #define MIN_NEEDED_OUTPUT	MIN_NEEDED_TO
      53  #define LOOPFCT			FROM_LOOP
      54  #define BODY \
      55    {									      \
      56      uint_fast8_t ch = *inptr;						      \
      57  									      \
      58      if (ch <= 0xa0)							      \
      59        {									      \
      60          /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */  \
      61          *((uint32_t *) outptr) = ch;					      \
      62          outptr += sizeof (uint32_t);					      \
      63        }									      \
      64      else if (ch >= 0xa2 && ch <= 0xfe)					      \
      65        {									      \
      66          /* Use the table.  */						      \
      67          *((uint32_t *) outptr) = map_from_armscii_8[ch - 0xa2];		      \
      68          outptr += sizeof (uint32_t);					      \
      69        }									      \
      70      else								      \
      71        {									      \
      72  	/* This is an illegal character.  */				      \
      73  	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
      74        }									      \
      75  									      \
      76      ++inptr;								      \
      77    }
      78  #define LOOP_NEED_FLAGS
      79  #define ONEBYTE_BODY \
      80    {									      \
      81      if (c <= 0xa0)							      \
      82        /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */    \
      83        return c;								      \
      84      else if (c >= 0xa2 && c <= 0xfe)					      \
      85        /* Use the table.  */						      \
      86        return map_from_armscii_8[c - 0xa2];				      \
      87      else								      \
      88        return WEOF;							      \
      89    }
      90  #include <iconv/loop.c>
      91  
      92  
      93  static const unsigned char map_to_armscii_8[0x58a - 0x531 + 1] =
      94    {
      95      0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc0,
      96      0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0,
      97      0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0,
      98      0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0,
      99      0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0x00, 0x00,
     100      0x00, 0xfe, 0xb0, 0xaf, 0xaa, 0xb1, 0x00, 0x00,
     101      0xb3, 0xb5, 0xb7, 0xb9, 0xbb, 0xbd, 0xbf, 0xc1,
     102      0xc3, 0xc5, 0xc7, 0xc9, 0xcb, 0xcd, 0xcf, 0xd1,
     103      0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1,
     104      0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1,
     105      0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0xa2, 0x00,
     106      0xa3, 0xad
     107    };
     108  
     109  
     110  /* Next, define the other direction.  */
     111  #define MIN_NEEDED_INPUT	MIN_NEEDED_TO
     112  #define MIN_NEEDED_OUTPUT	MIN_NEEDED_FROM
     113  #define LOOPFCT			TO_LOOP
     114  #define BODY \
     115    {									      \
     116      uint32_t ch = *((const uint32_t *) inptr);				      \
     117  									      \
     118      if (ch <= 0xa0)							      \
     119        /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */    \
     120        *outptr = (unsigned char) ch;					      \
     121      else if (ch == 0xab)						      \
     122        *outptr = 0xa7;							      \
     123      else if (ch == 0xbb)						      \
     124        *outptr = 0xa6;							      \
     125      else if (ch >= 0x531 && ch <= 0x58a)				      \
     126        {									      \
     127  	unsigned char oc = map_to_armscii_8[ch - 0x531];		      \
     128  									      \
     129  	if (oc == 0)							      \
     130  	  /* No valid mapping.  */					      \
     131  	  goto err;							      \
     132  									      \
     133  	*outptr = oc;							      \
     134        }									      \
     135      else if (ch == 0x2014)						      \
     136        *outptr = 0xa8;							      \
     137      else if (ch == 0x2026)						      \
     138        *outptr = 0xae;							      \
     139      else								      \
     140        {									      \
     141  	UNICODE_TAG_HANDLER (ch, 4);					      \
     142  									      \
     143  	/* We have an illegal character.  */				      \
     144        err:								      \
     145  	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
     146        }									      \
     147      ++outptr;								      \
     148      inptr += 4;								      \
     149    }
     150  #define LOOP_NEED_FLAGS
     151  #include <iconv/loop.c>
     152  
     153  
     154  /* Now define the toplevel functions.  */
     155  #include <iconv/skeleton.c>