summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/term/mac-win.el18
-rw-r--r--src/ChangeLog7
-rw-r--r--src/macterm.c104
4 files changed, 103 insertions, 32 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 33a3d65fe02..40a11a935cf 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2004-12-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
+
+ * term/mac-win.el (encoding-vector, mac-font-encoder-list)
+ (ccl-encode-mac-centraleurroman-font): Use centraleurroman
+ instead of centraleuropean as the name
+
2004-12-17 Michael Albinus <michael.albinus@gmx.de>
Sync with Tramp 2.0.46.
diff --git a/lisp/term/mac-win.el b/lisp/term/mac-win.el
index 5032135da21..2b5c4d2a994 100644
--- a/lisp/term/mac-win.el
+++ b/lisp/term/mac-win.el
@@ -199,7 +199,7 @@ Switch to a buffer editing the last file dropped."
(let
((encoding-vector (make-vector 256 nil))
(i 0)
- (vec ;; mac-centraleuropean (128..255) -> UCS mapping
+ (vec ;; mac-centraleurroman (128..255) -> UCS mapping
[ #x00C4 ;; 128:LATIN CAPITAL LETTER A WITH DIAERESIS
#x0100 ;; 129:LATIN CAPITAL LETTER A WITH MACRON
#x0101 ;; 130:LATIN SMALL LETTER A WITH MACRON
@@ -339,8 +339,8 @@ Switch to a buffer editing the last file dropped."
(setq i (1+ i)))
(setq translation-table
(make-translation-table-from-vector encoding-vector))
-;; (define-translation-table 'mac-centraleuropean-decoder translation-table)
- (define-translation-table 'mac-centraleuropean-encoder
+;; (define-translation-table 'mac-centraleurroman-decoder translation-table)
+ (define-translation-table 'mac-centraleurroman-encoder
(char-table-extra-slot translation-table 0)))
(let
@@ -493,8 +493,8 @@ Switch to a buffer editing the last file dropped."
(defvar mac-font-encoder-list
'(("mac-roman" mac-roman-encoder
ccl-encode-mac-roman-font "%s")
- ("mac-centraleuropean" mac-centraleuropean-encoder
- ccl-encode-mac-centraleuropean-font "%s ce")
+ ("mac-centraleurroman" mac-centraleurroman-encoder
+ ccl-encode-mac-centraleurroman-font "%s ce")
("mac-cyrillic" mac-cyrillic-encoder
ccl-encode-mac-cyrillic-font "%s cy")))
@@ -515,15 +515,15 @@ Switch to a buffer editing the last file dropped."
(if mac-encoded
(aset table c mac-encoded))))))))
-(define-ccl-program ccl-encode-mac-centraleuropean-font
+(define-ccl-program ccl-encode-mac-centraleurroman-font
`(0
(if (r0 != ,(charset-id 'ascii))
(if (r0 <= ?\x8f)
- (translate-character mac-centraleuropean-encoder r0 r1)
+ (translate-character mac-centraleurroman-encoder r0 r1)
((r1 <<= 7)
(r1 |= r2)
- (translate-character mac-centraleuropean-encoder r0 r1)))))
- "CCL program for Mac Central European font")
+ (translate-character mac-centraleurroman-encoder r0 r1)))))
+ "CCL program for Mac Central European Roman font")
(define-ccl-program ccl-encode-mac-cyrillic-font
`(0
diff --git a/src/ChangeLog b/src/ChangeLog
index 63f0fe42a37..1d4c964a45c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
+2004-12-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
+
+ * macterm.c (endif, x_font_name_to_mac_font_name): Use
+ maccentraleurroman instead of maccentraleuropean
+ (mac_c_string_match, mac_do_list_fonts): Speed up font search by
+ quickly finding a specific font without needing regexps.
+
2004-12-15 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* syssignal.h: Declare main_thread.
diff --git a/src/macterm.c b/src/macterm.c
index 4e3b0ae1b65..ca15d3c4965 100644
--- a/src/macterm.c
+++ b/src/macterm.c
@@ -5976,7 +5976,7 @@ mac_to_x_fontname (name, size, style, scriptcode, encoding_base)
strcpy(cs, "mac-cyrillic");
break;
case kTextEncodingMacCentralEurRoman:
- strcpy(cs, "mac-centraleuropean");
+ strcpy(cs, "mac-centraleurroman");
break;
case kTextEncodingMacSymbol:
case kTextEncodingMacDingbats:
@@ -6034,7 +6034,7 @@ x_font_name_to_mac_font_name (char *xf, char *mf)
coding_system = Qeuc_kr;
else if (strcmp (cs, "mac-roman") == 0
|| strcmp (cs, "mac-cyrillic") == 0
- || strcmp (cs, "mac-centraleuropean") == 0
+ || strcmp (cs, "mac-centraleurroman") == 0
|| strcmp (cs, "adobe-fontspecific") == 0)
strcpy (mf, family);
else
@@ -6276,6 +6276,28 @@ static int xlfd_scalable_fields[] =
};
static Lisp_Object
+mac_c_string_match (regexp, string, nonspecial, exact)
+ Lisp_Object regexp;
+ const char *string, *nonspecial;
+ int exact;
+{
+ if (exact)
+ {
+ if (strcmp (string, nonspecial) == 0)
+ return build_string (string);
+ }
+ else if (strstr (string, nonspecial))
+ {
+ Lisp_Object str = build_string (string);
+
+ if (fast_string_match (regexp, str) >= 0)
+ return str;
+ }
+
+ return Qnil;
+}
+
+static Lisp_Object
mac_do_list_fonts (pattern, maxnames)
char *pattern;
int maxnames;
@@ -6286,6 +6308,8 @@ mac_do_list_fonts (pattern, maxnames)
char scaled[256];
char *ptr;
int scl_val[XLFD_SCL_LAST], *field, *val;
+ char *longest_start, *cur_start, *nonspecial;
+ int longest_len, cur_len, exact;
for (i = 0; i < XLFD_SCL_LAST; i++)
scl_val[i] = -1;
@@ -6343,34 +6367,66 @@ mac_do_list_fonts (pattern, maxnames)
ptr = regex;
*ptr++ = '^';
- /* Turn pattern into a regexp and do a regexp match. */
+ longest_start = cur_start = ptr;
+ longest_len = cur_len = 0;
+ exact = 1;
+
+ /* Turn pattern into a regexp and do a regexp match. Also find the
+ longest substring containing no special characters. */
for (; *pattern; pattern++)
{
- if (*pattern == '?')
- *ptr++ = '.';
- else if (*pattern == '*')
- {
- *ptr++ = '.';
- *ptr++ = '*';
- }
+ if (*pattern == '?' || *pattern == '*')
+ {
+ if (cur_len > longest_len)
+ {
+ longest_start = cur_start;
+ longest_len = cur_len;
+ }
+ cur_len = 0;
+ exact = 0;
+
+ if (*pattern == '?')
+ *ptr++ = '.';
+ else /* if (*pattern == '*') */
+ {
+ *ptr++ = '.';
+ *ptr++ = '*';
+ }
+ }
else
- *ptr++ = tolower (*pattern);
+ {
+ if (cur_len == 0)
+ cur_start = ptr;
+ cur_len++;
+
+ *ptr++ = tolower (*pattern);
+ }
}
+
+ if (cur_len > longest_len)
+ {
+ longest_start = cur_start;
+ longest_len = cur_len;
+ }
+
*ptr = '$';
*(ptr + 1) = '\0';
+ nonspecial = xmalloc (longest_len + 1);
+ strncpy (nonspecial, longest_start, longest_len);
+ nonspecial[longest_len] = '\0';
+
pattern_regex = build_string (regex);
for (i = 0; i < font_name_count; i++)
{
- fontname = build_string (font_name_table[i]);
- if (fast_string_match (pattern_regex, fontname) >= 0)
+ fontname = mac_c_string_match (pattern_regex, font_name_table[i],
+ nonspecial, exact);
+ if (!NILP (fontname))
{
font_list = Fcons (fontname, font_list);
-
- n_fonts++;
- if (maxnames > 0 && n_fonts >= maxnames)
- break;
+ if (exact || maxnames > 0 && ++n_fonts >= maxnames)
+ return font_list;
}
else if (scl_val[XLFD_SCL_PIXEL_SIZE] > 0
&& (ptr = strstr (font_name_table[i], "-0-0-75-75-m-0-")))
@@ -6384,17 +6440,19 @@ mac_do_list_fonts (pattern, maxnames)
scl_val[XLFD_SCL_POINT_SIZE],
scl_val[XLFD_SCL_AVGWIDTH],
ptr + sizeof ("-0-0-75-75-m-0-") - 1);
- fontname = build_string (scaled);
- if (fast_string_match (pattern_regex, fontname) >= 0)
+ fontname = mac_c_string_match (pattern_regex, scaled,
+ nonspecial, exact);
+ if (!NILP (fontname))
{
font_list = Fcons (fontname, font_list);
-
- n_fonts++;
- if (maxnames > 0 && n_fonts >= maxnames)
- break;
+ if (exact || maxnames > 0 && ++n_fonts >= maxnames)
+ return font_list;
}
}
}
+
+ xfree (nonspecial);
+
return font_list;
}