$FreeBSD: ports/x11-wm/uwm/files/patch-ad,v 1.2 2002/09/25 14:58:56 trevor Exp $
$NetBSD: patch-ad,v 1.3 1999/12/23 23:12:50 itohy Exp $

--- gram.y.orig	Thu Sep 22 13:14:31 1988
+++ gram.y	Wed Sep 25 14:48:16 2002
@@ -60,8 +60,6 @@
 static char *mcolors[2];		/* Color values used in menus. */
 MenuLink *menu_link;			/* Temporary menu link pointer. */
 
-char *calloc();
-
 %}
 
 %union {
@@ -117,18 +115,18 @@
 			        case IsString:
 			            if ($3 == C_STRING) {
 			                strcpy(KeywordTable[$1].sptr,
-			                        yylval.sval);
+			                        $<sval>2);
 			            } else {
 			                yyerror("illegal construct");
 			            }
-			            free(yylval.sval);
+			            free($<sval>2);
 			            break;
 			        case IsNumeric:
 			            if ($3 == C_STRING) {
 			                *(KeywordTable[$1].nptr) =
-			                                   y_atoi(yylval.sval);
+			                                   y_atoi($<sval>2);
 			            } else yyerror("illegal construct");
-			            free(yylval.sval);
+			            free($<sval>2);
 			            break;
 			        case IsBoolTrue:
 			        case IsBoolFalse:
@@ -197,12 +195,12 @@
 			    ml_ptr = $3;
 			}
 	|	STRING
-			{ $$ = C_STRING; }
+			{ $$ = C_STRING; $<sval>0 = $1; }
 	;
 
 boolvar:	STRING
 			{
-			    ki = keywordlookup(yylval.sval);
+			    ki = keywordlookup($1);
 			    switch (KeywordTable[ki].type) {
 			    case IsBoolTrue:
 			        *(KeywordTable[ki].bptr) = TRUE;
@@ -220,7 +218,7 @@
 	;
 
 keyword:	STRING	{
-			    $$ = keywordlookup(yylval.sval);
+			    $$ = keywordlookup($1);
 			}
 	;
 
@@ -246,9 +244,9 @@
 			{ $$ = CheckButtonState($1); }
 	;
 
-kmask:		STRING { $$ = keyexprlookup(yylval.sval); }
+kmask:		STRING { $$ = keyexprlookup($1); }
 
-contmask:	STRING { $$ = contexprlookup(yylval.sval); }
+contmask:	STRING { $$ = contexprlookup($1); }
 
 buttmodexpr: 	buttmodifier
 			{ $$ = $1; }
@@ -257,7 +255,7 @@
 	;
 
 buttmodifier:	STRING
-			{ $$ = buttexprlookup(yylval.sval); }
+			{ $$ = buttexprlookup($1); }
 	;
 
 menuname:	STRING
@@ -304,7 +302,7 @@
 
 menuaction:	STRING
 			{
-			    ki = keywordlookup(yylval.sval);
+			    ki = keywordlookup($1);
 			    if ((ki != -1) &&
 			        (KeywordTable[ki].type != IsFunction) &&
 			        (KeywordTable[ki].type != IsQuitFunction) &&
@@ -350,7 +348,7 @@
 			}
 	;
 
-strings:	STRING	{ $$ = yylval.sval; }
+strings:	STRING	{ $$ = $1; }
 	|	strings STRING
 			{ $$ = strconcat($1, $2); }
 	;
@@ -387,7 +385,7 @@
 			}
 	;
 
-color:		STRING	{ $$ = yylval.sval; }
+color:		STRING	{ $$ = $1; }
 	|	/* empty */	{ $$ = NULL; }
 	;
 %%
@@ -503,7 +501,6 @@
 strconcat(s1, s2)
 char *s1, *s2;
 {
-    char *malloc();
     char *p;
 
     p = malloc(strlen(s1) + strlen(s2) + 2);
@@ -572,6 +569,8 @@
         setbinding(ICON, index, mask, name);
     if (context & WINDOW)
         setbinding(WINDOW, index, mask, name);
+    if (name)
+	free(name);
 }
 
 /*
@@ -599,12 +598,13 @@
 char *mname;		/* Pointer to menu name, if needed. */
 {
     Binding *ptr;
+    extern char *stash();
 
     ptr = AllocBinding();
     ptr->context = cont;
     ptr->mask = m;
     ptr->func = KeywordTable[i].fptr;
-    ptr->menuname = mname;
+    ptr->menuname = mname ? stash(mname) : NULL;
 
     switch (m & (LeftMask | MiddleMask | RightMask)) {
     case LeftMask:
@@ -771,9 +771,8 @@
     else {
         for(ptr = list; ptr->next; ptr = ptr->next) /* NULL */;
         ptr->next = link;
-        ptr = ptr->next;
-        ptr->next = NULL;
     }
+    link->next = NULL;
     return(list);
 }
 
