Remove period at end of error message.
[bpt/emacs.git] / src / fontset.c
index 647657e..e462387 100644 (file)
@@ -36,6 +36,15 @@ Boston, MA 02111-1307, USA.  */
 #include "dispextern.h"
 #include "fontset.h"
 #include "window.h"
+#ifdef HAVE_X_WINDOWS
+#include "xterm.h"
+#endif
+#ifdef WINDOWSNT
+#include "w32term.h"
+#endif
+#ifdef MAC_OS
+#include "macterm.h"
+#endif
 
 #ifdef FONTSET_DEBUG
 #undef xassert
@@ -55,14 +64,14 @@ Boston, MA 02111-1307, USA.  */
    face is also realized for multibyte characters based on an ASCII
    face.  All of the multibyte faces based on the same ASCII face
    share the same realized fontset.
-   
+
    A fontset object is implemented by a char-table.
 
    An element of a base fontset is:
        (INDEX . FONTNAME) or
        (INDEX . (FOUNDRY . REGISTRY ))
    FONTNAME is a font name pattern for the corresponding character.
-   FOUNDRY and REGISTRY are respectively foundy and regisry fields of
+   FOUNDRY and REGISTRY are respectively foundry and registry fields of
    a font name for the corresponding character.  INDEX specifies for
    which character (or generic character) the element is defined.  It
    may be different from an index to access this element.  For
@@ -71,9 +80,9 @@ Boston, MA 02111-1307, USA.  */
    charset.  REGISTRY is the
 
    An element of a realized fontset is FACE-ID which is a face to use
-   for displaying the correspnding character.
+   for displaying the corresponding character.
 
-   All single byte charaters (ASCII and 8bit-unibyte) share the same
+   All single byte characters (ASCII and 8bit-unibyte) share the same
    element in a fontset.  The element is stored in the first element
    of the fontset.
 
@@ -110,7 +119,7 @@ Boston, MA 02111-1307, USA.  */
    These structures are hidden from the other codes than this file.
    The other codes handle fontsets only by their ID numbers.  They
    usually use variable name `fontset' for IDs.  But, in this file, we
-   always use varialbe name `id' for IDs, and name `fontset' for the
+   always use variable name `id' for IDs, and name `fontset' for the
    actual fontset objects.
 
 */
@@ -123,7 +132,7 @@ Lisp_Object Qfontset;
 /* Vector containing all fontsets.  */
 static Lisp_Object Vfontset_table;
 
-/* Next possibly free fontset ID.  Usually this keeps the mininum
+/* Next possibly free fontset ID.  Usually this keeps the minimum
    fontset ID not yet used.  */
 static int next_fontset_id;
 
@@ -136,8 +145,6 @@ Lisp_Object Vuse_default_ascent;
 Lisp_Object Vignore_relative_composition;
 Lisp_Object Valternate_fontname_alist;
 Lisp_Object Vfontset_alias_alist;
-Lisp_Object Vhighlight_wrong_size_font;
-Lisp_Object Vclip_large_size_font;
 Lisp_Object Vvertical_centering_font_regexp;
 
 /* The following six are declarations of callback functions depending
@@ -147,8 +154,8 @@ Lisp_Object Vvertical_centering_font_regexp;
 /* Return a pointer to struct font_info of font FONT_IDX of frame F.  */
 struct font_info *(*get_font_info_func) P_ ((FRAME_PTR f, int font_idx));
 
-/* Return a list of font names which matches PATTERN.  See the document of
-   `x-list-fonts' for more detail.  */
+/* Return a list of font names which matches PATTERN.  See the documentation
+   of `x-list-fonts' for more details.  */
 Lisp_Object (*list_fonts_func) P_ ((struct frame *f,
                                    Lisp_Object pattern,
                                    int size,
@@ -168,7 +175,7 @@ void (*set_frame_fontset_func) P_ ((FRAME_PTR f, Lisp_Object arg,
 
 /* To find a CCL program, fs_load_font calls this function.
    The argument is a pointer to the struct font_info.
-   This function set the memer `encoder' of the structure.  */
+   This function set the member `encoder' of the structure.  */
 void (*find_ccl_program_func) P_ ((struct font_info *));
 
 /* Check if any window system is used now.  */
@@ -320,14 +327,14 @@ make_fontset (frame, name, base)
   /* Find a free slot in Vfontset_table.  Usually, next_fontset_id is
      the next available fontset ID.  So it is expected that this loop
      terminates quickly.  In addition, as the last element of
-     Vfotnset_table is always nil, we don't have to check the range of
+     Vfontset_table is always nil, we don't have to check the range of
      id.  */
   while (!NILP (AREF (Vfontset_table, id))) id++;
 
   if (id + 1 == size)
     {
       Lisp_Object tem;
-      int i; 
+      int i;
 
       tem = Fmake_vector (make_number (size + 8), Qnil);
       for (i = 0; i < size; i++)
@@ -372,10 +379,10 @@ font_family_registry (fontname, force)
      int force;
 {
   Lisp_Object family, registry;
-  char *p = XSTRING (fontname)->data;
-  char *sep[15];
+  const char *p = SDATA (fontname);
+  const char *sep[15];
   int i = 0;
-  
+
   while (*p && i < 15)
     if (*p++ == '-')
       {
@@ -392,7 +399,7 @@ font_family_registry (fontname, force)
 }
 
 \f
-/********** INTERFACES TO xfaces.c and dispextern.h **********/ 
+/********** INTERFACES TO xfaces.c and dispextern.h **********/
 
 /* Return name of the fontset with ID.  */
 
@@ -483,7 +490,7 @@ face_for_char (f, face, c)
   /* No face is recorded for C in the fontset of FACE.  Make a new
      realized face for C that has the same fontset.  */
   face_id = lookup_face (f, face->lface, c, face);
-  
+
   /* Record the face ID in FONTSET at the same index as the
      information in the base fontset.  */
   FONTSET_SET (fontset, c, make_number (face_id));
@@ -534,8 +541,7 @@ fontset_font_pattern (f, id, c)
 {
   Lisp_Object fontset, elt;
   struct font_info *fontp;
-  Lisp_Object family_registry;
-  
+
   elt = Qnil;
   if (fontset_id_valid_p (id))
     {
@@ -560,7 +566,7 @@ fontset_font_pattern (f, id, c)
      font name.  */
   elt = XCDR (elt);
   xassert (STRINGP (elt));
-  fontp = FS_LOAD_FONT (f, c, XSTRING (elt)->data, -1);
+  fontp = FS_LOAD_FONT (f, c, SDATA (elt), -1);
   if (!fontp)
     return Qnil;
 
@@ -619,7 +625,7 @@ fs_load_font (f, c, fontname, id, face)
       if (!fontname && charset == CHARSET_ASCII)
        {
          elt = FONTSET_ASCII (fontset);
-         fontname = XSTRING (XCDR (elt))->data;
+         fontname = SDATA (XCDR (elt));
        }
     }
 
@@ -637,7 +643,7 @@ fs_load_font (f, c, fontname, id, face)
 
   fontp->vertical_centering
     = (STRINGP (Vvertical_centering_font_regexp)
-       && (fast_c_string_match_ignore_case 
+       && (fast_c_string_match_ignore_case
           (Vvertical_centering_font_regexp, fontp->full_name) >= 0));
 
   if (fontp->encoding[1] != FONT_ENCODING_NOT_DECIDED)
@@ -684,9 +690,7 @@ fs_load_font (f, c, fontname, id, face)
        }
     }
 
-  fontp->font_encoder = (struct ccl_program *) 0;
-
-  if (find_ccl_program_func)
+  if (! fontp->font_encoder && find_ccl_program_func)
     (*find_ccl_program_func) (fontp);
 
   /* If we loaded a font for a face that has fontset, record the face
@@ -708,7 +712,7 @@ fs_load_font (f, c, fontname, id, face)
    the corresponding regular expression.  */
 static Lisp_Object Vcached_fontset_data;
 
-#define CACHED_FONTSET_NAME (XSTRING (XCAR (Vcached_fontset_data))->data)
+#define CACHED_FONTSET_NAME (SDATA (XCAR (Vcached_fontset_data)))
 #define CACHED_FONTSET_REGEX (XCDR (Vcached_fontset_data))
 
 /* If fontset name PATTERN contains any wild card, return regular
@@ -718,21 +722,21 @@ static Lisp_Object
 fontset_pattern_regexp (pattern)
      Lisp_Object pattern;
 {
-  if (!index (XSTRING (pattern)->data, '*')
-      && !index (XSTRING (pattern)->data, '?'))
+  if (!index (SDATA (pattern), '*')
+      && !index (SDATA (pattern), '?'))
     /* PATTERN does not contain any wild cards.  */
     return Qnil;
 
   if (!CONSP (Vcached_fontset_data)
-      || strcmp (XSTRING (pattern)->data, CACHED_FONTSET_NAME))
+      || strcmp (SDATA (pattern), CACHED_FONTSET_NAME))
     {
       /* We must at first update the cached data.  */
-      char *regex = (char *) alloca (XSTRING (pattern)->size * 2 + 3);
+      char *regex = (char *) alloca (SCHARS (pattern) * 2 + 3);
       char *p0, *p1 = regex;
 
       /* Convert "*" to ".*", "?" to ".".  */
       *p1++ = '^';
-      for (p0 = (char *) XSTRING (pattern)->data; *p0; p0++)
+      for (p0 = (char *) SDATA (pattern); *p0; p0++)
        {
          if (*p0 == '*')
            {
@@ -747,7 +751,7 @@ fontset_pattern_regexp (pattern)
       *p1++ = '$';
       *p1++ = 0;
 
-      Vcached_fontset_data = Fcons (build_string (XSTRING (pattern)->data),
+      Vcached_fontset_data = Fcons (build_string (SDATA (pattern)),
                                    build_string (regex));
     }
 
@@ -785,17 +789,17 @@ fs_query_fontset (name, regexpp)
   for (i = 0; i < ASIZE (Vfontset_table); i++)
     {
       Lisp_Object fontset;
-      unsigned char *this_name;
+      const unsigned char *this_name;
 
       fontset = FONTSET_FROM_ID (i);
       if (NILP (fontset)
          || !BASE_FONTSET_P (fontset))
        continue;
 
-      this_name = XSTRING (FONTSET_NAME (fontset))->data;
+      this_name = SDATA (FONTSET_NAME (fontset));
       if (regexpp
          ? fast_c_string_match_ignore_case (name, this_name) >= 0
-         : !strcmp (XSTRING (name)->data, this_name))
+         : !strcmp (SDATA (name), this_name))
        return i;
     }
   return -1;
@@ -803,12 +807,12 @@ fs_query_fontset (name, regexpp)
 
 
 DEFUN ("query-fontset", Fquery_fontset, Squery_fontset, 1, 2, 0,
-  "Return the name of a fontset that matches PATTERN.\n\
-The value is nil if there is no matching fontset.\n\
-PATTERN can contain `*' or `?' as a wildcard\n\
-just as X font name matching algorithm allows.\n\
-If REGEXPP is non-nil, PATTERN is a regular expression.")
-  (pattern, regexpp)
+       doc: /* Return the name of a fontset that matches PATTERN.
+The value is nil if there is no matching fontset.
+PATTERN can contain `*' or `?' as a wildcard
+just as X font name matching algorithm allows.
+If REGEXPP is non-nil, PATTERN is a regular expression.  */)
+     (pattern, regexpp)
      Lisp_Object pattern, regexpp;
 {
   Lisp_Object fontset;
@@ -818,7 +822,7 @@ If REGEXPP is non-nil, PATTERN is a regular expression.")
 
   CHECK_STRING (pattern);
 
-  if (XSTRING (pattern)->size == 0)
+  if (SCHARS (pattern) == 0)
     return Qnil;
 
   id = fs_query_fontset (pattern, !NILP (regexpp));
@@ -831,7 +835,7 @@ If REGEXPP is non-nil, PATTERN is a regular expression.")
 
 /* Return a list of base fontset names matching PATTERN on frame F.
    If SIZE is not 0, it is the size (maximum bound width) of fontsets
-   to be listed. */
+   to be listed.  */
 
 Lisp_Object
 list_fontsets (f, pattern, size)
@@ -850,18 +854,18 @@ list_fontsets (f, pattern, size)
   for (id = 0; id < ASIZE (Vfontset_table); id++)
     {
       Lisp_Object fontset;
-      unsigned char *name;
+      const unsigned char *name;
 
       fontset = FONTSET_FROM_ID (id);
       if (NILP (fontset)
          || !BASE_FONTSET_P (fontset)
          || !EQ (frame, FONTSET_FRAME (fontset)))
        continue;
-      name = XSTRING (FONTSET_NAME (fontset))->data;
+      name = SDATA (FONTSET_NAME (fontset));
 
       if (!NILP (regexp)
          ? (fast_c_string_match_ignore_case (regexp, name) < 0)
-         : strcmp (XSTRING (pattern)->data, name))
+         : strcmp (SDATA (pattern), name))
        continue;
 
       if (size)
@@ -878,9 +882,9 @@ list_fontsets (f, pattern, size)
 }
 
 DEFUN ("new-fontset", Fnew_fontset, Snew_fontset, 2, 2, 0,
-  "Create a new fontset NAME that contains font information in FONTLIST.\n\
-FONTLIST is an alist of charsets vs corresponding font name patterns.")
-  (name, fontlist)
+       doc: /* Create a new fontset NAME that contains font information in FONTLIST.
+FONTLIST is an alist of charsets vs corresponding font name patterns.  */)
+     (name, fontlist)
      Lisp_Object name, fontlist;
 {
   Lisp_Object fontset, elements, ascii_font;
@@ -895,7 +899,7 @@ FONTLIST is an alist of charsets vs corresponding font name patterns.")
   tem = Fquery_fontset (name, Qnil);
   if (!NILP (tem))
     error ("Fontset `%s' matches the existing fontset `%s'",
-          XSTRING (name)->data, XSTRING (tem)->data);
+          SDATA (name), SDATA (tem));
 
   /* Check the validity of FONTLIST while creating a template for
      fontset elements.  */
@@ -958,7 +962,7 @@ clear_fontset_elements (fontset)
 
 /* Check validity of NAME as a fontset name and return the
    corresponding fontset.  If not valid, signal an error.
-   If NAME is t, return Vdefault_fontset.  */
+   If NAME is nil, return Vdefault_fontset.  */
 
 static Lisp_Object
 check_fontset_name (name)
@@ -966,28 +970,29 @@ check_fontset_name (name)
 {
   int id;
 
-  if (EQ (name, Qt))
+  if (EQ (name, Qnil))
     return Vdefault_fontset;
 
   CHECK_STRING (name);
   id = fs_query_fontset (name, 0);
   if (id < 0)
-    error ("Fontset `%s' does not exist", XSTRING (name)->data);
+    error ("Fontset `%s' does not exist", SDATA (name));
   return FONTSET_FROM_ID (id);
 }
 
 DEFUN ("set-fontset-font", Fset_fontset_font, Sset_fontset_font, 3, 4, 0,
-  "Modify fontset NAME to use FONTNAME for CHARACTER.\n\
-\n\
-CHARACTER may be a cons; (FROM . TO), where FROM and TO are\n\
-non-generic characters.  In that case, use FONTNAME\n\
-for all characters in the range FROM and TO (inclusive).\n\
-CHARACTER may be a charset.   In that case, use FONTNAME\n\
-for all character in the charsets.\n\
-\n\
-FONTNAME may be a cons; (FAMILY . REGISTRY), where FAMILY is a family\n\
-name of a font, REGSITRY is a registry name of a font.")
-  (name, character, fontname, frame)
+       doc: /* Modify fontset NAME to use FONTNAME for CHARACTER.
+
+If NAME is nil, modify the default fontset.
+CHARACTER may be a cons; (FROM . TO), where FROM and TO are
+non-generic characters.  In that case, use FONTNAME
+for all characters in the range FROM and TO (inclusive).
+CHARACTER may be a charset.  In that case, use FONTNAME
+for all character in the charsets.
+
+FONTNAME may be a cons; (FAMILY . REGISTRY), where FAMILY is a family
+name of a font, REGISTRY is a registry name of a font.  */)
+     (name, character, fontname, frame)
      Lisp_Object name, character, fontname, frame;
 {
   Lisp_Object fontset, elt;
@@ -1007,7 +1012,7 @@ name of a font, REGSITRY is a registry name of a font.")
       from = XINT (XCAR (character));
       to = XINT (XCDR (character));
       if (!char_valid_p (from, 0) || !char_valid_p (to, 0))
-       error ("Character range should be by non-generic characters.");
+       error ("Character range should be by non-generic characters");
       if (!NILP (name)
          && (SINGLE_BYTE_CHAR_P (from) || SINGLE_BYTE_CHAR_P (to)))
        error ("Can't change font for a single byte character");
@@ -1016,7 +1021,7 @@ name of a font, REGSITRY is a registry name of a font.")
     {
       elt = Fget (character, Qcharset);
       if (!VECTORP (elt) || ASIZE (elt) < 1 || !NATNUMP (AREF (elt, 0)))
-       error ("Invalid charset: %s", (XSYMBOL (character)->name)->data);
+       error ("Invalid charset: %s", SDATA (SYMBOL_NAME (character)));
       from = MAKE_CHAR (XINT (AREF (elt, 0)), 0, 0);
       to = from;
     }
@@ -1091,20 +1096,20 @@ name of a font, REGSITRY is a registry name of a font.")
 }
 
 DEFUN ("font-info", Ffont_info, Sfont_info, 1, 2, 0,
-  "Return information about a font named NAME on frame FRAME.\n\
-If FRAME is omitted or nil, use the selected frame.\n\
-The returned value is a vector of OPENED-NAME, FULL-NAME, CHARSET, SIZE,\n\
-  HEIGHT, BASELINE-OFFSET, RELATIVE-COMPOSE, and DEFAULT-ASCENT,\n\
-where\n\
-  OPENED-NAME is the name used for opening the font,\n\
-  FULL-NAME is the full name of the font,\n\
-  SIZE is the maximum bound width of the font,\n\
-  HEIGHT is the height of the font,\n\
-  BASELINE-OFFSET is the upward offset pixels from ASCII baseline,\n\
-  RELATIVE-COMPOSE and DEFAULT-ASCENT are the numbers controlling\n\
-    how to compose characters.\n\
-If the named font is not yet loaded, return nil.")
-  (name, frame)
+       doc: /* Return information about a font named NAME on frame FRAME.
+If FRAME is omitted or nil, use the selected frame.
+The returned value is a vector of OPENED-NAME, FULL-NAME, CHARSET, SIZE,
+  HEIGHT, BASELINE-OFFSET, RELATIVE-COMPOSE, and DEFAULT-ASCENT,
+where
+  OPENED-NAME is the name used for opening the font,
+  FULL-NAME is the full name of the font,
+  SIZE is the maximum bound width of the font,
+  HEIGHT is the height of the font,
+  BASELINE-OFFSET is the upward offset pixels from ASCII baseline,
+  RELATIVE-COMPOSE and DEFAULT-ASCENT are the numbers controlling
+    how to compose characters.
+If the named font is not yet loaded, return nil.  */)
+     (name, frame)
      Lisp_Object name, frame;
 {
   FRAME_PTR f;
@@ -1123,7 +1128,7 @@ If the named font is not yet loaded, return nil.")
   if (!query_font_func)
     error ("Font query function is not supported");
 
-  fontp = (*query_font_func) (f, XSTRING (name)->data);
+  fontp = (*query_font_func) (f, SDATA (name));
   if (!fontp)
     return Qnil;
 
@@ -1141,9 +1146,16 @@ If the named font is not yet loaded, return nil.")
 }
 
 
-/* Return the font name for the character at POSITION in the current
+/* Return a cons (FONT-NAME . GLYPH-CODE).
+   FONT-NAME is the font name for the character at POSITION in the current
    buffer.  This is computed from all the text properties and overlays
-   that apply to POSITION.  It returns nil in the following cases:
+   that apply to POSITION.
+   GLYPH-CODE is the glyph code in the font to use for the character.
+
+   If the 2nd optional arg CH is non-nil, it is a character to check
+   the font instead of the character at POSITION.
+
+   It returns nil in the following cases:
 
    (1) The window system doesn't have a font for the character (thus
    it is displayed by an empty box).
@@ -1157,14 +1169,14 @@ If the named font is not yet loaded, return nil.")
    POSITION is currently not visible.  */
 
 
-DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 1, 0,
-  "For internal use only.")
-  (position)
-     Lisp_Object position;
+DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 2, 0,
+       doc: /* For internal use only.  */)
+     (position, ch)
+     Lisp_Object position, ch;
 {
   int pos, pos_byte, dummy;
   int face_id;
-  int c;
+  int c, code;
   Lisp_Object window;
   struct window *w;
   struct frame *f;
@@ -1175,7 +1187,13 @@ DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 1, 0,
   if (pos < BEGV || pos >= ZV)
     args_out_of_range_3 (position, make_number (BEGV), make_number (ZV));
   pos_byte = CHAR_TO_BYTE (pos);
-  c = FETCH_CHAR (pos_byte);
+  if (NILP (ch))
+    c = FETCH_CHAR (pos_byte);
+  else
+    {
+      CHECK_NATNUM (ch);
+      c = XINT (ch);
+    }
   if (! CHAR_VALID_P (c, 0))
     return Qnil;
   window = Fget_buffer_window (Fcurrent_buffer (), Qnil);
@@ -1186,19 +1204,46 @@ DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 1, 0,
   face_id = face_at_buffer_position (w, pos, -1, -1, &dummy, pos + 100, 0);
   face_id = FACE_FOR_CHAR (f, FACE_FROM_ID (f, face_id), c);
   face = FACE_FROM_ID (f, face_id);
-  return (face->font && face->font_name
-         ? build_string (face->font_name)
-         : Qnil);
+  if (! face->font || ! face->font_name)
+    return Qnil;
+
+  {
+    struct font_info *fontp = (*get_font_info_func) (f, face->font_info_id);
+    XChar2b char2b;
+    int c1, c2, charset;
+
+    SPLIT_CHAR (c, charset, c1, c2);
+    if (c2 > 0)
+      STORE_XCHAR2B (&char2b, c1, c2);
+    else
+      STORE_XCHAR2B (&char2b, 0, c1);
+    rif->encode_char (c, &char2b, fontp, NULL);
+    code = (XCHAR2B_BYTE1 (&char2b) << 8) | XCHAR2B_BYTE2 (&char2b);
+  }
+  return Fcons (build_string (face->font_name), make_number (code));
 }
 
 
+/* Called from Ffontset_info via map_char_table on each leaf of
+   fontset.  ARG is a copy of the default fontset.  The current leaf
+   is indexed by CHARACTER and has value ELT.  This function override
+   the copy by ELT if ELT is not nil.  */
+
+static void
+override_font_info (fontset, character, elt)
+     Lisp_Object fontset, character, elt;
+{
+  if (! NILP (elt))
+    Faset (fontset, character, elt);
+}
+
 /* Called from Ffontset_info via map_char_table on each leaf of
    fontset.  ARG is a list (LAST FONT-INFO ...), where LAST is `(last
    ARG)' and FONT-INFOs have this form:
        (CHAR FONT-SPEC) or ((FROM . TO) FONT-SPEC)
    The current leaf is indexed by CHARACTER and has value ELT.  This
    function add the information of the current leaf to ARG by
-   appending a new element or modifying the last element..  */
+   appending a new element or modifying the last element.  */
 
 static void
 accumulate_font_info (arg, character, elt)
@@ -1240,23 +1285,24 @@ accumulate_font_info (arg, character, elt)
 
 
 DEFUN ("fontset-info", Ffontset_info, Sfontset_info, 1, 2, 0,
-  "Return information about a fontset named NAME on frame FRAME.\n\
-The value is a vector:\n\
-  [ SIZE HEIGHT ((CHARSET-OR-RANGE FONT-SPEC OPENED ...) ...) ],\n\
-where,\n\
-  SIZE is the maximum bound width of ASCII font in the fontset,\n\
-  HEIGHT is the maximum bound height of ASCII font in the fontset,\n\
-  CHARSET-OR-RANGE is a charset, a character (may be a generic character)\n\
-    or a cons of two characters specifying the range of characters.\n\
-  FONT-SPEC is a fontname pattern string or a cons (FAMILY . REGISTRY),\n\
-    where FAMILY is a `FAMILY' field of a XLFD font name,\n\
-    REGISTRY is a `CHARSET_REGISTRY' field of a XLDF font name.\n\
-    FAMILY may contain a `FOUNDARY' field at the head.\n\
-    REGISTRY may contain a `CHARSET_ENCODING' field at the tail.\n\
-  OPENEDs are names of fonts actually opened.\n\
-If the ASCII font is not yet opened, SIZE and HEIGHT are 0.\n\
-If FRAME is omitted, it defaults to the currently selected frame.")
-  (name, frame)
+       doc: /* Return information about a fontset named NAME on frame FRAME.
+If NAME is nil, return information about the default fontset.
+The value is a vector:
+  [ SIZE HEIGHT ((CHARSET-OR-RANGE FONT-SPEC OPENED ...) ...) ],
+where,
+  SIZE is the maximum bound width of ASCII font in the fontset,
+  HEIGHT is the maximum bound height of ASCII font in the fontset,
+  CHARSET-OR-RANGE is a charset, a character (may be a generic character)
+    or a cons of two characters specifying the range of characters.
+  FONT-SPEC is a fontname pattern string or a cons (FAMILY . REGISTRY),
+    where FAMILY is a `FAMILY' field of a XLFD font name,
+    REGISTRY is a `CHARSET_REGISTRY' field of a XLFD font name.
+    FAMILY may contain a `FOUNDRY' field at the head.
+    REGISTRY may contain a `CHARSET_ENCODING' field at the tail.
+  OPENEDs are names of fonts actually opened.
+If the ASCII font is not yet opened, SIZE and HEIGHT are 0.
+If FRAME is omitted, it defaults to the currently selected frame.  */)
+     (name, frame)
      Lisp_Object name, frame;
 {
   Lisp_Object fontset;
@@ -1267,7 +1313,7 @@ If FRAME is omitted, it defaults to the currently selected frame.")
   struct font_info *fontp = NULL;
   int n_realized = 0;
   int i;
-  
+
   (*check_window_system_func) ();
 
   fontset = check_fontset_name (name);
@@ -1289,6 +1335,14 @@ If FRAME is omitted, it defaults to the currently selected frame.")
        realized[n_realized++] = elt;
     }
 
+  if (! EQ (fontset, Vdefault_fontset))
+    {
+      /* Merge FONTSET onto the default fontset.  */
+      val = Fcopy_sequence (Vdefault_fontset);
+      map_char_table (override_font_info, Qnil, fontset, fontset, val, 0, indices);
+      fontset = val;
+    }
+
   /* Accumulate information of the fontset in VAL.  The format is
      (LAST FONT-INFO FONT-INFO ...), where FONT-INFO is (CHAR-OR-RANGE
      FONT-SPEC).  See the comment for accumulate_font_info for the
@@ -1297,7 +1351,7 @@ If FRAME is omitted, it defaults to the currently selected frame.")
                      Fcons (XCDR (FONTSET_ASCII (fontset)), Qnil)),
               Qnil);
   val = Fcons (val, val);
-  map_char_table (accumulate_font_info, Qnil, fontset, val, 0, indices);
+  map_char_table (accumulate_font_info, Qnil, fontset, fontset, val, 0, indices);
   val = XCDR (val);
 
   /* For each FONT-INFO, if CHAR_OR_RANGE (car part) is a generic
@@ -1341,7 +1395,7 @@ If FRAME is omitted, it defaults to the currently selected frame.")
   if (CONSP (elt))
     {
       elt = XCAR (elt);
-      fontp = (*query_font_func) (f, XSTRING (elt)->data);
+      fontp = (*query_font_func) (f, SDATA (elt));
     }
   val = Fmake_vector (make_number (3), val);
   AREF (val, 0) = fontp ? make_number (fontp->size) : make_number (0);
@@ -1350,9 +1404,9 @@ If FRAME is omitted, it defaults to the currently selected frame.")
 }
 
 DEFUN ("fontset-font", Ffontset_font, Sfontset_font, 2, 2, 0,
-  "Return a font name pattern for character CH in fontset NAME.\n\
-If NAME is t, find a font name pattern in the default fontset.")
-  (name, ch)
+       doc: /* Return a font name pattern for character CH in fontset NAME.
+If NAME is nil, find a font name pattern in the default fontset.  */)
+     (name, ch)
      Lisp_Object name, ch;
 {
   int c;
@@ -1371,11 +1425,10 @@ If NAME is t, find a font name pattern in the default fontset.")
 
   return elt;
 }
-  
 
 DEFUN ("fontset-list", Ffontset_list, Sfontset_list, 0, 0, 0,
-  "Return a list of all defined fontset names.")
-  ()
+       doc: /* Return a list of all defined fontset names.  */)
+     ()
 {
   Lisp_Object fontset, list;
   int i;
@@ -1414,7 +1467,7 @@ syms_of_fontset ()
   FONTSET_ID (Vdefault_fontset) = make_number (0);
   FONTSET_NAME (Vdefault_fontset)
     = build_string ("-*-*-*-*-*-*-*-*-*-*-*-*-fontset-default");
-#if defined (macintosh)
+#if defined (MAC_OS)
   FONTSET_ASCII (Vdefault_fontset)
     = Fcons (make_number (0),
             build_string ("-apple-monaco-medium-r-*--*-120-*-*-*-*-mac-roman"));
@@ -1431,58 +1484,60 @@ syms_of_fontset ()
   next_fontset_id = 1;
 
   DEFVAR_LISP ("font-encoding-alist", &Vfont_encoding_alist,
-    "Alist of fontname patterns vs corresponding encoding info.\n\
-Each element looks like (REGEXP . ENCODING-INFO),\n\
- where ENCODING-INFO is an alist of CHARSET vs ENCODING.\n\
-ENCODING is one of the following integer values:\n\
-       0: code points 0x20..0x7F or 0x2020..0x7F7F are used,\n\
-       1: code points 0xA0..0xFF or 0xA0A0..0xFFFF are used,\n\
-       2: code points 0x20A0..0x7FFF are used,\n\
-       3: code points 0xA020..0xFF7F are used.");
+              doc: /* Alist of fontname patterns vs corresponding encoding info.
+Each element looks like (REGEXP . ENCODING-INFO),
+ where ENCODING-INFO is an alist of CHARSET vs ENCODING.
+ENCODING is one of the following integer values:
+       0: code points 0x20..0x7F or 0x2020..0x7F7F are used,
+       1: code points 0xA0..0xFF or 0xA0A0..0xFFFF are used,
+       2: code points 0x20A0..0x7FFF are used,
+       3: code points 0xA020..0xFF7F are used.  */);
   Vfont_encoding_alist = Qnil;
+  Vfont_encoding_alist
+    = Fcons (Fcons (build_string ("JISX0201"),
+                   Fcons (Fcons (intern ("latin-jisx0201"), make_number (0)),
+                          Qnil)),
+            Vfont_encoding_alist);
+  Vfont_encoding_alist
+    = Fcons (Fcons (build_string ("ISO8859-1"),
+                   Fcons (Fcons (intern ("ascii"), make_number (0)),
+                          Qnil)),
+            Vfont_encoding_alist);
 
   DEFVAR_LISP ("use-default-ascent", &Vuse_default_ascent,
-     "Char table of characters whose ascent values should be ignored.\n\
-If an entry for a character is non-nil, the ascent value of the glyph\n\
-is assumed to be what specified by _MULE_DEFAULT_ASCENT property of a font.\n\
-\n\
-This affects how a composite character which contains\n\
-such a character is displayed on screen.");
+              doc: /* Char table of characters whose ascent values should be ignored.
+If an entry for a character is non-nil, the ascent value of the glyph
+is assumed to be what specified by _MULE_DEFAULT_ASCENT property of a font.
+
+This affects how a composite character which contains
+such a character is displayed on screen.  */);
   Vuse_default_ascent = Qnil;
 
   DEFVAR_LISP ("ignore-relative-composition", &Vignore_relative_composition,
-     "Char table of characters which is not composed relatively.\n\
-If an entry for a character is non-nil, a composition sequence\n\
-which contains that character is displayed so that\n\
-the glyph of that character is put without considering\n\
-an ascent and descent value of a previous character.");
+              doc: /* Char table of characters which is not composed relatively.
+If an entry for a character is non-nil, a composition sequence
+which contains that character is displayed so that
+the glyph of that character is put without considering
+an ascent and descent value of a previous character.  */);
   Vignore_relative_composition = Qnil;
 
   DEFVAR_LISP ("alternate-fontname-alist", &Valternate_fontname_alist,
-     "Alist of fontname vs list of the alternate fontnames.\n\
-When a specified font name is not found, the corresponding\n\
-alternate fontnames (if any) are tried instead.");
+              doc: /* Alist of fontname vs list of the alternate fontnames.
+When a specified font name is not found, the corresponding
+alternate fontnames (if any) are tried instead.  */);
   Valternate_fontname_alist = Qnil;
 
   DEFVAR_LISP ("fontset-alias-alist", &Vfontset_alias_alist,
-     "Alist of fontset names vs the aliases.");
+              doc: /* Alist of fontset names vs the aliases.  */);
   Vfontset_alias_alist = Fcons (Fcons (FONTSET_NAME (Vdefault_fontset),
                                       build_string ("fontset-default")),
                                Qnil);
 
-  DEFVAR_LISP ("highlight-wrong-size-font", &Vhighlight_wrong_size_font,
-     "*This variable is obsolete.");
-  Vhighlight_wrong_size_font = Qnil;
-
-  DEFVAR_LISP ("clip-large-size-font", &Vclip_large_size_font,
-     "*This variable is obsolete.");
-  Vclip_large_size_font = Qt;
-
   DEFVAR_LISP ("vertical-centering-font-regexp",
               &Vvertical_centering_font_regexp,
-    "*Regexp matching font names that require vertical centering on display.\n\
-When a character is displayed with such fonts, the character is displayed\n\
-at the vertival center of lines.");
+              doc: /* *Regexp matching font names that require vertical centering on display.
+When a character is displayed with such fonts, the character is displayed
+at the vertical center of lines.  */);
   Vvertical_centering_font_regexp = Qnil;
 
   defsubr (&Squery_fontset);
@@ -1494,3 +1549,6 @@ at the vertival center of lines.");
   defsubr (&Sfontset_font);
   defsubr (&Sfontset_list);
 }
+
+/* arch-tag: ea861585-2f5f-4e5b-9849-d04a9c3a3537
+   (do not change this comment) */