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;
}