]> code.delx.au - gnu-emacs/blobdiff - src/ccl.c
(print_error_message): Print data of `end-of-file'
[gnu-emacs] / src / ccl.c
index 6a6876df7c8c6caa21b73ba679146b7fcdb8584c..0b11bafe7d27f0d31101193e73f2c0e0a238b032 100644 (file)
--- a/src/ccl.c
+++ b/src/ccl.c
@@ -666,21 +666,21 @@ static tr_stack *mapping_stack_pointer;
 
 /* Encode one character CH to multibyte form and write to the current
    output buffer.  If CH is less than 256, CH is written as is.  */
-#define CCL_WRITE_CHAR(ch)                             \
-  do {                                                 \
-    if (!dst)                                          \
-      CCL_INVALID_CMD;                                 \
-    else                                               \
-      {                                                        \
-       unsigned char work[4], *str;                    \
-       int len = CHAR_STRING (ch, work, str);          \
-       if (dst + len <= (dst_bytes ? dst_end : src))   \
-         {                                             \
-           while (len--) *dst++ = *str++;              \
-         }                                             \
-       else                                            \
-         CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST);        \
-      }                                                        \
+#define CCL_WRITE_CHAR(ch)                                     \
+  do {                                                         \
+    if (!dst)                                                  \
+      CCL_INVALID_CMD;                                         \
+    else                                                       \
+      {                                                                \
+       unsigned char str[MAX_MULTIBYTE_LENGTH], *p = str;      \
+       int len = CHAR_STRING (ch, str);                        \
+       if (dst + len <= (dst_bytes ? dst_end : src))           \
+         {                                                     \
+           while (len--) *dst++ = *p++;                        \
+         }                                                     \
+       else                                                    \
+         CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST);                \
+      }                                                                \
   } while (0)
 
 /* Write a string at ccl_prog[IC] of length LEN to the current output
@@ -714,6 +714,31 @@ static tr_stack *mapping_stack_pointer;
   } while (0)
 
 
+/* Set C to the character code made from CHARSET and CODE.  This is
+   like MAKE_CHAR but check the validity of CHARSET and CODE.  If they
+   are not valid, set C to (CODE & 0xFF) because that is usually the
+   case that CCL_ReadMultibyteChar2 read an invalid code and it set
+   CODE to that invalid byte.  */
+
+#define CCL_MAKE_CHAR(charset, code, c)                                \
+  do {                                                         \
+    if (charset == CHARSET_ASCII)                              \
+      c = code & 0xFF;                                         \
+    else if (CHARSET_DEFINED_P (charset)                       \
+            && (code & 0x7F) >= 32                             \
+            && (code < 256 || ((code >> 7) & 0x7F) >= 32))     \
+      {                                                                \
+       int c1 = code & 0x7F, c2 = 0;                           \
+                                                               \
+       if (code >= 256)                                        \
+         c2 = c1, c1 = (code >> 7) & 0x7F;                     \
+       c = MAKE_NON_ASCII_CHAR (charset, c1, c2);              \
+      }                                                                \
+    else                                                       \
+      c = code & 0xFF;                                 \
+  } while (0)
+
+
 /* Execute CCL code on SRC_BYTES length text at SOURCE.  The resulting
    text goes to a place pointed by DESTINATION, the length of which
    should not exceed DST_BYTES.  The bytes actually processed is
@@ -909,7 +934,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
          i = reg[RRR];
          j = XINT (ccl_prog[ic]);
          op = field1 >> 6;
-         ic++;
+         jump_address = ic + 1;
          goto ccl_set_expr;
 
        case CCL_WriteRegister: /* CCCCCCCCCCCCCCCCCCCrrrXXXXX */
@@ -929,6 +954,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
          i = reg[RRR];
          j = reg[Rrr];
          op = field1 >> 6;
+         jump_address = ic;
          goto ccl_set_expr;
 
        case CCL_Call:          /* 1:CCCCCCCCCCCCCCCCCCCCFFFXXXXX */
@@ -1105,6 +1131,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
            {
              i = reg[rrr];
              CCL_WRITE_CHAR (i);
+             ic = jump_address;
            }
          else if (!reg[rrr])
            ic = jump_address;
@@ -1125,46 +1152,6 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
                  }
              
                i = *src++;
-               if (i == LEADING_CODE_COMPOSITION)
-                 {
-                   if (src >= src_end)
-                     goto ccl_read_multibyte_character_suspend;
-                   if (*src == 0xFF)
-                     {
-                       ccl->private_state = COMPOSING_WITH_RULE_HEAD;
-                       src++;
-                     }
-                   else
-                     ccl->private_state = COMPOSING_NO_RULE_HEAD;
-
-                   continue;
-                 }
-               if (ccl->private_state != COMPOSING_NO)
-                 {
-                   /* composite character */
-                   if (i < 0xA0)
-                     ccl->private_state = COMPOSING_NO;
-                   else
-                     {
-                       if (COMPOSING_WITH_RULE_RULE == ccl->private_state)
-                         {
-                           ccl->private_state = COMPOSING_WITH_RULE_HEAD;
-                           continue;
-                         }
-                       else if (COMPOSING_WITH_RULE_HEAD == ccl->private_state)
-                         ccl->private_state = COMPOSING_WITH_RULE_RULE;
-
-                       if (i == 0xA0)
-                         {
-                           if (src >= src_end)
-                             goto ccl_read_multibyte_character_suspend;
-                           i = *src++ & 0x7F;
-                         }
-                       else
-                         i -= 0x20;
-                     }
-                 }
-
                if (i < 0x80)
                  {
                    /* ASCII */
@@ -1231,8 +1218,6 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
              i = reg[RRR]; /* charset */
              if (i == CHARSET_ASCII)
                i = reg[rrr] & 0xFF;
-             else if (i == CHARSET_COMPOSITION)
-               i = MAKE_COMPOSITE_CHAR (reg[rrr]);
              else if (CHARSET_DIMENSION (i) == 1)
                i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F);
              else if (i < MIN_CHARSET_PRIVATE_DIMENSION2)
@@ -1245,21 +1230,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
              break;
 
            case CCL_TranslateCharacter:
-             i = reg[RRR]; /* charset */
-             if (i == CHARSET_ASCII)
-               i = reg[rrr];
-             else if (i == CHARSET_COMPOSITION)
-               {
-                 reg[RRR] = -1;
-                 break;
-               }
-             else if (CHARSET_DIMENSION (i) == 1)
-               i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F);
-             else if (i < MIN_CHARSET_PRIVATE_DIMENSION2)
-               i = ((i - 0x8F) << 14) | (reg[rrr] & 0x3FFF);
-             else
-               i = ((i - 0xE0) << 14) | (reg[rrr] & 0x3FFF);
-
+             CCL_MAKE_CHAR (reg[RRR], reg[rrr], i);
              op = translate_char (GET_TRANSLATION_TABLE (reg[Rrr]),
                                   i, -1, 0, 0);
              SPLIT_CHAR (op, reg[RRR], i, j);
@@ -1272,21 +1243,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
            case CCL_TranslateCharacterConstTbl:
              op = XINT (ccl_prog[ic]); /* table */
              ic++;
-             i = reg[RRR]; /* charset */
-             if (i == CHARSET_ASCII)
-               i = reg[rrr];
-             else if (i == CHARSET_COMPOSITION)
-               {
-                 reg[RRR] = -1;
-                 break;
-               }
-             else if (CHARSET_DIMENSION (i) == 1)
-               i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F);
-             else if (i < MIN_CHARSET_PRIVATE_DIMENSION2)
-               i = ((i - 0x8F) << 14) | (reg[rrr] & 0x3FFF);
-             else
-               i = ((i - 0xE0) << 14) | (reg[rrr] & 0x3FFF);
-
+             CCL_MAKE_CHAR (reg[RRR], reg[rrr], i);
              op = translate_char (GET_TRANSLATION_TABLE (op), i, -1, 0, 0);
              SPLIT_CHAR (op, reg[RRR], i, j);
              if (j != -1)
@@ -1493,6 +1450,7 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
                      }
                    else if (EQ (content, Qlambda))
                      {
+                       reg[RRR] = i;
                        break;
                      }
                    else
@@ -1535,13 +1493,13 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
                  reg[RRR] = -1;
                else
                  {
+                   reg[RRR] = 0;
                    content = XVECTOR (map)->contents[point];
                    if (NILP (content))
                      reg[RRR] = -1;
                    else if (NUMBERP (content))
                      reg[rrr] = XINT (content);
-                   else if (EQ (content, Qt))
-                     reg[RRR] = i;
+                   else if (EQ (content, Qt));
                    else if (CONSP (content))
                      {
                        attrib = XCAR (content);