diff src/fontset.c @ 83222:ae7fab96922c

Merged in changes from CVS trunk. Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-626 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-627 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-628 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-629 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-630 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-631 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-632 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-633 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-634 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-635 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-636 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-637 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-638 Update from CVS * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-54 Update from CVS * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-55 Update from CVS * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-56 Update from CVS: Add lisp/legacy-gnus-agent.el * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-57 Update from CVS * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-58 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-262
author Karoly Lorentey <lorentey@elte.hu>
date Mon, 25 Oct 2004 18:17:28 +0000
parents 0fc4928cc48e b935fc1cb542
children 7a0245dd1848
line wrap: on
line diff
--- a/src/fontset.c	Tue Oct 19 17:00:02 2004 +0000
+++ b/src/fontset.c	Mon Oct 25 18:17:28 2004 +0000
@@ -790,16 +790,34 @@
       || strcmp (SDATA (pattern), CACHED_FONTSET_NAME))
     {
       /* We must at first update the cached data.  */
-      char *regex = (char *) alloca (SCHARS (pattern) * 2 + 3);
-      char *p0, *p1 = regex;
+      char *regex, *p0, *p1;
+      int ndashes = 0, nstars = 0;
+      
+      for (p0 = SDATA (pattern); *p0; p0++)
+	{
+	  if (*p0 == '-')
+	    ndashes++;
+	  else if (*p0 == '*')
+	    nstars++;
+	}
 
-      /* Convert "*" to ".*", "?" to ".".  */
+      /* If PATTERN is not full XLFD we conert "*" to ".*".  Otherwise
+	 we convert "*" to "[^-]*" which is much faster in regular
+	 expression matching.  */
+      if (ndashes < 14)
+	p1 = regex = (char *) alloca (SBYTES (pattern) + 2 * nstars + 1);
+      else
+	p1 = regex = (char *) alloca (SBYTES (pattern) + 5 * nstars + 1);
+
       *p1++ = '^';
       for (p0 = (char *) SDATA (pattern); *p0; p0++)
 	{
 	  if (*p0 == '*')
 	    {
-	      *p1++ = '.';
+	      if (ndashes < 14)
+		*p1++ = '.';
+	      else
+		*p1++ = '[', *p1++ = '^', *p1++ = '-', *p1++ = ']';
 	      *p1++ = '*';
 	    }
 	  else if (*p0 == '?')