changeset 81450:ea498370bc88

(add_menu_item): Escape `&' characters in menu items and their keybindings.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 16 Jun 2007 18:12:18 +0000
parents b28852f88acf
children c30b19fc8bce
files src/w32menu.c
diffstat 1 files changed, 30 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32menu.c	Sat Jun 16 12:50:37 2007 +0000
+++ b/src/w32menu.c	Sat Jun 16 18:12:18 2007 +0000
@@ -23,6 +23,7 @@
 #include <signal.h>
 
 #include <stdio.h>
+#include <mbstring.h>
 #include "lisp.h"
 #include "termhooks.h"
 #include "keyboard.h"
@@ -2261,8 +2262,9 @@
 add_menu_item (HMENU menu, widget_value *wv, HMENU item)
 {
   UINT fuFlags;
-  char *out_string;
+  char *out_string, *p, *q;
   int return_value;
+  size_t nlen, orig_len;
 
   if (name_is_separator (wv->name))
     {
@@ -2286,6 +2288,33 @@
       else
 	out_string = wv->name;
 
+      /* 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 (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';
+	}
+
       if (item != NULL)
 	fuFlags = MF_POPUP;
       else if (wv->title || wv->call_data == 0)