Mercurial > emacs
comparison src/coding.c @ 46859:a26dd8891732
(unencodable_char_position): New function.
(Funencodable_char_position): New function.
(syms_of_coding): Defsubr Funencodable_char_position.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Sun, 11 Aug 2002 01:06:42 +0000 |
parents | 4acadb428f41 |
children | f88c982e1f79 |
comparison
equal
deleted
inserted
replaced
46858:62112f8664f7 | 46859:a26dd8891732 |
---|---|
6496 Fcons (Qno_conversion, safe_codings))); | 6496 Fcons (Qno_conversion, safe_codings))); |
6497 return safe_codings; | 6497 return safe_codings; |
6498 } | 6498 } |
6499 | 6499 |
6500 | 6500 |
6501 /* Search from position POS for such characters that are unencodable | |
6502 accoding to SAFE_CHARS, and return a list of their positions. P | |
6503 points where in the memory the character at POS exists. Limit the | |
6504 search at PEND or when Nth unencodable characters are found. | |
6505 | |
6506 If SAFE_CHARS is a char table, an element for an unencodable | |
6507 character is nil. | |
6508 | |
6509 If SAFE_CHARS is nil, all non-ASCII characters are unencodable. | |
6510 | |
6511 Otherwise, SAFE_CHARS is t, and only eight-bit-contrl and | |
6512 eight-bit-graphic characters are unencodable. */ | |
6513 | |
6514 static Lisp_Object | |
6515 unencodable_char_position (safe_chars, pos, p, pend, n) | |
6516 Lisp_Object safe_chars; | |
6517 int pos; | |
6518 unsigned char *p, *pend; | |
6519 int n; | |
6520 { | |
6521 Lisp_Object pos_list; | |
6522 | |
6523 pos_list = Qnil; | |
6524 while (p < pend) | |
6525 { | |
6526 int len; | |
6527 int c = STRING_CHAR_AND_LENGTH (p, MAX_MULTIBYTE_LENGTH, len); | |
6528 | |
6529 if (c >= 128 | |
6530 && (CHAR_TABLE_P (safe_chars) | |
6531 ? NILP (CHAR_TABLE_REF (safe_chars, c)) | |
6532 : (NILP (safe_chars) || c < 256))) | |
6533 { | |
6534 pos_list = Fcons (make_number (pos), pos_list); | |
6535 if (--n <= 0) | |
6536 break; | |
6537 } | |
6538 pos++; | |
6539 p += len; | |
6540 } | |
6541 return Fnreverse (pos_list); | |
6542 } | |
6543 | |
6544 | |
6545 DEFUN ("unencodable-char-position", Funencodable_char_position, | |
6546 Sunencodable_char_position, 3, 5, 0, | |
6547 doc: /* | |
6548 Return position of first un-encodable character in a region. | |
6549 START and END specfiy the region and CODING-SYSTEM specifies the | |
6550 encoding to check. Return nil if CODING-SYSTEM does encode the region. | |
6551 | |
6552 If optional 4th argument COUNT is non-nil, it specifies at most how | |
6553 many un-encodable characters to search. In this case, the value is a | |
6554 list of positions. | |
6555 | |
6556 If optional 5th argument STRING is non-nil, it is a string to search | |
6557 for un-encodable characters. In that case, START and END are indexes | |
6558 to the string. */) | |
6559 (start, end, coding_system, count, string) | |
6560 Lisp_Object start, end, coding_system, count, string; | |
6561 { | |
6562 int n; | |
6563 Lisp_Object safe_chars; | |
6564 struct coding_system coding; | |
6565 Lisp_Object positions; | |
6566 int from, to; | |
6567 unsigned char *p, *pend; | |
6568 | |
6569 if (NILP (string)) | |
6570 { | |
6571 validate_region (&start, &end); | |
6572 from = XINT (start); | |
6573 to = XINT (end); | |
6574 if (NILP (current_buffer->enable_multibyte_characters)) | |
6575 return Qnil; | |
6576 p = CHAR_POS_ADDR (from); | |
6577 pend = CHAR_POS_ADDR (to); | |
6578 } | |
6579 else | |
6580 { | |
6581 CHECK_STRING (string); | |
6582 CHECK_NATNUM (start); | |
6583 CHECK_NATNUM (end); | |
6584 from = XINT (start); | |
6585 to = XINT (end); | |
6586 if (from > to | |
6587 || to > SCHARS (string)) | |
6588 args_out_of_range_3 (string, start, end); | |
6589 if (! STRING_MULTIBYTE (string)) | |
6590 return Qnil; | |
6591 p = SDATA (string) + string_char_to_byte (string, from); | |
6592 pend = SDATA (string) + string_char_to_byte (string, to); | |
6593 } | |
6594 | |
6595 setup_coding_system (Fcheck_coding_system (coding_system), &coding); | |
6596 | |
6597 if (NILP (count)) | |
6598 n = 1; | |
6599 else | |
6600 { | |
6601 CHECK_NATNUM (count); | |
6602 n = XINT (count); | |
6603 } | |
6604 | |
6605 if (coding.type == coding_type_no_conversion | |
6606 || coding.type == coding_type_raw_text) | |
6607 return Qnil; | |
6608 | |
6609 if (coding.type == coding_type_undecided) | |
6610 safe_chars = Qnil; | |
6611 else | |
6612 safe_chars = coding_safe_chars (&coding); | |
6613 | |
6614 if (STRINGP (string) | |
6615 || from >= GPT || to <= GPT) | |
6616 positions = unencodable_char_position (safe_chars, from, p, pend, n); | |
6617 else | |
6618 { | |
6619 Lisp_Object args[2]; | |
6620 | |
6621 args[0] = unencodable_char_position (safe_chars, from, p, GPT_ADDR, n); | |
6622 n -= Flength (args[0]); | |
6623 if (n <= 0) | |
6624 positions = args[0]; | |
6625 else | |
6626 { | |
6627 args[1] = unencodable_char_position (safe_chars, GPT, GAP_END_ADDR, | |
6628 pend, n); | |
6629 positions = Fappend (2, args); | |
6630 } | |
6631 } | |
6632 | |
6633 return (NILP (count) ? Fcar (positions) : positions); | |
6634 } | |
6635 | |
6636 | |
6501 Lisp_Object | 6637 Lisp_Object |
6502 code_convert_region1 (start, end, coding_system, encodep) | 6638 code_convert_region1 (start, end, coding_system, encodep) |
6503 Lisp_Object start, end, coding_system; | 6639 Lisp_Object start, end, coding_system; |
6504 int encodep; | 6640 int encodep; |
6505 { | 6641 { |
7187 defsubr (&Sread_non_nil_coding_system); | 7323 defsubr (&Sread_non_nil_coding_system); |
7188 defsubr (&Scheck_coding_system); | 7324 defsubr (&Scheck_coding_system); |
7189 defsubr (&Sdetect_coding_region); | 7325 defsubr (&Sdetect_coding_region); |
7190 defsubr (&Sdetect_coding_string); | 7326 defsubr (&Sdetect_coding_string); |
7191 defsubr (&Sfind_coding_systems_region_internal); | 7327 defsubr (&Sfind_coding_systems_region_internal); |
7328 defsubr (&Sunencodable_char_position); | |
7192 defsubr (&Sdecode_coding_region); | 7329 defsubr (&Sdecode_coding_region); |
7193 defsubr (&Sencode_coding_region); | 7330 defsubr (&Sencode_coding_region); |
7194 defsubr (&Sdecode_coding_string); | 7331 defsubr (&Sdecode_coding_string); |
7195 defsubr (&Sencode_coding_string); | 7332 defsubr (&Sencode_coding_string); |
7196 defsubr (&Sdecode_sjis_char); | 7333 defsubr (&Sdecode_sjis_char); |