Function: set-coding-system-priority

set-coding-system-priority is a function defined in coding.c.

Signature

(set-coding-system-priority &rest coding-systems)

Documentation

Assign higher priority to the coding systems given as arguments.

If multiple coding systems belong to the same category, all but the first one are ignored.

View in manual

Probably introduced at or before Emacs version 23.1.

Source Code

// Defined in /usr/src/emacs/src/coding.c
{
  ptrdiff_t i, j;
  bool changed[coding_category_max];
  enum coding_category priorities[coding_category_max];

  memset (changed, 0, sizeof changed);

  for (i = j = 0; i < nargs; i++)
    {
      enum coding_category category;
      Lisp_Object spec, attrs;

      CHECK_CODING_SYSTEM_GET_SPEC (args[i], spec);
      attrs = AREF (spec, 0);
      category = XFIXNUM (CODING_ATTR_CATEGORY (attrs));
      if (changed[category])
	/* Ignore this coding system because a coding system of the
	   same category already had a higher priority.  */
	continue;
      changed[category] = 1;
      priorities[j++] = category;
      if (coding_categories[category].id >= 0
	  && ! EQ (args[i], CODING_ID_NAME (coding_categories[category].id)))
	setup_coding_system (args[i], &coding_categories[category]);
      Fset (AREF (Vcoding_category_table, category), args[i]);
    }

  /* Now we have decided top J priorities.  Reflect the order of the
     original priorities to the remaining priorities.  */

  for (i = j, j = 0; i < coding_category_max; i++, j++)
    {
      while (j < coding_category_max
	     && changed[coding_priorities[j]])
	j++;
      if (j == coding_category_max)
	emacs_abort ();
      priorities[i] = coding_priorities[j];
    }

  memcpy (coding_priorities, priorities, sizeof priorities);

  /* Update `coding-category-list'.  */
  Vcoding_category_list = Qnil;
  for (i = coding_category_max; i-- > 0; )
    Vcoding_category_list
      = Fcons (AREF (Vcoding_category_table, priorities[i]),
	       Vcoding_category_list);

  return Qnil;
}