#include "lisp.h"
#include "buffer.h"
-#include "mule-charset.h"
+#include "character.h"
#include "mule-ccl.h"
#include "file-coding.h"
IC += 2;
*/
-#define CCL_Extention 0x1F /* Extended CCL code
+#define CCL_Extension 0x1F /* Extended CCL code
1:ExtendedCOMMNDRrrRRRrrrXXXXX
2:ARGUMENT
3:...
/* If this variable is non-zero, it indicates the stack_idx
of immediately called by CCL_MapMultiple. */
-static int stack_idx_of_map_multiple = 0;
+static int stack_idx_of_map_multiple;
#define PUSH_MAPPING_STACK(restlen, orig) \
do { \
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
#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
#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
#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
CCL_INVALID_CMD; \
if (conversion_mode == CCL_MODE_ENCODING) \
{ \
- if (ch == '\n') \
+ if ((ch) == '\n') \
{ \
if (ccl->eol_type == CCL_CODING_EOL_CRLF) \
{ \
else \
Dynarr_add (destination, '\n'); \
} \
- else if (ch < 0x100) \
+ else if ((ch) < 0x100) \
{ \
Dynarr_add (destination, ch); \
} \
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; \
} \
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; \
if (!src) \
CCL_INVALID_CMD; \
if (src < src_end) \
- r = *src++; \
+ (r) = *src++; \
else \
{ \
if (ccl->last_block) \
} \
} 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
#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
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++;
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)
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)
reg[RRR] = LEADING_BYTE_ASCII;
reg[rrr] = i;
}
- break;
- } while (1);
break;
ccl_read_multibyte_character_suspend:
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
for (;i < j;i++)
{
-
size = XVECTOR (Vcode_conversion_map_vector)->size;
point = XINT (ccl_prog[ic++]);
if (point >= size) continue;
/* +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]);
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);