135 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
%{
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include "usb_driver.h"
 | 
						|
#define YY_NO_INPUT
 | 
						|
static struct devmand_usb_driver   *current_drv;
 | 
						|
static struct devmand_usb_match_id *current_id;
 | 
						|
 | 
						|
int yylex(void);
 | 
						|
 | 
						|
void yyerror(char *s)
 | 
						|
{
 | 
						|
    fprintf(stderr,"parsing error: %s\n",s);
 | 
						|
}
 | 
						|
 | 
						|
int yywrap()
 | 
						|
{
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
%}
 | 
						|
 | 
						|
%union {
 | 
						|
       char *string;
 | 
						|
}
 | 
						|
 | 
						|
%start drivers
 | 
						|
%token <string>  USB_DRIVER DEV_PREFIX BINARY INTERFACE_CLASS INTERFACE_SUB_CLASS EQUALS DEV_TYPE BLOCK_DEV CHAR_DEV UPSCRIPT DOWNSCRIPT
 | 
						|
SEMICOLON BRACKET_OPEN BRACKET_CLOSE STRING ID INTERFACE_PROTOCOL
 | 
						|
 | 
						|
%%
 | 
						|
drivers :
 | 
						|
	driver
 | 
						|
	{
 | 
						|
	}
 | 
						|
    | drivers driver
 | 
						|
	{
 | 
						|
	};
 | 
						|
 | 
						|
driver :
 | 
						|
	USB_DRIVER STRING {current_drv = add_usb_driver($2);}
 | 
						|
	BRACKET_OPEN
 | 
						|
	usb_driver_statements BRACKET_CLOSE
 | 
						|
	{
 | 
						|
	};
 | 
						|
 | 
						|
usb_driver_statements:
 | 
						|
	usb_driver_statement
 | 
						|
	{
 | 
						|
	}
 | 
						|
    | usb_driver_statements usb_driver_statement
 | 
						|
	{
 | 
						|
	};
 | 
						|
 | 
						|
usb_driver_statement:
 | 
						|
	{current_id = add_usb_match_id(current_drv);}
 | 
						|
	ID BRACKET_OPEN usb_device_id_statements BRACKET_CLOSE
 | 
						|
	{
 | 
						|
	}
 | 
						|
	| BINARY EQUALS STRING SEMICOLON
 | 
						|
	{
 | 
						|
		current_drv->binary = $3;
 | 
						|
	}
 | 
						|
	| DEV_PREFIX EQUALS STRING SEMICOLON
 | 
						|
	{
 | 
						|
		current_drv->devprefix = $3;
 | 
						|
	}
 | 
						|
	| DEV_TYPE EQUALS BLOCK_DEV SEMICOLON
 | 
						|
	{
 | 
						|
		current_drv->dev_type = block_dev;
 | 
						|
	}
 | 
						|
	| DEV_TYPE EQUALS CHAR_DEV SEMICOLON
 | 
						|
	{
 | 
						|
		current_drv->dev_type = char_dev;
 | 
						|
	}
 | 
						|
	| UPSCRIPT EQUALS STRING SEMICOLON
 | 
						|
	{
 | 
						|
		current_drv->upscript = $3;
 | 
						|
	}
 | 
						|
	| DOWNSCRIPT EQUALS STRING SEMICOLON
 | 
						|
	{
 | 
						|
		current_drv->downscript = $3;
 | 
						|
	};
 | 
						|
 | 
						|
 | 
						|
usb_device_id_statements:
 | 
						|
	usb_device_id_statement
 | 
						|
	{
 | 
						|
	}
 | 
						|
	|usb_device_id_statements usb_device_id_statement
 | 
						|
	{
 | 
						|
	};
 | 
						|
 | 
						|
 | 
						|
usb_device_id_statement:
 | 
						|
	INTERFACE_CLASS EQUALS STRING SEMICOLON
 | 
						|
	{
 | 
						|
		int res;
 | 
						|
		unsigned int num;
 | 
						|
		current_id->match_flags |= USB_MATCH_INTERFACE_CLASS;
 | 
						|
		res =  sscanf($3, "0x%x", &num);
 | 
						|
		if (res != 1) {
 | 
						|
			fprintf(stderr, "ERROR");
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
		current_id->match_id.bInterfaceClass = num;
 | 
						|
	}
 | 
						|
	| INTERFACE_SUB_CLASS EQUALS STRING SEMICOLON
 | 
						|
	{
 | 
						|
		int res;
 | 
						|
		unsigned int num;
 | 
						|
		current_id->match_flags |= USB_MATCH_INTERFACE_SUBCLASS;
 | 
						|
		res =  sscanf($3, "0x%x", &num);
 | 
						|
		if (res != 1) {
 | 
						|
			fprintf(stderr, "ERROR");
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
		current_id->match_id.bInterfaceSubClass = num;
 | 
						|
 | 
						|
	}
 | 
						|
	| INTERFACE_PROTOCOL EQUALS STRING SEMICOLON
 | 
						|
	{
 | 
						|
		int res;
 | 
						|
		unsigned int num;
 | 
						|
		current_id->match_flags |= USB_MATCH_INTERFACE_PROTOCOL;
 | 
						|
		res =  sscanf($3, "0x%x", &num);
 | 
						|
		if (res != 1) {
 | 
						|
			fprintf(stderr, "ERROR");
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
		current_id->match_id.bInterfaceProtocol = num;
 | 
						|
 | 
						|
	};
 | 
						|
%%
 |