diff options
Diffstat (limited to 'src/fontset.c')
| -rw-r--r-- | src/fontset.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/fontset.c b/src/fontset.c index 84384c06d8c..a8bab6897d6 100644 --- a/src/fontset.c +++ b/src/fontset.c | |||
| @@ -1069,16 +1069,34 @@ fontset_pattern_regexp (pattern) | |||
| 1069 | || strcmp (SDATA (pattern), CACHED_FONTSET_NAME)) | 1069 | || strcmp (SDATA (pattern), CACHED_FONTSET_NAME)) |
| 1070 | { | 1070 | { |
| 1071 | /* We must at first update the cached data. */ | 1071 | /* We must at first update the cached data. */ |
| 1072 | char *regex = (char *) alloca (SCHARS (pattern) * 2 + 3); | 1072 | char *regex, *p0, *p1; |
| 1073 | char *p0, *p1 = regex; | 1073 | int ndashes = 0, nstars = 0; |
| 1074 | |||
| 1075 | for (p0 = SDATA (pattern); *p0; p0++) | ||
| 1076 | { | ||
| 1077 | if (*p0 == '-') | ||
| 1078 | ndashes++; | ||
| 1079 | else if (*p0 == '*') | ||
| 1080 | nstars++; | ||
| 1081 | } | ||
| 1082 | |||
| 1083 | /* If PATTERN is not full XLFD we conert "*" to ".*". Otherwise | ||
| 1084 | we convert "*" to "[^-]*" which is much faster in regular | ||
| 1085 | expression matching. */ | ||
| 1086 | if (ndashes < 14) | ||
| 1087 | p1 = regex = (char *) alloca (SBYTES (pattern) + 2 * nstars + 1); | ||
| 1088 | else | ||
| 1089 | p1 = regex = (char *) alloca (SBYTES (pattern) + 5 * nstars + 1); | ||
| 1074 | 1090 | ||
| 1075 | /* Convert "*" to ".*", "?" to ".". */ | ||
| 1076 | *p1++ = '^'; | 1091 | *p1++ = '^'; |
| 1077 | for (p0 = (char *) SDATA (pattern); *p0; p0++) | 1092 | for (p0 = (char *) SDATA (pattern); *p0; p0++) |
| 1078 | { | 1093 | { |
| 1079 | if (*p0 == '*') | 1094 | if (*p0 == '*') |
| 1080 | { | 1095 | { |
| 1081 | *p1++ = '.'; | 1096 | if (ndashes < 14) |
| 1097 | *p1++ = '.'; | ||
| 1098 | else | ||
| 1099 | *p1++ = '[', *p1++ = '^', *p1++ = '-', *p1++ = ']'; | ||
| 1082 | *p1++ = '*'; | 1100 | *p1++ = '*'; |
| 1083 | } | 1101 | } |
| 1084 | else if (*p0 == '?') | 1102 | else if (*p0 == '?') |