aboutsummaryrefslogtreecommitdiffstats
path: root/src/coding.c
diff options
context:
space:
mode:
authorKenichi Handa1997-08-10 05:54:48 +0000
committerKenichi Handa1997-08-10 05:54:48 +0000
commit6e85d753e71c92a035fb949f07fc722391778166 (patch)
treee85391e5f311d404c5d1294b9faa2ab60d4faf1d /src/coding.c
parente6de76f88dea6fe33f247d6fadce4e14f3fc558c (diff)
downloademacs-6e85d753e71c92a035fb949f07fc722391778166.tar.gz
emacs-6e85d753e71c92a035fb949f07fc722391778166.zip
(Fset_terminal_coding_system_internal): Set
CODING_FLAG_ISO_SAFE in terminal_coding.flags. (ENCODE_ISO_CHARACTER_DIMENSION1): Check CODING_SPEC_ISO_EXPECTED_CHARSETS. (ENCODE_ISO_CHARACTER_DIMENSION2): Likewise.
Diffstat (limited to 'src/coding.c')
-rw-r--r--src/coding.c225
1 files changed, 116 insertions, 109 deletions
diff --git a/src/coding.c b/src/coding.c
index beb4de911dc..1649dae6854 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -1182,88 +1182,86 @@ decode_coding_iso2022 (coding, source, destination,
1182 sequences are also produced in advance if necessary. */ 1182 sequences are also produced in advance if necessary. */
1183 1183
1184 1184
1185#define ENCODE_ISO_CHARACTER_DIMENSION1(charset, c1) \ 1185#define ENCODE_ISO_CHARACTER_DIMENSION1(charset, c1) \
1186 do { \ 1186 do { \
1187 if (CODING_SPEC_ISO_SINGLE_SHIFTING (coding)) \ 1187 if (CODING_SPEC_ISO_SINGLE_SHIFTING (coding)) \
1188 { \ 1188 { \
1189 if (coding->flags & CODING_FLAG_ISO_SEVEN_BITS) \ 1189 if (coding->flags & CODING_FLAG_ISO_SEVEN_BITS) \
1190 *dst++ = c1 & 0x7F; \ 1190 *dst++ = c1 & 0x7F; \
1191 else \ 1191 else \
1192 *dst++ = c1 | 0x80; \ 1192 *dst++ = c1 | 0x80; \
1193 CODING_SPEC_ISO_SINGLE_SHIFTING (coding) = 0; \ 1193 CODING_SPEC_ISO_SINGLE_SHIFTING (coding) = 0; \
1194 break; \ 1194 break; \
1195 } \ 1195 } \
1196 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 0)) \ 1196 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 0)) \
1197 { \ 1197 { \
1198 *dst++ = c1 & 0x7F; \ 1198 *dst++ = c1 & 0x7F; \
1199 break; \ 1199 break; \
1200 } \ 1200 } \
1201 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 1)) \ 1201 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 1)) \
1202 { \ 1202 { \
1203 *dst++ = c1 | 0x80; \ 1203 *dst++ = c1 | 0x80; \
1204 break; \ 1204 break; \
1205 } \ 1205 } \
1206 else if (coding->flags & CODING_FLAG_ISO_SAFE \ 1206 else if (coding->flags & CODING_FLAG_ISO_SAFE \
1207 && (CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) \ 1207 && !CODING_SPEC_ISO_EXPECTED_CHARSETS (coding)[charset]) \
1208 == CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION)) \ 1208 { \
1209 { \ 1209 /* We should not encode this character, instead produce one or \
1210 /* We should not encode this character, instead produce one or \ 1210 two `?'s. */ \
1211 two `?'s. */ \ 1211 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \
1212 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \ 1212 if (CHARSET_WIDTH (charset) == 2) \
1213 if (CHARSET_WIDTH (charset) == 2) \ 1213 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \
1214 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \ 1214 break; \
1215 break; \ 1215 } \
1216 } \ 1216 else \
1217 else \ 1217 /* Since CHARSET is not yet invoked to any graphic planes, we \
1218 /* Since CHARSET is not yet invoked to any graphic planes, we \ 1218 must invoke it, or, at first, designate it to some graphic \
1219 must invoke it, or, at first, designate it to some graphic \ 1219 register. Then repeat the loop to actually produce the \
1220 register. Then repeat the loop to actually produce the \ 1220 character. */ \
1221 character. */ \ 1221 dst = encode_invocation_designation (charset, coding, dst); \
1222 dst = encode_invocation_designation (charset, coding, dst); \
1223 } while (1) 1222 } while (1)
1224 1223
1225/* Produce codes for a DIMENSION2 character whose character set is 1224/* Produce codes for a DIMENSION2 character whose character set is
1226 CHARSET and whose position-codes are C1 and C2. Designation and 1225 CHARSET and whose position-codes are C1 and C2. Designation and
1227 invocation codes are also produced in advance if necessary. */ 1226 invocation codes are also produced in advance if necessary. */
1228 1227
1229#define ENCODE_ISO_CHARACTER_DIMENSION2(charset, c1, c2) \ 1228#define ENCODE_ISO_CHARACTER_DIMENSION2(charset, c1, c2) \
1230 do { \ 1229 do { \
1231 if (CODING_SPEC_ISO_SINGLE_SHIFTING (coding)) \ 1230 if (CODING_SPEC_ISO_SINGLE_SHIFTING (coding)) \
1232 { \ 1231 { \
1233 if (coding->flags & CODING_FLAG_ISO_SEVEN_BITS) \ 1232 if (coding->flags & CODING_FLAG_ISO_SEVEN_BITS) \
1234 *dst++ = c1 & 0x7F, *dst++ = c2 & 0x7F; \ 1233 *dst++ = c1 & 0x7F, *dst++ = c2 & 0x7F; \
1235 else \ 1234 else \
1236 *dst++ = c1 | 0x80, *dst++ = c2 | 0x80; \ 1235 *dst++ = c1 | 0x80, *dst++ = c2 | 0x80; \
1237 CODING_SPEC_ISO_SINGLE_SHIFTING (coding) = 0; \ 1236 CODING_SPEC_ISO_SINGLE_SHIFTING (coding) = 0; \
1238 break; \ 1237 break; \
1239 } \ 1238 } \
1240 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 0)) \ 1239 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 0)) \
1241 { \ 1240 { \
1242 *dst++ = c1 & 0x7F, *dst++= c2 & 0x7F; \ 1241 *dst++ = c1 & 0x7F, *dst++= c2 & 0x7F; \
1243 break; \ 1242 break; \
1244 } \ 1243 } \
1245 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 1)) \ 1244 else if (charset == CODING_SPEC_ISO_PLANE_CHARSET (coding, 1)) \
1246 { \ 1245 { \
1247 *dst++ = c1 | 0x80, *dst++= c2 | 0x80; \ 1246 *dst++ = c1 | 0x80, *dst++= c2 | 0x80; \
1248 break; \ 1247 break; \
1249 } \ 1248 } \
1250 else if (coding->flags & CODING_FLAG_ISO_SAFE \ 1249 else if (coding->flags & CODING_FLAG_ISO_SAFE \
1251 && (CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) \ 1250 && !CODING_SPEC_ISO_EXPECTED_CHARSETS (coding)[charset]) \
1252 == CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION)) \ 1251 { \
1253 { \ 1252 /* We should not encode this character, instead produce one or \
1254 /* We should not encode this character, instead produce one or \ 1253 two `?'s. */ \
1255 two `?'s. */ \ 1254 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \
1256 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \ 1255 if (CHARSET_WIDTH (charset) == 2) \
1257 if (CHARSET_WIDTH (charset) == 2) \ 1256 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \
1258 *dst++ = CODING_INHIBIT_CHARACTER_SUBSTITUTION; \ 1257 break; \
1259 break; \ 1258 } \
1260 } \ 1259 else \
1261 else \ 1260 /* Since CHARSET is not yet invoked to any graphic planes, we \
1262 /* Since CHARSET is not yet invoked to any graphic planes, we \ 1261 must invoke it, or, at first, designate it to some graphic \
1263 must invoke it, or, at first, designate it to some graphic \ 1262 register. Then repeat the loop to actually produce the \
1264 register. Then repeat the loop to actually produce the \ 1263 character. */ \
1265 character. */ \ 1264 dst = encode_invocation_designation (charset, coding, dst); \
1266 dst = encode_invocation_designation (charset, coding, dst); \
1267 } while (1) 1265 } while (1)
1268 1266
1269#define ENCODE_ISO_CHARACTER(charset, c1, c2) \ 1267#define ENCODE_ISO_CHARACTER(charset, c1, c2) \
@@ -2380,9 +2378,9 @@ setup_coding_system (coding_system, coding)
2380 CODING_SPEC_ISO_INVOCATION (coding, 1) 2378 CODING_SPEC_ISO_INVOCATION (coding, 1)
2381 = (coding->flags & CODING_FLAG_ISO_SEVEN_BITS ? -1 : 1); 2379 = (coding->flags & CODING_FLAG_ISO_SEVEN_BITS ? -1 : 1);
2382 /* Not single shifting at first. */ 2380 /* Not single shifting at first. */
2383 CODING_SPEC_ISO_SINGLE_SHIFTING(coding) = 0; 2381 CODING_SPEC_ISO_SINGLE_SHIFTING (coding) = 0;
2384 /* Beginning of buffer should also be regarded as bol. */ 2382 /* Beginning of buffer should also be regarded as bol. */
2385 CODING_SPEC_ISO_BOL(coding) = 1; 2383 CODING_SPEC_ISO_BOL (coding) = 1;
2386 2384
2387 /* Checks FLAGS[REG] (REG = 0, 1, 2 3) and decide designations. 2385 /* Checks FLAGS[REG] (REG = 0, 1, 2 3) and decide designations.
2388 FLAGS[REG] can be one of below: 2386 FLAGS[REG] can be one of below:
@@ -2397,6 +2395,7 @@ setup_coding_system (coding_system, coding)
2397 for (charset = 0; charset <= MAX_CHARSET; charset++) 2395 for (charset = 0; charset <= MAX_CHARSET; charset++)
2398 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) 2396 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset)
2399 = CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION; 2397 = CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION;
2398 bzero (CODING_SPEC_ISO_EXPECTED_CHARSETS (coding), MAX_CHARSET + 1);
2400 for (i = 0; i < 4; i++) 2399 for (i = 0; i < 4; i++)
2401 { 2400 {
2402 if (INTEGERP (flags[i]) 2401 if (INTEGERP (flags[i])
@@ -2405,6 +2404,7 @@ setup_coding_system (coding_system, coding)
2405 { 2404 {
2406 CODING_SPEC_ISO_INITIAL_DESIGNATION (coding, i) = charset; 2405 CODING_SPEC_ISO_INITIAL_DESIGNATION (coding, i) = charset;
2407 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) = i; 2406 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) = i;
2407 CODING_SPEC_ISO_EXPECTED_CHARSETS (coding)[charset] = 1;
2408 } 2408 }
2409 else if (EQ (flags[i], Qt)) 2409 else if (EQ (flags[i], Qt))
2410 { 2410 {
@@ -2422,6 +2422,7 @@ setup_coding_system (coding_system, coding)
2422 { 2422 {
2423 CODING_SPEC_ISO_INITIAL_DESIGNATION (coding, i) = charset; 2423 CODING_SPEC_ISO_INITIAL_DESIGNATION (coding, i) = charset;
2424 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) =i; 2424 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) =i;
2425 CODING_SPEC_ISO_EXPECTED_CHARSETS (coding)[charset] = 1;
2425 } 2426 }
2426 else 2427 else
2427 CODING_SPEC_ISO_INITIAL_DESIGNATION (coding, i) = -1; 2428 CODING_SPEC_ISO_INITIAL_DESIGNATION (coding, i) = -1;
@@ -2432,8 +2433,12 @@ setup_coding_system (coding_system, coding)
2432 && (charset = XINT (XCONS (tail)->car), 2433 && (charset = XINT (XCONS (tail)->car),
2433 CHARSET_VALID_P (charset)) 2434 CHARSET_VALID_P (charset))
2434 || (charset = get_charset_id (XCONS (tail)->car)) >= 0) 2435 || (charset = get_charset_id (XCONS (tail)->car)) >= 0)
2435 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) 2436 {
2436 = i; 2437 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset)
2438 = i;
2439 CODING_SPEC_ISO_EXPECTED_CHARSETS (coding)[charset]
2440 = 1;
2441 }
2437 else if (EQ (XCONS (tail)->car, Qt)) 2442 else if (EQ (XCONS (tail)->car, Qt))
2438 default_reg_bits |= 1 << i; 2443 default_reg_bits |= 1 << i;
2439 tail = XCONS (tail)->cdr; 2444 tail = XCONS (tail)->cdr;
@@ -2456,35 +2461,34 @@ setup_coding_system (coding_system, coding)
2456 default_reg_bits &= 3; 2461 default_reg_bits &= 3;
2457 } 2462 }
2458 2463
2459 if (! (coding->flags & CODING_FLAG_ISO_SAFE)) 2464 for (charset = 0; charset <= MAX_CHARSET; charset++)
2460 for (charset = 0; charset <= MAX_CHARSET; charset++) 2465 if (CHARSET_VALID_P (charset)
2461 if (CHARSET_VALID_P (charset) 2466 && (CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset)
2462 && (CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) 2467 == CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION))
2463 == CODING_SPEC_ISO_NO_REQUESTED_DESIGNATION)) 2468 {
2464 { 2469 /* We have not yet decided where to designate CHARSET. */
2465 /* We have not yet decided where to designate CHARSET. */ 2470 int reg_bits = default_reg_bits;
2466 int reg_bits = default_reg_bits; 2471
2467 2472 if (CHARSET_CHARS (charset) == 96)
2468 if (CHARSET_CHARS (charset) == 96) 2473 /* A charset of CHARS96 can't be designated to REG 0. */
2469 /* A charset of CHARS96 can't be designated to REG 0. */ 2474 reg_bits &= ~1;
2470 reg_bits &= ~1; 2475
2471 2476 if (reg_bits)
2472 if (reg_bits) 2477 /* There exist some default graphic register. */
2473 /* There exist some default graphic register. */ 2478 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset)
2474 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) 2479 = (reg_bits & 1
2475 = (reg_bits & 1 2480 ? 0 : (reg_bits & 2 ? 1 : (reg_bits & 4 ? 2 : 3)));
2476 ? 0 : (reg_bits & 2 ? 1 : (reg_bits & 4 ? 2 : 3))); 2481 else
2477 else 2482 /* We anyway have to designate CHARSET to somewhere. */
2478 /* We anyway have to designate CHARSET to somewhere. */ 2483 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset)
2479 CODING_SPEC_ISO_REQUESTED_DESIGNATION (coding, charset) 2484 = (CHARSET_CHARS (charset) == 94
2480 = (CHARSET_CHARS (charset) == 94 2485 ? 0
2481 ? 0 2486 : ((coding->flags & CODING_FLAG_ISO_LOCKING_SHIFT
2482 : ((coding->flags & CODING_FLAG_ISO_LOCKING_SHIFT 2487 || ! coding->flags & CODING_FLAG_ISO_SEVEN_BITS)
2483 || ! coding->flags & CODING_FLAG_ISO_SEVEN_BITS) 2488 ? 1
2484 ? 1 2489 : (coding->flags & CODING_FLAG_ISO_SINGLE_SHIFT
2485 : (coding->flags & CODING_FLAG_ISO_SINGLE_SHIFT 2490 ? 2 : 0)));
2486 ? 2 : 0))); 2491 }
2487 }
2488 } 2492 }
2489 coding->require_flushing = 1; 2493 coding->require_flushing = 1;
2490 break; 2494 break;
@@ -3585,6 +3589,9 @@ DEFUN ("set-terminal-coding-system-internal",
3585{ 3589{
3586 CHECK_SYMBOL (coding_system, 0); 3590 CHECK_SYMBOL (coding_system, 0);
3587 setup_coding_system (Fcheck_coding_system (coding_system), &terminal_coding); 3591 setup_coding_system (Fcheck_coding_system (coding_system), &terminal_coding);
3592 /* We had better not send unexpected characters to terminal. */
3593 terminal_coding.flags |= CODING_FLAG_ISO_SAFE;
3594
3588 return Qnil; 3595 return Qnil;
3589} 3596}
3590 3597