summaryrefslogtreecommitdiff
path: root/src/w32menu.c
diff options
context:
space:
mode:
authorJason Rumney <jasonr@gnu.org>2007-06-17 22:10:06 +0000
committerJason Rumney <jasonr@gnu.org>2007-06-17 22:10:06 +0000
commita50d93457619e711999d60f76f351341e17bf8c2 (patch)
treedb372620d4f93e106ce3e89d704d48844f09240c /src/w32menu.c
parentdf4d83854634de97050ad73559104cb7fce2fd35 (diff)
downloademacs-a50d93457619e711999d60f76f351341e17bf8c2.tar.gz
(add_menu_item): Don't use multibyte string functions on
unicode strings.
Diffstat (limited to 'src/w32menu.c')
-rw-r--r--src/w32menu.c68
1 files changed, 46 insertions, 22 deletions
diff --git a/src/w32menu.c b/src/w32menu.c
index bcd56c8c88e..d8d6fa186bd 100644
--- a/src/w32menu.c
+++ b/src/w32menu.c
@@ -2291,29 +2291,53 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
/* Quote any special characters within the menu item's text and
key binding. */
nlen = orig_len = strlen (out_string);
- for (p = out_string; *p; p = _mbsinc (p))
- {
- if (_mbsnextc (p) == '&')
- nlen++;
- }
+ if (unicode_append_menu)
+ {
+ /* With UTF-8, & cannot be part of a multibyte character. */
+ for (p = out_string; *p; p++)
+ {
+ if (*p == '&')
+ nlen++;
+ }
+ }
+ else
+ {
+ /* If encoded with the system codepage, use multibyte string
+ functions in case of multibyte characters that contain '&'. */
+ for (p = out_string; *p; p = _mbsinc (p))
+ {
+ if (_mbsnextc (p) == '&')
+ nlen++;
+ }
+ }
+
if (nlen > orig_len)
- {
- p = out_string;
- out_string = alloca (nlen + 1);
- q = out_string;
- while (*p)
- {
- if (_mbsnextc (p) == '&')
- {
- _mbsncpy (q, p, 1);
- q = _mbsinc (q);
- }
- _mbsncpy (q, p, 1);
- p = _mbsinc (p);
- q = _mbsinc (q);
- }
- *q = '\0';
- }
+ {
+ p = out_string;
+ out_string = alloca (nlen + 1);
+ q = out_string;
+ while (*p)
+ {
+ if (unicode_append_menu)
+ {
+ if (*p == '&')
+ *q++ = *p;
+ *q++ = *p++;
+ }
+ else
+ {
+ if (_mbsnextc (p) == '&')
+ {
+ _mbsncpy (q, p, 1);
+ q = _mbsinc (q);
+ }
+ _mbsncpy (q, p, 1);
+ p = _mbsinc (p);
+ q = _mbsinc (q);
+ }
+ }
+ *q = '\0';
+ }
if (item != NULL)
fuFlags = MF_POPUP;