]> code.delx.au - gnu-emacs/blobdiff - src/fontset.c
(filesets-build-menu-now): Don't clear messages.
[gnu-emacs] / src / fontset.c
index 56f782a2638056f0d2187840f31fe246d1e5370b..d748c7ef92e18540d72946eb4cfedf7d8cf4270c 100644 (file)
@@ -55,14 +55,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 +71,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 +110,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 +123,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 +136,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 +145,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 +166,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.  */
@@ -181,7 +179,7 @@ static void fontset_set P_ ((Lisp_Object, int, Lisp_Object));
 static Lisp_Object make_fontset P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
 static int fontset_id_valid_p P_ ((int));
 static Lisp_Object fontset_pattern_regexp P_ ((Lisp_Object));
-static Lisp_Object font_family_registry P_ ((Lisp_Object));
+static Lisp_Object font_family_registry P_ ((Lisp_Object, int));
 
 \f
 /********** MACROS AND FUNCTIONS TO HANDLE FONTSET **********/
@@ -210,7 +208,6 @@ fontset_ref (fontset, c)
 {
   int charset, c1, c2;
   Lisp_Object elt, defalt;
-  int i;
 
   if (SINGLE_BYTE_CHAR_P (c))
     return FONTSET_ASCII (fontset);
@@ -281,8 +278,8 @@ fontset_set (fontset, c, newelt)
      Lisp_Object newelt;
 {
   int charset, code[3];
-  Lisp_Object *elt, tmp;
-  int i, j;
+  Lisp_Object *elt;
+  int i;
 
   if (SINGLE_BYTE_CHAR_P (c))
     {
@@ -314,22 +311,21 @@ static Lisp_Object
 make_fontset (frame, name, base)
      Lisp_Object frame, name, base;
 {
-  Lisp_Object fontset, elt, base_elt;
+  Lisp_Object fontset;
   int size = ASIZE (Vfontset_table);
   int id = next_fontset_id;
-  int i, j;
 
   /* 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++)
@@ -360,21 +356,31 @@ fontset_id_valid_p (id)
 }
 
 
-/* Extract `family' and `registry' string from FONTNAME and set in
-   *FAMILY and *REGISTRY respectively.  Actually, `family' may also
-   contain `foundry', `registry' may also contain `encoding' of
-   FONTNAME.  */
+/* Extract `family' and `registry' string from FONTNAME and a cons of
+   them.  Actually, `family' may also contain `foundry', `registry'
+   may also contain `encoding' of FONTNAME.  But, if FONTNAME doesn't
+   conform to XLFD nor explicitely specifies the other fields
+   (i.e. not using wildcard `*'), return FONTNAME.  If FORCE is
+   nonzero, specifications of the other fields are ignored, and return
+   a cons as far as FONTNAME conform to XLFD.  */
 
 static Lisp_Object
-font_family_registry (fontname)
+font_family_registry (fontname, force)
      Lisp_Object fontname;
+     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++ == '-') sep[i++] = p;
+
+  while (*p && i < 15)
+    if (*p++ == '-')
+      {
+       if (!force && i >= 2 && i <= 11 && *p != '*' && p[1] != '-')
+         return fontname;
+       sep[i++] = p;
+      }
   if (i != 14)
     return fontname;
 
@@ -384,7 +390,7 @@ font_family_registry (fontname)
 }
 
 \f
-/********** INTERFACES TO xfaces.c and dispextern.h **********/ 
+/********** INTERFACES TO xfaces.c and dispextern.h **********/
 
 /* Return name of the fontset with ID.  */
 
@@ -475,7 +481,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));
@@ -493,7 +499,7 @@ make_fontset_for_ascii_face (f, base_fontset_id)
      FRAME_PTR f;
      int base_fontset_id;
 {
-  Lisp_Object base_fontset, fontset, name, frame;
+  Lisp_Object base_fontset, fontset, frame;
 
   XSETFRAME (frame, f);
   if (base_fontset_id >= 0)
@@ -512,10 +518,10 @@ make_fontset_for_ascii_face (f, base_fontset_id)
 
 
 /* Return the font name pattern for C that is recorded in the fontset
-   with ID.  A font is opened by that pattern to get the fullname.  If
-   the fullname conform to XLFD, extract foundry-family field and
-   registry-encoding field, and return the cons of them.  Otherwise
-   return the fullname.  If ID is -1, or the fontset doesn't contain
+   with ID.  If a font name pattern is specified (instead of a cons of
+   family and registry), check if a font can be opened by that pattern
+   to get the fullname.  If a font is opened, return that name.
+   Otherwise, return nil.  If ID is -1, or the fontset doesn't contain
    information about C, get the registry and encoding of C from the
    default fontset.  Called from choose_face_font.  */
 
@@ -526,8 +532,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))
     {
@@ -545,24 +550,26 @@ fontset_font_pattern (f, id, c)
     return XCDR (elt);
 
   /* The fontset specifies only a font name pattern (not cons of
-     family and registry).  Try to open a font by that pattern and get
-     a registry from the full name of the opened font.  We ignore
-     family name here because it should be wild card in the fontset
-     specification.  */
+     family and registry).  If a font can be opened by that pattern,
+     return the name of opened font.  Otherwise return nil.  The
+     exception is a font for single byte characters.  In that case, we
+     return a cons of FAMILY and REGISTRY extracted from the opened
+     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;
 
-  family_registry = font_family_registry (build_string (fontp->full_name));
-  if (!CONSP (family_registry))
-    return family_registry;
-  XCAR (family_registry) = Qnil;
-  return family_registry;
+  return font_family_registry (build_string (fontp->full_name),
+                              SINGLE_BYTE_CHAR_P (c));
 }
 
 
+#if defined(WINDOWSNT) && defined (_MSC_VER)
+#pragma optimize("", off)
+#endif
+
 /* Load a font named FONTNAME to display character C on frame F.
    Return a pointer to the struct font_info of the loaded font.  If
    loading fails, return NULL.  If FACE is non-zero and a fontset is
@@ -580,7 +587,6 @@ fs_load_font (f, c, fontname, id, face)
 {
   Lisp_Object fontset;
   Lisp_Object list, elt;
-  int font_idx;
   int size = 0;
   struct font_info *fontp;
   int charset = CHAR_CHARSET (c);
@@ -610,7 +616,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));
        }
     }
 
@@ -628,7 +634,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)
@@ -689,13 +695,17 @@ fs_load_font (f, c, fontname, id, face)
   return fontp;
 }
 
+#if defined(WINDOWSNT) && defined (_MSC_VER)
+#pragma optimize("", on)
+#endif
+
 \f
 /* Cache data used by fontset_pattern_regexp.  The car part is a
    pattern string containing at least one wild card, the cdr part is
    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
@@ -705,21 +715,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);
+      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 == '*')
            {
@@ -734,7 +744,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));
     }
 
@@ -749,7 +759,7 @@ fs_query_fontset (name, regexpp)
      Lisp_Object name;
      int regexpp;
 {
-  Lisp_Object fontset, tem;
+  Lisp_Object tem;
   int i;
 
   name = Fdowncase (name);
@@ -772,17 +782,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;
@@ -790,12 +800,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;
@@ -803,9 +813,9 @@ If REGEXPP is non-nil, PATTERN is a regular expression.")
 
   (*check_window_system_func) ();
 
-  CHECK_STRING (pattern, 0);
+  CHECK_STRING (pattern);
 
-  if (XSTRING (pattern)->size == 0)
+  if (SCHARS (pattern) == 0)
     return Qnil;
 
   id = fs_query_fontset (pattern, !NILP (regexpp));
@@ -818,7 +828,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)
@@ -826,7 +836,7 @@ list_fontsets (f, pattern, size)
      Lisp_Object pattern;
      int size;
 {
-  Lisp_Object frame, regexp, val, tail;
+  Lisp_Object frame, regexp, val;
   int id;
 
   XSETFRAME (frame, f);
@@ -837,18 +847,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)
@@ -865,9 +875,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;
@@ -875,30 +885,33 @@ FONTLIST is an alist of charsets vs corresponding font name patterns.")
 
   (*check_window_system_func) ();
 
-  CHECK_STRING (name, 0);
-  CHECK_LIST (fontlist, 1);
+  CHECK_STRING (name);
+  CHECK_LIST (fontlist);
 
   name = Fdowncase (name);
   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.  */
   elements = ascii_font = Qnil;
   for (tail = fontlist; CONSP (tail); tail = XCDR (tail))
     {
-      Lisp_Object family, registry;
       int c, charset;
 
       tem = XCAR (tail);
       if (!CONSP (tem)
          || (charset = get_charset_id (XCAR (tem))) < 0
-         || !STRINGP (XCDR (tem)))
-       error ("Elements of fontlist must be a cons of charset and font name");
+         || (!STRINGP (XCDR (tem)) && !CONSP (XCDR (tem))))
+       error ("Elements of fontlist must be a cons of charset and font name pattern");
 
-      tem = Fdowncase (XCDR (tem));
+      tem = XCDR (tem);
+      if (STRINGP (tem))
+       tem = Fdowncase (tem);
+      else
+       tem = Fcons (Fdowncase (Fcar (tem)), Fdowncase (Fcdr (tem)));
       if (charset == CHARSET_ASCII)
        ascii_font = tem;
       else
@@ -916,7 +929,10 @@ FONTLIST is an alist of charsets vs corresponding font name patterns.")
   for (; CONSP (elements); elements = XCDR (elements))
     {
       elt = XCAR (elements);
-      tem = Fcons (XCAR (elt), font_family_registry (XCDR (elt)));
+      tem = XCDR (elt);
+      if (STRINGP (tem))
+       tem = font_family_registry (tem, 0);
+      tem = Fcons (XCAR (elt), tem);
       FONTSET_SET (fontset, XINT (XCAR (elt)), tem);
     }
 
@@ -950,25 +966,25 @@ check_fontset_name (name)
   if (EQ (name, Qt))
     return Vdefault_fontset;
 
-  CHECK_STRING (name, 0);
+  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.
+
+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;
@@ -983,8 +999,8 @@ name of a font, REGSITRY is a registry name of a font.")
     {
       /* CH should be (FROM . TO) where FROM and TO are non-generic
         characters.  */
-      CHECK_NUMBER (XCAR (character), 1);
-      CHECK_NUMBER (XCDR (character), 1);
+      CHECK_NUMBER_CAR (character);
+      CHECK_NUMBER_CDR (character);
       from = XINT (XCAR (character));
       to = XINT (XCDR (character));
       if (!char_valid_p (from, 0) || !char_valid_p (to, 0))
@@ -997,13 +1013,13 @@ 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;
     }
   else
     {
-      CHECK_NUMBER (character, 1);
+      CHECK_NUMBER (character);
       from = XINT (character);
       to = from;
     }
@@ -1022,21 +1038,21 @@ name of a font, REGSITRY is a registry name of a font.")
   if (STRINGP (fontname))
     {
       fontname = Fdowncase (fontname);
-      elt = Fcons (make_number (from), font_family_registry (fontname));
+      elt = Fcons (make_number (from), font_family_registry (fontname, 0));
     }
   else
     {
-      CHECK_CONS (fontname, 2);
+      CHECK_CONS (fontname);
       family = XCAR (fontname);
       registry = XCDR (fontname);
       if (!NILP (family))
        {
-         CHECK_STRING (family, 2);
+         CHECK_STRING (family);
          family = Fdowncase (family);
        }
       if (!NILP (registry))
        {
-         CHECK_STRING (registry, 2);
+         CHECK_STRING (registry);
          registry = Fdowncase (registry);
        }
       elt = Fcons (make_number (from), Fcons (family, registry));
@@ -1045,7 +1061,7 @@ name of a font, REGSITRY is a registry name of a font.")
   /* The arg FRAME is kept for backward compatibility.  We only check
      the validity.  */
   if (!NILP (frame))
-    CHECK_LIVE_FRAME (frame, 3);
+    CHECK_LIVE_FRAME (frame);
 
   for (; from <= to; from++)
     FONTSET_SET (fontset, from, elt);
@@ -1072,20 +1088,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;
@@ -1094,17 +1110,17 @@ If the named font is not yet loaded, return nil.")
 
   (*check_window_system_func) ();
 
-  CHECK_STRING (name, 0);
+  CHECK_STRING (name);
   name = Fdowncase (name);
   if (NILP (frame))
     frame = selected_frame;
-  CHECK_LIVE_FRAME (frame, 1);
+  CHECK_LIVE_FRAME (frame);
   f = XFRAME (frame);
 
   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;
 
@@ -1139,8 +1155,8 @@ If the named font is not yet loaded, return nil.")
 
 
 DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 1, 0,
-  "For internal use only.")
-  (position)
+       doc: /* For internal use only.  */)
+     (position)
      Lisp_Object position;
 {
   int pos, pos_byte, dummy;
@@ -1151,7 +1167,7 @@ DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 1, 0,
   struct frame *f;
   struct face *face;
 
-  CHECK_NUMBER_COERCE_MARKER (position, 0);
+  CHECK_NUMBER_COERCE_MARKER (position);
   pos = XINT (position);
   if (pos < BEGV || pos >= ZV)
     args_out_of_range_3 (position, make_number (BEGV), make_number (ZV));
@@ -1185,7 +1201,7 @@ static void
 accumulate_font_info (arg, character, elt)
      Lisp_Object arg, character, elt;
 {
-  Lisp_Object last, last_char, last_elt, tmp;
+  Lisp_Object last, last_char, last_elt;
 
   if (!CONSP (elt) && !SINGLE_BYTE_CHAR_P (XINT (character)))
     elt = FONTSET_REF (Vdefault_fontset, XINT (character));
@@ -1203,7 +1219,7 @@ accumulate_font_info (arg, character, elt)
        {
          if (this_charset == CHAR_CHARSET (XINT (XCAR (last_char))))
            {
-             XCDR (last_char) = character;
+             XSETCDR (last_char, character);
              return;
            }
        }
@@ -1211,33 +1227,33 @@ accumulate_font_info (arg, character, elt)
        return;
       else if (this_charset == CHAR_CHARSET (XINT (last_char)))
        {
-         XCAR (XCAR (last)) = Fcons (last_char, character);
+         XSETCAR (XCAR (last), Fcons (last_char, character));
          return;
        }
     }
-  XCDR (last) = Fcons (Fcons (character, Fcons (elt, Qnil)), Qnil);
-  XCAR (arg) = XCDR (last);
+  XSETCDR (last, Fcons (Fcons (character, Fcons (elt, Qnil)), Qnil));
+  XSETCAR (arg, XCDR (last));
 }
 
 
 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.
+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;
@@ -1248,14 +1264,14 @@ 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);
 
   if (NILP (frame))
     frame = selected_frame;
-  CHECK_LIVE_FRAME (frame, 1);
+  CHECK_LIVE_FRAME (frame);
   f = XFRAME (frame);
 
   /* Recode realized fontsets whose base is FONTSET in the table
@@ -1295,7 +1311,7 @@ If FRAME is omitted, it defaults to the currently selected frame.")
          c = XINT (XCAR (elt));
          SPLIT_CHAR (c, charset, c1, c2);
          if (c1 == 0)
-           XCAR (elt) = CHARSET_SYMBOL (charset);
+           XSETCAR (elt, CHARSET_SYMBOL (charset));
        }
       else
        c = XINT (XCAR (XCAR (elt)));
@@ -1308,11 +1324,11 @@ If FRAME is omitted, it defaults to the currently selected frame.")
          if (INTEGERP (face_id))
            {
              face = FACE_FROM_ID (f, XINT (face_id));
-             if (face->font && face->font_name)
+             if (face && face->font && face->font_name)
                {
                  font = build_string (face->font_name);
                  if (NILP (Fmember (font, XCDR (XCDR (elt)))))
-                   XCDR (XCDR (elt)) = Fcons (font, XCDR (XCDR (elt)));
+                   XSETCDR (XCDR (elt), Fcons (font, XCDR (XCDR (elt))));
                }
            }
        }
@@ -1322,7 +1338,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);
@@ -1331,17 +1347,17 @@ 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 t, find a font name pattern in the default fontset.  */)
+     (name, ch)
      Lisp_Object name, ch;
 {
-  int c, id;
+  int c;
   Lisp_Object fontset, elt;
 
   fontset = check_fontset_name (name);
 
-  CHECK_NUMBER (ch, 1);
+  CHECK_NUMBER (ch);
   c = XINT (ch);
   if (!char_valid_p (c, 1))
     invalid_character (c);
@@ -1352,11 +1368,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;
@@ -1376,8 +1391,6 @@ DEFUN ("fontset-list", Ffontset_list, Sfontset_list, 0, 0, 0,
 void
 syms_of_fontset ()
 {
-  int i;
-
   if (!load_font_func)
     /* Window system initializer should have set proper functions.  */
     abort ();
@@ -1397,10 +1410,14 @@ syms_of_fontset ()
   FONTSET_ID (Vdefault_fontset) = make_number (0);
   FONTSET_NAME (Vdefault_fontset)
     = build_string ("-*-*-*-*-*-*-*-*-*-*-*-*-fontset-default");
-#ifdef macintosh
+#if defined (MAC_OS)
   FONTSET_ASCII (Vdefault_fontset)
     = Fcons (make_number (0),
             build_string ("-apple-monaco-medium-r-*--*-120-*-*-*-*-mac-roman"));
+#elif defined (WINDOWSNT)
+  FONTSET_ASCII (Vdefault_fontset)
+    = Fcons (make_number (0),
+            build_string ("-*-courier new-normal-r-*-*-*-100-*-*-*-*-iso8859-1"));
 #else
   FONTSET_ASCII (Vdefault_fontset)
     = Fcons (make_number (0),
@@ -1410,68 +1427,50 @@ 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;
 
   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,
-     "*Non-nil means highlight characters shown in wrong size fonts somehow.\n\
-The way to highlight them depends on window system on which Emacs runs.\n\
-On X11, a rectangle is shown around each such character.");
-  Vhighlight_wrong_size_font = Qnil;
-
-  DEFVAR_LISP ("clip-large-size-font", &Vclip_large_size_font,
-     "*Non-nil means characters shown in overlarge fonts are clipped.\n\
-The height of clipping area is the same as that of an ASCII character.\n\
-The width of the area is the same as that of an ASCII character,\n\
-or twice as wide, depending on the character set's column-width.\n\
-\n\
-If the only font you have for a specific character set is too large,\n\
-and clipping these characters makes them hard to read,\n\
-you can set this variable to nil to display the characters without clipping.\n\
-The drawback is that you will get some garbage left on your screen.");
-  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);