(fontset_pattern_regexp): Escape `+' characters in pattern.

This commit is contained in:
Kenichi Handa 2008-06-15 12:26:28 +00:00
parent 574ec56524
commit 9f29608265
2 changed files with 12 additions and 3 deletions

View file

@ -1,3 +1,8 @@
2008-06-15 Naohiro Aota <nao.aota@gmail.com> (tiny change)
* fontset.c (fontset_pattern_regexp): Escape `+' characters in
pattern.
2008-06-15 Andreas Schwab <schwab@suse.de>
* font.c (font_update_drivers): Fix crash when no drivers match.

View 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;
int ndashes = 0, nstars = 0, nplus = 0;
for (p0 = SDATA (pattern); *p0; p0++)
{
@ -1013,15 +1013,17 @@ fontset_pattern_regexp (pattern)
ndashes++;
else if (*p0 == '*')
nstars++;
else if (*p0 == '+')
nplus++;
}
/* 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 + 1);
p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 2 * nstars + 2 * nplus + 1);
else
p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 5 * nstars + 1);
p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 5 * nstars + 2 * nplus + 1);
*p1++ = '^';
for (p0 = SDATA (pattern); *p0; p0++)
@ -1036,6 +1038,8 @@ fontset_pattern_regexp (pattern)
}
else if (*p0 == '?')
*p1++ = '.';
else if (*p0 == '+')
*p1++ = '\\', *p1++ = '+';
else
*p1++ = *p0;
}