]> mj.ucw.cz Git - libucw.git/blobdiff - charset/charconv.c
Added the local copy of the regex library back.
[libucw.git] / charset / charconv.c
index 36796a7bf2f7e47e37bfc27c1e1c1cf9eed6f7b3..54dac42b74383bb65cbe9b8ef1157b0824645804 100644 (file)
@@ -89,6 +89,7 @@ seq:
        }
       if (c->code >= 0x10000)
        c->code = 0xfffd;
+got_char:
       c->source = s;
       c->state = 0;
       return -1;
@@ -133,19 +134,23 @@ seq:
       {
        void *p = &c->code;
        c->string_at = p;
-       if (c->code < 0xd800 || c->code - 0xe000 < 0x2000)
+       uns code = c->code;
+       c->string_at = p;
+       if (code < 0xd800 || code - 0xe000 < 0x2000)
          {}
-       else if ((c->code -= 0x10000) < 0x100000)
+       else if ((code -= 0x10000) < 0x100000)
          {
-           put_u16_be(p, 0xd800 | (c->code >> 10));
-           put_u16_be(p + 2, 0xdc00 | (c->code & 0x3ff));
+           put_u16_be(p, 0xd800 | (code >> 10));
+           put_u16_be(p + 2, 0xdc00 | (code & 0x3ff));
            c->remains = 4;
+           c->state = SEQ_WRITE;
            goto seq;
          }
        else
-         c->code = UNI_REPLACEMENT;
-       put_u16_be(p, c->code);
+         code = UNI_REPLACEMENT;
+       put_u16_be(p, code);
        c->remains = 2;
+        c->state = SEQ_WRITE;
        goto seq;
       }
 
@@ -154,18 +159,22 @@ seq:
       {
        void *p = &c->code;
        c->string_at = p;
-       if (c->code < 0xd800 || c->code - 0xe000 < 0x2000)
+       uns code = c->code;
+       c->string_at = p;
+       if (code < 0xd800 || code - 0xe000 < 0x2000)
          {}
-       else if ((c->code -= 0x10000) < 0x100000)
+       else if ((code -= 0x10000) < 0x100000)
          {
-           put_u16_le(p, 0xd800 | (c->code >> 10));
-           put_u16_le(p + 2, 0xdc00 | (c->code & 0x3ff));
+           put_u16_le(p, 0xd800 | (code >> 10));
+           put_u16_le(p + 2, 0xdc00 | (code & 0x3ff));
            c->remains = 4;
+            c->state = SEQ_WRITE;
          }
        else
-         c->code = UNI_REPLACEMENT;
-        put_u16_le(p, c->code);
+         code = UNI_REPLACEMENT;
+        put_u16_le(p, code);
         c->remains = 2;
+        c->state = SEQ_WRITE;
        goto seq;
       }
 
@@ -181,7 +190,7 @@ seq:
        goto cse;
       c->code = (c->code << 8) | *s++;
       if (c->code - 0xd800 >= 0x800)
-       break;
+        goto got_char;
       c->code = (c->code - 0xd800) << 10;
       c->state = UTF16_BE_READ_2;
       /* fall-thru */
@@ -203,7 +212,7 @@ seq:
       else
        c->code = UNI_REPLACEMENT;
       s++;
-      break;
+      goto got_char;
 
     /* Reading of UTF16-LE */
     case UTF16_LE_READ:
@@ -217,7 +226,7 @@ seq:
        goto cse;
       c->code |= *s++ << 8;
       if (c->code - 0xd800 >= 0x800)
-       break;
+        goto got_char;
       c->code = (c->code - 0xd800) << 10;
       c->state = UTF16_LE_READ_2;
       /* fall-thru */
@@ -235,7 +244,7 @@ seq:
       else
        c->code = UNI_REPLACEMENT;
       s++;
-      break;
+      goto got_char;
 
     default:
       ASSERT(0);
@@ -409,7 +418,11 @@ conv_set_charset(struct conv_context *c, int src, int dest)
   c->source_charset = src;
   c->dest_charset = dest;
   if (src == dest)
-    c->convert = conv_none;
+    {
+      c->convert = conv_none;
+      c->in_to_x = NULL;
+      c->x_to_out = NULL;
+    }
   else
     {
       static uns lookup[] = {
@@ -426,10 +439,8 @@ conv_set_charset(struct conv_context *c, int src, int dest)
       uns src_idx = ((uns)src < ARRAY_SIZE(lookup)) ? lookup[src] : 0;
       uns dest_idx = ((uns)dest < ARRAY_SIZE(lookup)) ? lookup[dest] : 0;
       c->convert = tab[src_idx][dest_idx];
-      if (!src_idx)
-       c->in_to_x = input_to_x[src];
-      if (!dest_idx)
-       c->x_to_out = x_to_output[dest];
+      c->in_to_x = src_idx ? NULL : input_to_x[src];
+      c->x_to_out = dest_idx ? NULL : x_to_output[dest];
     }
   c->state = 0;
 }