Function: find-coding-systems-region-internal
find-coding-systems-region-internal is a function defined in coding.c.
Signature
(find-coding-systems-region-internal START END &optional EXCLUDE)
Documentation
Internal use only.
Source Code
// Defined in /usr/src/emacs/src/coding.c
{
Lisp_Object coding_attrs_list, safe_codings;
ptrdiff_t start_byte, end_byte;
const unsigned char *p, *pbeg, *pend;
int c;
Lisp_Object tail, elt, work_table;
if (STRINGP (start))
{
if (!STRING_MULTIBYTE (start)
|| SCHARS (start) == SBYTES (start))
return Qt;
start_byte = 0;
end_byte = SBYTES (start);
}
else
{
EMACS_INT s = fix_position (start);
EMACS_INT e = fix_position (end);
if (! (BEG <= s && s <= e && e <= Z))
args_out_of_range (start, end);
if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
return Qt;
start_byte = CHAR_TO_BYTE (s);
end_byte = CHAR_TO_BYTE (e);
if (e - s == end_byte - start_byte)
return Qt;
if (s < GPT && GPT < e)
{
if (GPT - s < e - GPT)
move_gap_both (s, start_byte);
else
move_gap_both (e, end_byte);
}
}
coding_attrs_list = Qnil;
for (tail = Vcoding_system_list; CONSP (tail); tail = XCDR (tail))
if (NILP (exclude)
|| NILP (Fmemq (XCAR (tail), exclude)))
{
Lisp_Object attrs;
attrs = AREF (CODING_SYSTEM_SPEC (XCAR (tail)), 0);
if (EQ (XCAR (tail), CODING_ATTR_BASE_NAME (attrs)))
{
ASET (attrs, coding_attr_trans_tbl,
get_translation_table (attrs, 1, NULL));
coding_attrs_list = Fcons (attrs, coding_attrs_list);
}
}
if (STRINGP (start))
p = pbeg = SDATA (start);
else
p = pbeg = BYTE_POS_ADDR (start_byte);
pend = p + (end_byte - start_byte);
while (p < pend && ASCII_CHAR_P (*p)) p++;
while (p < pend && ASCII_CHAR_P (*(pend - 1))) pend--;
work_table = Fmake_char_table (Qnil, Qnil);
while (p < pend)
{
if (ASCII_CHAR_P (*p))
p++;
else
{
c = string_char_advance (&p);
if (!NILP (char_table_ref (work_table, c)))
/* This character was already checked. Ignore it. */
continue;
charset_map_loaded = 0;
for (tail = coding_attrs_list; CONSP (tail);)
{
elt = XCAR (tail);
if (NILP (elt))
tail = XCDR (tail);
else if (char_encodable_p (c, elt))
tail = XCDR (tail);
else if (CONSP (XCDR (tail)))
{
XSETCAR (tail, XCAR (XCDR (tail)));
XSETCDR (tail, XCDR (XCDR (tail)));
}
else
{
XSETCAR (tail, Qnil);
tail = XCDR (tail);
}
}
if (charset_map_loaded)
{
ptrdiff_t p_offset = p - pbeg, pend_offset = pend - pbeg;
if (STRINGP (start))
pbeg = SDATA (start);
else
pbeg = BYTE_POS_ADDR (start_byte);
p = pbeg + p_offset;
pend = pbeg + pend_offset;
}
char_table_set (work_table, c, Qt);
}
}
safe_codings = list2 (Qraw_text, Qno_conversion);
for (tail = coding_attrs_list; CONSP (tail); tail = XCDR (tail))
if (! NILP (XCAR (tail)))
safe_codings = Fcons (CODING_ATTR_BASE_NAME (XCAR (tail)), safe_codings);
return safe_codings;
}