(U-0002195D): Add `ideographic-structure'; add `sound@ja/on'; add
[chise/xemacs-chise.git.1] / src / mule-ccl.c
index 0029611..1907762 100644 (file)
@@ -31,7 +31,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"
 
@@ -423,7 +423,7 @@ Lisp_Object Vccl_program_table;
                                          IC += 2;
                                        */
 
-#define CCL_Extention          0x1F /* Extended CCL code
+#define CCL_Extension          0x1F /* Extended CCL code
                                        1:ExtendedCOMMNDRrrRRRrrrXXXXX
                                        2:ARGUMENT
                                        3:...
@@ -634,7 +634,9 @@ static int stack_idx_of_map_multiple;
     stack_idx++;                                               \
     ccl_prog = called_ccl.prog;                                        \
     ic = CCL_HEADER_MAIN;                                      \
-    goto ccl_repeat;                                           \
+    /* The "if (1)" prevents warning                           \
+       "end-of loop code not reached" */                       \
+    if (1) goto ccl_repeat;                                    \
   } while (0)
 
 #define CCL_MapSingle          0x12 /* Map by single code conversion map
@@ -678,7 +680,9 @@ static int stack_idx_of_map_multiple;
 #define CCL_SUCCESS                    \
   do {                                 \
     ccl->status = CCL_STAT_SUCCESS;    \
-    goto ccl_finish;                   \
+  /* The "if (1)" inhibits the warning \
+     "end-of loop code not reached" */ \
+  if (1) goto ccl_finish;              \
   } while (0)
 
 /* Suspend CCL program because of reading from empty input buffer or
@@ -687,8 +691,10 @@ static int stack_idx_of_map_multiple;
 #define CCL_SUSPEND(stat)      \
   do {                         \
     ic--;                      \
-    ccl->status = stat;                \
-    goto ccl_finish;           \
+  ccl->status = (stat);                        \
+  /* The "if (1)" inhibits the warning \
+     "end-of loop code not reached" */ \
+  if (1) goto ccl_finish;              \
   } while (0)
 
 /* Terminate CCL program because of invalid command.  Should not occur
@@ -696,7 +702,9 @@ static int stack_idx_of_map_multiple;
 #define CCL_INVALID_CMD                        \
   do {                                 \
     ccl->status = CCL_STAT_INVALID_CMD;        \
-    goto ccl_error_handler;            \
+  /* The "if (1)" inhibits the warning \
+     "end-of loop code not reached" */ \
+  if (1) goto ccl_error_handler;       \
   } while (0)
 
 /* Encode one character CH to multibyte form and write to the current
@@ -709,7 +717,7 @@ static int stack_idx_of_map_multiple;
       CCL_INVALID_CMD;                                         \
     if (conversion_mode == CCL_MODE_ENCODING)                  \
       {                                                                \
-       if (ch == '\n')                                         \
+       if ((ch) == '\n')                                       \
          {                                                     \
            if (ccl->eol_type == CCL_CODING_EOL_CRLF)           \
              {                                                 \
@@ -721,7 +729,7 @@ static int stack_idx_of_map_multiple;
            else                                                \
              Dynarr_add (destination, '\n');                   \
          }                                                     \
-       else if (ch < 0x100)                                    \
+       else if ((ch) < 0x100)                                  \
          {                                                     \
            Dynarr_add (destination, ch);                       \
          }                                                     \
@@ -760,7 +768,7 @@ static int stack_idx_of_map_multiple;
       CCL_INVALID_CMD;                                         \
     else if (conversion_mode == CCL_MODE_ENCODING)             \
       {                                                                \
-       for (i = 0; i < len; i++)                               \
+       for (i = 0; i < (len); i++)                             \
          {                                                     \
            ch = ((XINT (ccl_prog[ic + (i / 3)]))               \
                  >> ((2 - (i % 3)) * 8)) & 0xFF;               \
@@ -789,7 +797,7 @@ static int stack_idx_of_map_multiple;
       }                                                                \
     else                                                       \
       {                                                                \
-       for (i = 0; i < len; i++)                               \
+       for (i = 0; i < (len); i++)                             \
          {                                                     \
            ch = ((XINT (ccl_prog[ic + (i / 3)]))               \
                  >> ((2 - (i % 3)) * 8)) & 0xFF;               \
@@ -812,7 +820,7 @@ static int stack_idx_of_map_multiple;
     if (!src)                                          \
       CCL_INVALID_CMD;                                 \
     if (src < src_end)                                 \
-      r = *src++;                                      \
+      (r) = *src++;                                    \
     else                                               \
       {                                                        \
        if (ccl->last_block)                            \
@@ -825,6 +833,9 @@ static int stack_idx_of_map_multiple;
       }                                                        \
   } while (0)
 
+#define POSSIBLE_LEADING_BYTE_P(leading_byte) \
+  ((leading_byte > MIN_LEADING_BYTE) && \
+   (leading_byte - MIN_LEADING_BYTE) < NUM_LEADING_BYTES)
 
 /* 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
@@ -837,20 +848,20 @@ static int stack_idx_of_map_multiple;
 #if 0
 #define CCL_MAKE_CHAR(charset, code, c)                                \
   do {                                                         \
-    if (charset == CHARSET_ASCII)                              \
-      c = code & 0xFF;                                         \
+    if ((charset) == CHARSET_ASCII)                            \
+      (c) = (code) & 0xFF;                                             \
     else if (CHARSET_DEFINED_P (charset)                       \
-            && (code & 0x7F) >= 32                             \
-            && (code < 256 || ((code >> 7) & 0x7F) >= 32))     \
+            && ((code) & 0x7F) >= 32                           \
+            && ((code) < 256 || ((code >> 7) & 0x7F) >= 32))   \
       {                                                                \
-       int c1 = code & 0x7F, c2 = 0;                           \
+       int c1 = (code) & 0x7F, c2 = 0;                         \
                                                                \
-       if (code >= 256)                                        \
-         c2 = c1, c1 = (code >> 7) & 0x7F;                     \
-       c = MAKE_CHAR (charset, c1, c2);                        \
+       if ((code) >= 256)                                      \
+         c2 = c1, c1 = ((code) >> 7) & 0x7F;                   \
+       (c) = MAKE_CHAR (charset, c1, c2);                      \
       }                                                                \
     else                                                       \
-      c = code & 0xFF;                                         \
+      (c) = (code) & 0xFF;                                             \
   } while (0)
 #endif
 
@@ -1268,14 +1279,14 @@ ccl_driver (struct ccl_program *ccl,
            ic = jump_address;
          break;
 
-       case CCL_Extention:
+       case CCL_Extension:
          switch (EXCMD)
            {
+#ifndef UTF2000
            case CCL_ReadMultibyteChar2:
              if (!src)
                CCL_INVALID_CMD;
 
-             do {
                if (src >= src_end)
                  {
                    src++;
@@ -1289,6 +1300,16 @@ ccl_driver (struct ccl_program *ccl,
                    reg[rrr] = i;
                    reg[RRR] = LEADING_BYTE_ASCII;
                  }
+               /* Previously, these next two elses were reversed in order,
+                  which should have worked fine, but is more fragile than
+                  this order. */
+               else if (LEADING_BYTE_CONTROL_1 == i)
+                 {
+                   if (src >= src_end)
+                     goto ccl_read_multibyte_character_suspend;
+                   reg[RRR] = i;
+                   reg[rrr] = (*src++ - 0xA0);
+                 }
                else if (i <= MAX_LEADING_BYTE_OFFICIAL_1)
                  {
                    if (src >= src_end)
@@ -1296,6 +1317,13 @@ ccl_driver (struct ccl_program *ccl,
                    reg[RRR] = i;
                    reg[rrr] = (*src++ & 0x7F);
                  }
+               else if (LEADING_BYTE_CONTROL_1 == i)
+                 {
+                   if (src >= src_end)
+                     goto ccl_read_multibyte_character_suspend;
+                   reg[RRR] = i;
+                   reg[rrr] = (*src++ - 0xA0);
+                 }
                else if (i <= MAX_LEADING_BYTE_OFFICIAL_2)
                  {
                    if ((src + 1) >= src_end)
@@ -1327,8 +1355,6 @@ ccl_driver (struct ccl_program *ccl,
                    reg[RRR] = LEADING_BYTE_ASCII;
                    reg[rrr] = i;
                  }
-               break;
-             } while (1);
              break;
 
            ccl_read_multibyte_character_suspend:
@@ -1342,22 +1368,39 @@ ccl_driver (struct ccl_program *ccl,
                CCL_SUSPEND (CCL_STAT_SUSPEND_BY_SRC);
 
              break;
+#endif
 
+#ifndef UTF2000
            case CCL_WriteMultibyteChar2:
              i = reg[RRR]; /* charset */
-             if (i == LEADING_BYTE_ASCII)
+             if (i == LEADING_BYTE_ASCII) 
                i = reg[rrr] & 0xFF;
-             else if (XCHARSET_DIMENSION (CHARSET_BY_LEADING_BYTE (i)) == 1)
-               i = (((i - FIELD2_TO_OFFICIAL_LEADING_BYTE) << 7)
-                    | (reg[rrr] & 0x7F));
-             else if (i < MAX_LEADING_BYTE_OFFICIAL_2)
-               i = ((i - FIELD1_TO_OFFICIAL_LEADING_BYTE) << 14) | reg[rrr];
-             else
-               i = ((i - FIELD1_TO_PRIVATE_LEADING_BYTE) << 14) | reg[rrr];
+             else if (LEADING_BYTE_CONTROL_1 == i)
+               i = ((reg[rrr] & 0xFF) - 0xA0);
+             else if (POSSIBLE_LEADING_BYTE_P(i) &&
+                      !NILP(CHARSET_BY_LEADING_BYTE(i)))
+               {
+                 if (XCHARSET_DIMENSION (CHARSET_BY_LEADING_BYTE (i)) == 1)
+                   i = (((i - FIELD2_TO_OFFICIAL_LEADING_BYTE) << 7)
+                        | (reg[rrr] & 0x7F));
+                 else if (i <= MAX_LEADING_BYTE_OFFICIAL_2)
+                   i = ((i - FIELD1_TO_OFFICIAL_LEADING_BYTE) << 14) 
+                     | reg[rrr];
+                 else
+                   i = ((i - FIELD1_TO_PRIVATE_LEADING_BYTE) << 14) | reg[rrr];
+               }
+             else 
+               {
+                 /* No charset we know about; use U+3012 GETA MARK */
+                 i = MAKE_CHAR
+                   (CHARSET_BY_LEADING_BYTE(LEADING_BYTE_JAPANESE_JISX0208),
+                    34, 46);
+               }
 
              CCL_WRITE_CHAR (i);
 
              break;
+#endif
 
            case CCL_TranslateCharacter:
 #if 0
@@ -1412,7 +1455,6 @@ ccl_driver (struct ccl_program *ccl,
 
                for (;i < j;i++)
                  {
-
                    size = XVECTOR (Vcode_conversion_map_vector)->size;
                    point = XINT (ccl_prog[ic++]);
                    if (point >= size) continue;
@@ -1580,7 +1622,7 @@ ccl_driver (struct ccl_program *ccl,
                          /* +1 is for including separator. */
                          point = -point + 1;
                          if (mapping_stack_pointer
-                             >= &mapping_stack[MAX_MAP_SET_LEVEL])
+                             >= mapping_stack + countof (mapping_stack))
                            CCL_INVALID_CMD;
                          PUSH_MAPPING_STACK (map_set_rest_length - point,
                                              reg[rrr]);
@@ -1661,7 +1703,7 @@ ccl_driver (struct ccl_program *ccl,
                      else if (SYMBOLP (content))
                        {
                          if (mapping_stack_pointer
-                             >= &mapping_stack[MAX_MAP_SET_LEVEL])
+                             >= mapping_stack + countof (mapping_stack))
                            CCL_INVALID_CMD;
                          PUSH_MAPPING_STACK (map_set_rest_length, reg[rrr]);
                          PUSH_MAPPING_STACK (map_set_rest_length, op);