Sync up with r21-2-27.
[chise/xemacs-chise.git] / src / mule-ccl.c
index e84c7e1..d16205e 100644 (file)
@@ -34,7 +34,7 @@ Boston, MA 02111-1307, USA.  */
 
 #include "lisp.h"
 #include "buffer.h"
-#include "mule-charset.h"
+#include "character.h"
 #include "mule-ccl.h"
 #include "file-coding.h"
 
@@ -645,20 +645,20 @@ static tr_stack *mapping_stack_pointer;
 
 /* Suspend CCL program because of reading from empty input buffer or
    writing to full output buffer.  When this program is resumed, the
-   same I/O command is executed.  */
+   same I/O command is executed.  The `if (1)' is for warning suppression. */
 #define CCL_SUSPEND(stat)      \
   do {                         \
     ic--;                      \
     ccl->status = stat;                \
-    goto ccl_finish;           \
+    if (1) goto ccl_finish;    \
   } while (0)
 
 /* Terminate CCL program because of invalid command.  Should not occur
-   in the normal case.  */
+   in the normal case.  The `if (1)' is for warning suppression. */
 #define CCL_INVALID_CMD                        \
   do {                                 \
     ccl->status = CCL_STAT_INVALID_CMD;        \
-    goto ccl_error_handler;            \
+    if (1) goto ccl_error_handler;     \
   } while (0)
 
 /* Encode one character CH to multibyte form and write to the current
@@ -682,17 +682,27 @@ static tr_stack *mapping_stack_pointer;
 
 /* Write a string at ccl_prog[IC] of length LEN to the current output
    buffer.  */
-#define CCL_WRITE_STRING(len) do {                     \
-  if (!destination)                                    \
-    {                                                  \
-      ccl->status = CCL_STAT_INVALID_CMD;              \
-      goto ccl_error_handler;                          \
-    }                                                  \
-  else                                                 \
-    for (i = 0; i < len; i++)                          \
-      Dynarr_add(destination,                          \
-                (XINT (ccl_prog[ic + (i / 3)])         \
-                 >> ((2 - (i % 3)) * 8)) & 0xFF);      \
+#define CCL_WRITE_STRING(len) do {                             \
+  if (!destination)                                            \
+    {                                                          \
+      ccl->status = CCL_STAT_INVALID_CMD;                      \
+      goto ccl_error_handler;                                  \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      Bufbyte work[MAX_EMCHAR_LEN];                            \
+      for (i = 0; i < len; i++)                                        \
+       {                                                       \
+         int ch = (XINT (ccl_prog[ic + (i / 3)])               \
+                   >> ((2 - (i % 3)) * 8)) & 0xFF;             \
+         int bytes =                                           \
+           ( ch < ( conversion_mode == CCL_MODE_ENCODING ?     \
+                    256 : 128 ) ) ?                            \
+           simple_set_charptr_emchar (work, ch) :              \
+           non_ascii_set_charptr_emchar (work, ch);            \
+         Dynarr_add_many (destination, work, bytes);           \
+       }                                                       \
+    }                                                          \
 } while (0)
 
 /* Read one byte from the current input buffer into Rth register.  */
@@ -1117,6 +1127,7 @@ ccl_driver (struct ccl_program *ccl, CONST unsigned char *source,
        case CCL_Extention:
          switch (EXCMD)
            {
+#ifndef UTF2000
            case CCL_ReadMultibyteChar2:
              if (!src)
                CCL_INVALID_CMD;
@@ -1230,7 +1241,9 @@ ccl_driver (struct ccl_program *ccl, CONST unsigned char *source,
                CCL_SUSPEND (CCL_STAT_SUSPEND_BY_SRC);
 
              break;
+#endif
 
+#ifndef UTF2000
            case CCL_WriteMultibyteChar2:
              i = reg[RRR]; /* charset */
              if (i == LEADING_BYTE_ASCII)
@@ -1250,6 +1263,7 @@ ccl_driver (struct ccl_program *ccl, CONST unsigned char *source,
              CCL_WRITE_CHAR (i);
 
              break;
+#endif
 
 #if 0
            case CCL_TranslateCharacter:
@@ -1838,7 +1852,7 @@ It returns the contents of write buffer as a string,
   outbuf = Dynarr_new (unsigned_char);
   ccl.last_block = NILP (contin);
   produced = ccl_driver (&ccl, XSTRING_DATA (str), outbuf,
-                        XSTRING_LENGTH (str), (int *)0, CCL_MODE_ENCODING);
+                        XSTRING_LENGTH (str), (int *)0, CCL_MODE_DECODING);
   for (i = 0; i < 8; i++)
     XVECTOR_DATA (status)[i] = make_int(ccl.reg[i]);
   XSETINT (XVECTOR_DATA (status)[8], ccl.ic);