about summary refs log tree commit diff
path: root/iconvdata/ibm943.c
diff options
context:
space:
mode:
Diffstat (limited to 'iconvdata/ibm943.c')
-rw-r--r--iconvdata/ibm943.c60
1 files changed, 31 insertions, 29 deletions
diff --git a/iconvdata/ibm943.c b/iconvdata/ibm943.c
index 818f6823c5..bf387bbc3e 100644
--- a/iconvdata/ibm943.c
+++ b/iconvdata/ibm943.c
@@ -20,13 +20,9 @@
 
 #include <dlfcn.h>
 #include <stdint.h>
+#include <stdbool.h>
 #include "ibm943.h"
 
-#ifndef TRUE
-#define TRUE  1
-#define FALSE 0
-#endif
-
 #define FROM	0
 #define TO	1
 
@@ -50,38 +46,25 @@
 #define LOOPFCT			FROM_LOOP
 #define BODY \
   {									      \
-    const struct gap *rp1 = __ibm943sb_to_ucs4_idx;			      \
     const struct gap *rp2 = __ibm943db_to_ucs4_idx;			      \
     uint32_t ch = *inptr;						      \
     uint32_t res;							      \
 									      \
-    if (__builtin_expect (ch >= 0xffff, 0))				      \
-      {									      \
-	rp1 = NULL;							      \
-	rp2 = NULL;							      \
-      }									      \
-    else if (__builtin_expect (ch, 0) == 0x80				      \
-	     || __builtin_expect (ch, 0) == 0xa0			      \
-	     || __builtin_expect (ch, 0) == 0xfd			      \
-	     || __builtin_expect (ch, 0) == 0xfe			      \
-	     || __builtin_expect (ch, 0) == 0xff)			      \
+    if (__builtin_expect (ch == 0x80, 0)				      \
+	|| __builtin_expect (ch == 0xa0, 0)				      \
+	|| __builtin_expect (ch == 0xfd, 0)				      \
+	|| __builtin_expect (ch == 0xfe, 0)				      \
+	|| __builtin_expect (ch == 0xff, 0))				      \
       {									      \
 	/* This is an illegal character.  */				      \
 	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
       }									      \
-    else								      \
-      {									      \
-	while (ch > rp1->end)						      \
-	  ++rp1;							      \
-      }									      \
 									      \
     /* Use the IBM943 table for single byte.  */			      \
-    if (__builtin_expect (rp1 == NULL, 0)				      \
-	|| __builtin_expect (ch < rp1->start, 0)			      \
-	|| (res = __ibm943sb_to_ucs4[ch + rp1->idx],			      \
-	__builtin_expect (res, '\1') == 0 && ch != 0))			      \
+    if (__builtin_expect (ch > 0xdf, 0)					      \
+	|| (res = __ibm943sb_to_ucs4[ch],				      \
+	    __builtin_expect (res == 0, 0) && ch != 0))			      \
       {									      \
-									      \
 	/* Use the IBM943 table for double byte.  */			      \
 	if (__builtin_expect (inptr + 1 >= inend, 0))			      \
 	  {								      \
@@ -128,6 +111,25 @@
       }									      \
   }
 #define LOOP_NEED_FLAGS
+#define ONEBYTE_BODY \
+  {									      \
+    if (c == 0x80 || c == 0xa0 || c >= 0xe0)				      \
+      return WEOF;							      \
+    uint32_t res = __ibm943sb_to_ucs4[c];				      \
+    if (res == 0 && c != 0)						      \
+      return WEOF;							      \
+    if (res == 0x1c)							      \
+      res = 0x1a;							      \
+    else if (res == 0x7f)						      \
+      res = 0x1c;							      \
+    else if (res == 0xa5)						      \
+      res = 0x5c;							      \
+    else if (res == 0x203e)						      \
+      res = 0x7e;							      \
+    else if (res == 0x1a)						      \
+      res = 0x7f;							      \
+    return res;								      \
+  }
 #include <iconv/loop.c>
 
 /* Next, define the other direction.  */
@@ -140,7 +142,7 @@
     const struct gap *rp = __ucs4_to_ibm943sb_idx;			      \
     unsigned char sc;							      \
     uint32_t ch = get32(inptr);						      \
-    uint16_t found = TRUE;						      \
+    bool found = true;							      \
     uint32_t i;								      \
     uint32_t low;							      \
     uint32_t high;							      \
@@ -163,7 +165,7 @@
       {									      \
 									      \
 	/* Use the UCS4 table for double byte.  */			      \
-	found = FALSE;							      \
+	found = false;							      \
 	low = 0;							      \
 	high = (sizeof (__ucs4_to_ibm943db) >> 1)			      \
 		/ sizeof (__ucs4_to_ibm943db[0][FROM]);			      \
@@ -178,7 +180,7 @@
 	    else 							      \
 	      {								      \
 		pccode = __ucs4_to_ibm943db[i][TO];			      \
-		found = TRUE;						      \
+		found = true;						      \
 		break;							      \
 	      }								      \
 	  }								      \