X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-ccl.c;h=1907762d83de6b0a19f667cf04d44bf474617e7e;hb=27d956d0eb66388b5ba8c31e1764c625fdd36b7b;hp=0029611c09ce2fa976c2b246209a5e62b46d780f;hpb=2b7371e841478fd7b9bc7e4d9a515e0c26b9ed9a;p=chise%2Fxemacs-chise.git.1 diff --git a/src/mule-ccl.c b/src/mule-ccl.c index 0029611..1907762 100644 --- a/src/mule-ccl.c +++ b/src/mule-ccl.c @@ -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);