From: Kenichi Handa Date: Tue, 17 Jun 2008 01:26:47 +0000 (+0000) Subject: (fontset_pattern_regexp): Escape some regexp characters. X-Git-Tag: emacs-pretest-23.0.90~4718 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=821bc4dbf13da00e16c76cec515f92e33ca3692e;p=emacs.git (fontset_pattern_regexp): Escape some regexp characters. --- diff --git a/src/ChangeLog b/src/ChangeLog index 16e9af14b29..0eebe5ce290 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2008-06-17 Naohiro Aota (tiny change) + + * fontset.c (fontset_pattern_regexp): Escape some reg-expr + characters. + 2008-06-16 Juanma Barranquero * dispextern.h (lookup_non_ascii_face, split_font_name_into_vector) diff --git a/src/fontset.c b/src/fontset.c index 9878569e7b7..e81f6e16c76 100644 --- a/src/fontset.c +++ b/src/fontset.c @@ -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; }