# HG changeset patch # User Kenichi Handa # Date 1098669812 0 # Node ID b935fc1cb542f45939667283cb93e54a184f48e3 # Parent 0c6735b0abb2e49b4408c7c9d08ea35379c3fb85 (fontset_pattern_regexp): Optimize for the case that PATTERN is full XLFD. diff -r 0c6735b0abb2 -r b935fc1cb542 src/fontset.c --- a/src/fontset.c Mon Oct 25 00:46:04 2004 +0000 +++ b/src/fontset.c Mon Oct 25 02:03:32 2004 +0000 @@ -789,16 +789,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 == '?')