comparison src/coding.c @ 103486:091a55d2d6f7

(Ffind_coding_systems_region_internal): Cache checked characters.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Fri, 19 Jun 2009 08:39:33 +0000
parents 7ead50363544
children e2d67c929da2
comparison
equal deleted inserted replaced
103485:40b49259dd71 103486:091a55d2d6f7
8638 { 8638 {
8639 Lisp_Object coding_attrs_list, safe_codings; 8639 Lisp_Object coding_attrs_list, safe_codings;
8640 EMACS_INT start_byte, end_byte; 8640 EMACS_INT start_byte, end_byte;
8641 const unsigned char *p, *pbeg, *pend; 8641 const unsigned char *p, *pbeg, *pend;
8642 int c; 8642 int c;
8643 Lisp_Object tail, elt; 8643 Lisp_Object tail, elt, work_table;
8644 8644
8645 if (STRINGP (start)) 8645 if (STRINGP (start))
8646 { 8646 {
8647 if (!STRING_MULTIBYTE (start) 8647 if (!STRING_MULTIBYTE (start)
8648 || SCHARS (start) == SBYTES (start)) 8648 || SCHARS (start) == SBYTES (start))
8696 pend = p + (end_byte - start_byte); 8696 pend = p + (end_byte - start_byte);
8697 8697
8698 while (p < pend && ASCII_BYTE_P (*p)) p++; 8698 while (p < pend && ASCII_BYTE_P (*p)) p++;
8699 while (p < pend && ASCII_BYTE_P (*(pend - 1))) pend--; 8699 while (p < pend && ASCII_BYTE_P (*(pend - 1))) pend--;
8700 8700
8701 work_table = Fmake_char_table (Qnil, Qnil);
8701 while (p < pend) 8702 while (p < pend)
8702 { 8703 {
8703 if (ASCII_BYTE_P (*p)) 8704 if (ASCII_BYTE_P (*p))
8704 p++; 8705 p++;
8705 else 8706 else
8706 { 8707 {
8707 c = STRING_CHAR_ADVANCE (p); 8708 c = STRING_CHAR_ADVANCE (p);
8709 if (!NILP (char_table_ref (work_table, c)))
8710 /* This character was already checked. Ignore it. */
8711 continue;
8708 8712
8709 charset_map_loaded = 0; 8713 charset_map_loaded = 0;
8710 for (tail = coding_attrs_list; CONSP (tail);) 8714 for (tail = coding_attrs_list; CONSP (tail);)
8711 { 8715 {
8712 elt = XCAR (tail); 8716 elt = XCAR (tail);
8734 else 8738 else
8735 pbeg = BYTE_POS_ADDR (start_byte); 8739 pbeg = BYTE_POS_ADDR (start_byte);
8736 p = pbeg + p_offset; 8740 p = pbeg + p_offset;
8737 pend = pbeg + pend_offset; 8741 pend = pbeg + pend_offset;
8738 } 8742 }
8743 char_table_set (work_table, c, Qt);
8739 } 8744 }
8740 } 8745 }
8741 8746
8742 safe_codings = list2 (Qraw_text, Qno_conversion); 8747 safe_codings = list2 (Qraw_text, Qno_conversion);
8743 for (tail = coding_attrs_list; CONSP (tail); tail = XCDR (tail)) 8748 for (tail = coding_attrs_list; CONSP (tail); tail = XCDR (tail))