(fontset_pattern_regexp): Escape some regexp characters.
authorKenichi Handa <handa@m17n.org>
Tue, 17 Jun 2008 01:26:47 +0000 (01:26 +0000)
committerKenichi Handa <handa@m17n.org>
Tue, 17 Jun 2008 01:26:47 +0000 (01:26 +0000)
src/ChangeLog
src/fontset.c

index 16e9af1..0eebe5c 100644 (file)
@@ -1,3 +1,8 @@
+2008-06-17  Naohiro Aota  <nao.aota@gmail.com>  (tiny change)
+
+       * fontset.c (fontset_pattern_regexp): Escape some reg-expr
+       characters.
+
 2008-06-16  Juanma Barranquero  <lekktu@gmail.com>
 
        * dispextern.h (lookup_non_ascii_face, split_font_name_into_vector)
index 9878569..e81f6e1 100644 (file)
@@ -1005,7 +1005,7 @@ fontset_pattern_regexp (pattern)
     {
       /* 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 @@ fontset_pattern_regexp (pattern)
            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 @@ fontset_pattern_regexp (pattern)
            }
          else if (*p0 == '?')
            *p1++ = '.';
-         else if (*p0 == '+')
-           *p1++ = '\\', *p1++ = '+';
+         else if (*p0 == '['
+                  || *p0 == '.' || *p0 == '\\'
+                  || *p0 == '+' || *p0 == '^' 
+                  || *p0 == '$')
+           *p1++ = '\\', *p1++ = *p0;
          else
            *p1++ = *p0;
        }