diff options
| author | Kenichi Handa | 1997-08-10 05:54:48 +0000 |
|---|---|---|
| committer | Kenichi Handa | 1997-08-10 05:54:48 +0000 |
| commit | 6e85d753e71c92a035fb949f07fc722391778166 (patch) | |
| tree | e85391e5f311d404c5d1294b9faa2ab60d4faf1d /src/coding.c | |
| parent | e6de76f88dea6fe33f247d6fadce4e14f3fc558c (diff) | |
| download | emacs-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.c | 225 |
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 | ||