changeset 37940:e76f885709fc

(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]: Protect unibyte strings created by replacing their multibyte equivalents in menu_items.
author Gerd Moellmann <gerd@gnu.org>
date Tue, 29 May 2001 14:30:27 +0000
parents ef06ff6aad4d
children 8c8f2ccf187d
files src/xmenu.c
diffstat 1 files changed, 50 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/xmenu.c	Tue May 29 14:09:54 2001 +0000
+++ b/src/xmenu.c	Tue May 29 14:30:27 2001 +0000
@@ -1441,11 +1441,16 @@
 	  /* Create a new pane.  */
 	  Lisp_Object pane_name, prefix;
 	  char *pane_string;
+	  
 	  pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME];
 	  prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX];
+	  
 #ifndef HAVE_MULTILINGUAL_MENU
 	  if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
-	    pane_name = string_make_unibyte (pane_name);
+	    {
+	      pane_name = string_make_unibyte (pane_name);
+	      AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name;
+	    }
 #endif
 	  pane_string = (NILP (pane_name)
 			 ? "" : (char *) XSTRING (pane_name)->data);
@@ -1483,21 +1488,27 @@
 	  Lisp_Object item_name, enable, descrip, def, type, selected;
 	  Lisp_Object help;
 	  
-	  item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME];
-	  enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE];
-	  descrip
-	    = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY];
-	  def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
-	  type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE];
-	  selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED];
-	  help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP];
+	  item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME);
+	  enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE);
+	  descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY);
+	  def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION);
+	  type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE);
+	  selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED);
+	  help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP);
 
 #ifndef HAVE_MULTILINGUAL_MENU
           if (STRING_MULTIBYTE (item_name))
-            item_name = string_make_unibyte (item_name);
+	    {
+	      item_name = string_make_unibyte (item_name);
+	      AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
+	    }
+	  
           if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
-            descrip = string_make_unibyte (descrip);
-#endif
+	    {
+	      descrip = string_make_unibyte (descrip);
+	      AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
+	    }
+#endif /* not HAVE_MULTILINGUAL_MENU */
 
 	  wv = xmalloc_widget_value ();
 	  if (prev_wv) 
@@ -2020,11 +2031,16 @@
 	  /* Create a new pane.  */
 	  Lisp_Object pane_name, prefix;
 	  char *pane_string;
-	  pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME];
-	  prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX];
+	  
+	  pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME);
+	  prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX);
+	  
 #ifndef HAVE_MULTILINGUAL_MENU
-	  if (!NILP (pane_name) && STRING_MULTIBYTE (pane_name))
-	    pane_name = string_make_unibyte (pane_name);
+	  if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
+	    {
+	      pane_name = string_make_unibyte (pane_name);
+	      AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name;
+	    }
 #endif
 	  pane_string = (NILP (pane_name)
 			 ? "" : (char *) XSTRING (pane_name)->data);
@@ -2064,21 +2080,27 @@
 	{
 	  /* Create a new item within current pane.  */
 	  Lisp_Object item_name, enable, descrip, def, type, selected, help;
-	  item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME];
-	  enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE];
-	  descrip
-	    = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY];
-	  def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
-	  type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE];
-	  selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED];
-	  help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP];
+	  item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME);
+	  enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE);
+	  descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY);
+	  def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION);
+	  type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE);
+	  selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED);
+	  help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP);
 
 #ifndef HAVE_MULTILINGUAL_MENU
           if (STRINGP (item_name) && STRING_MULTIBYTE (item_name))
-            item_name = string_make_unibyte (item_name);
+	    {
+	      item_name = string_make_unibyte (item_name);
+	      AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
+	    }
+	  
           if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
-            descrip = string_make_unibyte (descrip);
-#endif
+	    {
+	      descrip = string_make_unibyte (descrip);
+	      AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
+	    }
+#endif /* not HAVE_MULTILINGUAL_MENU */
  
 	  wv = xmalloc_widget_value ();
 	  if (prev_wv) 
@@ -2132,6 +2154,7 @@
       if (STRING_MULTIBYTE (title))
 	title = string_make_unibyte (title);
 #endif
+      
       wv_title->name = (char *) XSTRING (title)->data;
       wv_title->enabled = True;
       wv_title->button_type = BUTTON_TYPE_NONE;