changeset 96020:b52fa52cd0fa

(fontset_pattern_regexp): Escape some regexp characters.
author Kenichi Handa <handa@m17n.org>
date Tue, 17 Jun 2008 01:25:11 +0000
parents 6cece6cbe017
children eb7ae3c68e17
files src/fontset.c
diffstat 1 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/fontset.c	Mon Jun 16 22:42:46 2008 +0000
+++ b/src/fontset.c	Tue Jun 17 01:25:11 2008 +0000
@@ -1005,7 +1005,7 @@
     {
       /* We must at first update the cached data.  */
       unsigned char *regex, *p0, *p1;
-      int ndashes = 0, nstars = 0, nplus = 0;
+      int ndashes = 0, nstars = 0, nescs = 0;
 
       for (p0 = SDATA (pattern); *p0; p0++)
 	{
@@ -1013,17 +1013,20 @@
 	    ndashes++;
 	  else if (*p0 == '*')
 	    nstars++;
-	  else if (*p0 == '+')
-	    nplus++;
+	  else if (*p0 == '['
+		   || *p0 == '.' || *p0 == '\\'
+		   || *p0 == '+' || *p0 == '^' 
+		   || *p0 == '$')
+	    nescs++;
 	}
 
       /* 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 = (unsigned char *) alloca (SBYTES (pattern) + 2 * nstars + 2 * nplus + 1);
+	p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 2 * nstars + 2 * nescs + 1);
       else
-	p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 5 * nstars + 2 * nplus + 1);
+	p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 5 * nstars + 2 * nescs + 1);
 
       *p1++ = '^';
       for (p0 = SDATA (pattern); *p0; p0++)
@@ -1038,8 +1041,11 @@
 	    }
 	  else if (*p0 == '?')
 	    *p1++ = '.';
-	  else if (*p0 == '+')
-	    *p1++ = '\\', *p1++ = '+';
+	  else if (*p0 == '['
+		   || *p0 == '.' || *p0 == '\\'
+		   || *p0 == '+' || *p0 == '^' 
+		   || *p0 == '$')
+	    *p1++ = '\\', *p1++ = *p0;
 	  else
 	    *p1++ = *p0;
 	}