From alsa-devel-owner@alsa.jcu.cz  Sat Jan 30 17:00:19 1999
Received: from downstairs.db-bbs.com (root@59.usr04.shef.dialup.force9.net [195.166.133.187])
	by marvin.jcu.cz (8.9.1a/8.9.1) with ESMTP id QAA10809
	for <alsa-devel@alsa.jcu.cz>; Sat, 30 Jan 1999 16:57:56 +0100
Received: by sandy.force9.co.uk
	via sendmail from stdin
	id <m106cmN-000BMZC@downstairs.db-bbs.com> (Debian Smail3.2.0.101)
	for alsa-devel@alsa.jcu.cz; Sat, 30 Jan 1999 15:57:51 +0000 (GMT) 
Message-Id: <m106cmN-000BMZC@downstairs.db-bbs.com>
From: chrisb@sandy.force9.co.uk (Chris Butler)
Subject: [PATCH] Fixes in alsactl parser/lexer.
To: alsa-devel@alsa.jcu.cz
Date: Sat, 30 Jan 1999 15:57:50 +0000 (GMT)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=ELM917711870-5443-0_
Content-Transfer-Encoding: 7bit
Reply-To: alsa-devel@alsa.jcu.cz
Sender: alsa-devel-owner@alsa.jcu.cz
Precedence: list


--ELM917711870-5443-0_
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Hi,

The following patch gets rid of bison's warning messages and fixes
support for rawdata/bytearrays.

-- 
Chris Butler
<chrisb@sandy.force9.co.uk>


--ELM917711870-5443-0_
Content-Type: text/plain
Content-Disposition: inline; filename="/usr/src/alsa/alsa-utils/alsactl/alsactl-parser.diff"
Content-Transfer-Encoding: 7bit

Index: alsactl_lexer.l
===================================================================
RCS file: /home/alsa/cvsroot/alsa-utils/alsactl/alsactl_lexer.l,v
retrieving revision 1.4
diff -u -r1.4 alsactl_lexer.l
--- alsactl_lexer.l	1998/11/25 19:57:50	1.4
+++ alsactl_lexer.l	1999/01/30 15:53:21
@@ -22,6 +22,12 @@
 %{
 
 #include "alsactl.h"
+
+struct bytearray {
+  unsigned char *data;
+  size_t datalen;
+};
+
 #include "alsactl_parser.h"
 
 #define YY_NO_UNPUT
@@ -92,11 +98,13 @@
 			  char *p = yytext + 1, x[3];
 			  unsigned char *d;
 			  int val;
-			  yylval.a_value = d = (unsigned char *)malloc( 32 );
-			  while ( p ) {
-                            strncpy( x, p, 2 ); x[2] = '\0';
-			    sscanf( x, "%02x", &val );
-			    *d++ = val;
+			  yylval.a_value.data = d = (unsigned char *)malloc( 32 );
+			  yylval.a_value.datalen = 0;
+			  while (p) {
+                            strncpy(x, p, 2); x[2] = '\0';
+			    sscanf(x, "%02x", &val);
+			    *d++ = val; 
+			    ++yylval.a_value.datalen;
 			  }
 		          return L_BYTEARRAY; }
 
Index: alsactl_parser.y
===================================================================
RCS file: /home/alsa/cvsroot/alsa-utils/alsactl/alsactl_parser.y,v
retrieving revision 1.9
diff -u -r1.9 alsactl_parser.y
--- alsactl_parser.y	1999/01/24 16:48:15	1.9
+++ alsactl_parser.y	1999/01/30 15:53:22
@@ -32,6 +32,13 @@
 extern int linecount;
 extern FILE *yyin;
 
+	/* structure for byte arrays */ 
+
+struct bytearray {
+  unsigned char *data;
+  size_t datalen;
+};
+
 	/* local functions */
 
 static void yyerror(char *, ...);
@@ -60,6 +67,7 @@
 
 static void set_switch_boolean(int val);
 static void set_switch_integer(int val);
+static void set_switch_bytearray(struct bytearray val);
 static void set_switch_iec958ocs_begin(int end);
 static void set_switch_iec958ocs(int idx, unsigned short val, unsigned short mask);
 
@@ -85,7 +93,7 @@
     int b_value;
     int i_value;
     char *s_value;
-    unsigned char *a_value;
+    struct bytearray a_value;
   };
 
 %token <b_value> L_TRUE L_FALSE
@@ -108,7 +116,7 @@
 %type <b_value> boolean
 %type <i_value> integer
 %type <s_value> string
-%type <a_value> bytearray
+%type <a_value> rawdata
 
 %%
 
@@ -161,7 +169,7 @@
 	| xmchls xmchl
 	;
 
-xmchl	: L_INTEGER		{ set_mixer_channel( $1, -1 ); }
+xmchl	: integer		{ set_mixer_channel( $1, -1 ); }
 	| L_MUTE		{ set_mixer_channel_flags( SND_MIXER_FLG_MUTE_LEFT, SND_MIXER_FLG_MUTE_LEFT ); }
 	| L_RECORD		{ set_mixer_channel_flags( SND_MIXER_FLG_RECORD_LEFT, SND_MIXER_FLG_RECORD_LEFT ); }
 	| L_SWOUT		{ set_mixer_channel_flags( SND_MIXER_FLG_LTOR_OUT, SND_MIXER_FLG_LTOR_OUT ); }
@@ -173,7 +181,7 @@
 	| xmchrs xmchr
 	;
 
-xmchr	: L_INTEGER		{ set_mixer_channel( -1, $1 ); }
+xmchr	: integer		{ set_mixer_channel( -1, $1 ); }
 	| L_MUTE		{ set_mixer_channel_flags( SND_MIXER_FLG_MUTE_RIGHT, SND_MIXER_FLG_MUTE_RIGHT ); }
 	| L_RECORD		{ set_mixer_channel_flags( SND_MIXER_FLG_RECORD_RIGHT, SND_MIXER_FLG_RECORD_RIGHT ); }
 	| L_SWOUT		{ set_mixer_channel_flags( SND_MIXER_FLG_RTOL_OUT, SND_MIXER_FLG_RTOL_OUT ); }
@@ -185,7 +193,7 @@
 	| xmchs xmch
 	;
 
-xmch	: L_INTEGER		{ set_mixer_channel( $1, $1 ); }
+xmch	: integer		{ set_mixer_channel( $1, $1 ); }
 	| L_MUTE		{ set_mixer_channel_flags( SND_MIXER_FLG_MUTE, SND_MIXER_FLG_MUTE ); }
 	| L_RECORD		{ set_mixer_channel_flags( SND_MIXER_FLG_RECORD, SND_MIXER_FLG_RECORD ); }
 	| error			{ yyerror( "unknown keyword in mono channel section..." ); }
@@ -244,10 +252,10 @@
 	| switches switch
 	;
 
-switch	: L_TRUE		{ set_switch_boolean( 1 ); }
-	| L_FALSE		{ set_switch_boolean( 0 ); }
-	| L_INTEGER		{ set_switch_integer( $1 ); }
-	| L_IEC958OCS '(' { set_switch_iec958ocs_begin( 0 ); } iec958ocs { set_switch_iec958ocs_begin( 1 ); } ')'
+switch	: boolean		{ set_switch_boolean($1); }
+	| integer		{ set_switch_integer($1); }
+	| L_IEC958OCS '(' { set_switch_iec958ocs_begin(0); } iec958ocs { set_switch_iec958ocs_begin(1); } ')'
+	| rawdata		{ set_switch_bytearray($1); }
 	| error			{ yyerror( "unknown keyword in switch() data parameter" ); }
 	;
 
@@ -272,19 +280,16 @@
 
 boolean	: L_TRUE		{ $$ = 1; }
 	| L_FALSE		{ $$ = 0; }
-	| error			{ yyerror( "unknown boolean value" ); }
 	;
 
 integer	: L_INTEGER		{ $$ = $1; }
-	| error			{ yyerror( "unknown integer value" ); }
 	;
 
 string	: L_STRING		{ $$ = $1; }
-	| error			{ yyerror( "unknown string value" ); }
 	;
 
-bytearray : L_BYTEARRAY		{ $$ = $1; }
-	| error			{ yyerror( "unknown byte array value" ); }
+rawdata : L_RAWDATA '(' L_BYTEARRAY ')'	{ $$ = $3; }
+	| L_RAWDATA error	{ yyerror( "malformed rawdata value" ); }
 	;
 
 %%
@@ -514,6 +519,21 @@
 	if (memcmp(&sw->value, &xx, sizeof(xx)))
 		*Xswitchchange = 1;
 	memcpy(&sw->value, &xx, sizeof(xx));
+}
+
+static void set_switch_bytearray(struct bytearray val)
+{
+	/* ok.. this is a little bit wrong, but at these times are all switches same */
+	snd_ctl_switch_t *sw = (snd_ctl_switch_t *) Xswitch;
+
+	if (sw->type > 0 && sw->type < SND_CTL_SW_TYPE_DWORD)
+		yyerror("Switch '%s' isn't a byte array type...", sw->name);
+	if (val.datalen > 32)
+		yyerror("Byte array too large for switch.");
+
+	if (memcmp(sw->value.data8, val.data, val.datalen))
+		*Xswitchchange = 1;
+	memcpy(sw->value.data8, val.data, val.datalen);
 }
 
 static void set_switch_iec958ocs_begin(int end)

--ELM917711870-5443-0_
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit



--ELM917711870-5443-0_--

