$NetBSD: patch-ad,v 1.3 2013/01/11 23:36:16 joerg Exp $

--- gram.y.orig	1988-09-22 13:14:31.000000000 +0000
+++ gram.y
@@ -60,7 +60,10 @@ static char *hcolors[4];		/* Color value
 static char *mcolors[2];		/* Color values used in menus. */
 MenuLink *menu_link;			/* Temporary menu link pointer. */
 
+#ifdef X_NOT_STDC_ENV
 char *calloc();
+char *malloc();
+#endif
 
 %}
 
@@ -117,18 +120,18 @@ expr:		keyword '=' compexpr
 			        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 +200,12 @@ compexpr:	keyexpr ':' contexpr ':' butte
 			    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 +223,7 @@ boolvar:	STRING
 	;
 
 keyword:	STRING	{
-			    $$ = keywordlookup(yylval.sval);
+			    $$ = keywordlookup($1);
 			}
 	;
 
@@ -246,9 +249,9 @@ buttexpr:	buttmodexpr
 			{ $$ = 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 +260,7 @@ buttmodexpr: 	buttmodifier
 	;
 
 buttmodifier:	STRING
-			{ $$ = buttexprlookup(yylval.sval); }
+			{ $$ = buttexprlookup($1); }
 	;
 
 menuname:	STRING
@@ -304,7 +307,7 @@ menuline:	strings ':' color2 menuaction 
 
 menuaction:	STRING
 			{
-			    ki = keywordlookup(yylval.sval);
+			    ki = keywordlookup($1);
 			    if ((ki != -1) &&
 			        (KeywordTable[ki].type != IsFunction) &&
 			        (KeywordTable[ki].type != IsQuitFunction) &&
@@ -350,7 +353,7 @@ menuaction:	STRING
 			}
 	;
 
-strings:	STRING	{ $$ = yylval.sval; }
+strings:	STRING	{ $$ = $1; }
 	|	strings STRING
 			{ $$ = strconcat($1, $2); }
 	;
@@ -387,7 +390,7 @@ color2:		'(' color ':' color ')' ':'
 			}
 	;
 
-color:		STRING	{ $$ = yylval.sval; }
+color:		STRING	{ $$ = $1; }
 	|	/* empty */	{ $$ = NULL; }
 	;
 %%
@@ -503,7 +506,6 @@ char *
 strconcat(s1, s2)
 char *s1, *s2;
 {
-    char *malloc();
     char *p;
 
     p = malloc(strlen(s1) + strlen(s2) + 2);
@@ -572,6 +574,8 @@ char *name;		/* Menu, if needed. */
         setbinding(ICON, index, mask, name);
     if (context & WINDOW)
         setbinding(WINDOW, index, mask, name);
+    if (name)
+	free(name);
 }
 
 /*
@@ -599,12 +603,13 @@ int m;		/* Key/button/modifier mask. */
 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 +776,8 @@ MenuLink *link;
     else {
         for(ptr = list; ptr->next; ptr = ptr->next) /* NULL */;
         ptr->next = link;
-        ptr = ptr->next;
-        ptr->next = NULL;
     }
+    link->next = NULL;
     return(list);
 }
 
@@ -814,6 +818,8 @@ Bool ResetMenus()
     Menus = NULL;
 }
 
+void LoadXDefaults (void);
+
 /*
  * Set all numeric variables to zero and all boolean variables to FALSE.
  */
