⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yacc_cis.y

📁 pcmcia source code
💻 Y
字号:
%{/* * yacc_cis.y 1.13 2001/08/24 12:21:41 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License * at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and * limitations under the License.  * * The initial developer of the original code is David A. Hinds * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved. * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License version 2 (the "GPL"), in * which case the provisions of the GPL are applicable instead of the * above.  If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by * deleting the provisions above and replace them with the notice and * other provisions required by the GPL.  If you do not delete the * provisions above, a recipient may use your version of this file * under either the MPL or the GPL. */#include <sys/types.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stdarg.h>#include <math.h>#include <pcmcia/cs_types.h>#include <pcmcia/cs.h>#include <pcmcia/cistpl.h>#include "pack_cis.h"/* If bison: generate nicer error messages */ #define YYERROR_VERBOSE 1 extern int current_lineno;void yyerror(char *msg, ...);static tuple_info_t *new_tuple(u_char type, cisparse_t *parse);%}%token STRING NUMBER FLOAT VOLTAGE CURRENT SIZE%token VERS_1 MANFID FUNCID CONFIG CFTABLE MFC CHECKSUM%token POST ROM BASE LAST_INDEX CJEDEC AJEDEC%token DEV_INFO ATTR_DEV_INFO NO_INFO%token TIME TIMING WAIT READY RESERVED%token VNOM VMIN VMAX ISTATIC IAVG IPEAK IDOWN%token VCC VPP1 VPP2 IO MEM%token DEFAULT BVD WP RDYBSY MWAIT AUDIO READONLY PWRDOWN%token BIT8 BIT16 LINES RANGE%token IRQ_NO MASK LEVEL PULSE SHARED%union {    char *str;    u_long num;    float flt;    cistpl_power_t pwr;    cisparse_t *parse;    tuple_info_t *tuple;}%type <str> STRING%type <num> NUMBER SIZE VOLTAGE CURRENT TIME%type <flt> FLOAT%type <pwr> pwr pwrlist%type <parse> vers_1 manfid funcid config cftab io mem irq timing%type <parse> dev_info attr_dev_info checksum cjedec ajedec%type <tuple> tuple chain cis;%%cis:	  chain		{ cis_root = $1; }	| chain mfc		{ cis_root = $1; }	;chain:	  /* nothing */		{ $$ = NULL; }	| chain tuple		{		    if ($1 == NULL) {			$$ = $2;		    } else if ($2 == NULL) {			$$ = $1;		    } else {			tuple_info_t *tail = $1;			while (tail->next != NULL) tail = tail->next;			tail->next = $2;			$$ = $1;		    }		} 	;mfc:	  MFC '{' chain '}'		{ mfc[nf++] = $3; }	| mfc ',' '{' chain '}'		{ mfc[nf++] = $4; }	;	tuple:	  dev_info		{ $$ = new_tuple(CISTPL_DEVICE, $1); }	| attr_dev_info		{ $$ = new_tuple(CISTPL_DEVICE_A, $1); }	| vers_1		{ $$ = new_tuple(CISTPL_VERS_1, $1); }	| manfid		{ $$ = new_tuple(CISTPL_MANFID, $1); }	| funcid		{ $$ = new_tuple(CISTPL_FUNCID, $1); }	| config		{ $$ = new_tuple(CISTPL_CONFIG, $1); }	| cftab		{ $$ = new_tuple(CISTPL_CFTABLE_ENTRY, $1); }	| checksum		{ $$ = NULL; }	| error		{ $$ = NULL; }	| cjedec		{ $$ = new_tuple(CISTPL_JEDEC_C, $1); }	| ajedec		{ $$ = new_tuple(CISTPL_JEDEC_A, $1); }	;dev_info: DEV_INFO		{ $$ = calloc(1, sizeof(cisparse_t)); }	| dev_info NUMBER TIME ',' SIZE		{		    $$->device.dev[$$->device.ndev].type = $2;		    $$->device.dev[$$->device.ndev].speed = $3;		    $$->device.dev[$$->device.ndev].size = $5;		    $$->device.ndev++;		}	| dev_info NO_INFO	;attr_dev_info: ATTR_DEV_INFO		{ $$ = calloc(1, sizeof(cisparse_t)); }	| attr_dev_info NUMBER TIME ',' SIZE		{		    $$->device.dev[$$->device.ndev].type = $2;		    $$->device.dev[$$->device.ndev].speed = $3;		    $$->device.dev[$$->device.ndev].size = $5;		    $$->device.ndev++;		}	| attr_dev_info NO_INFO	;vers_1:	  VERS_1 FLOAT		{		    $$ = calloc(1, sizeof(cisparse_t));		    $$->version_1.major = $2;		    $2 -= floor($2+0.01);		    while (fabs($2 - floor($2+0.5)) > 0.01) {			$2 *= 10;		    }		    $$->version_1.minor = $2+0.01;		}	| vers_1 ',' STRING		{		    cistpl_vers_1_t *v = &$$->version_1;		    u_int pos = 0;		    if (v->ns) {			pos = v->ofs[v->ns-1];			pos += strlen(v->str+pos)+1;		    }		    v->ofs[v->ns] = pos;		    strcpy(v->str+pos, $3);		    v->ns++;		}	;manfid:	  MANFID NUMBER ',' NUMBER		{		    $$ = calloc(1, sizeof(cisparse_t));		    $$->manfid.manf = $2;		    $$->manfid.card = $4;		}	;funcid:	  FUNCID NUMBER 		{		    $$ = calloc(1, sizeof(cisparse_t));		    $$->funcid.func = $2;		}	| funcid POST		{ $$->funcid.sysinit |= CISTPL_SYSINIT_POST; }	| funcid ROM		{ $$->funcid.sysinit |= CISTPL_SYSINIT_ROM; }	;cjedec:	  CJEDEC NUMBER NUMBER		{		    $$ = calloc(1, sizeof(cisparse_t));		    $$->jedec.id[0].mfr = $2;		    $$->jedec.id[0].info = $3;		    $$->jedec.nid = 1;		}	| cjedec ',' NUMBER NUMBER		{		    $$->jedec.id[$$->jedec.nid].mfr = $3;		    $$->jedec.id[$$->jedec.nid++].info = $4;		}	;ajedec:	  AJEDEC NUMBER NUMBER		{		    $$ = calloc(1, sizeof(cisparse_t));		    $$->jedec.id[0].mfr = $2;		    $$->jedec.id[0].info = $3;		    $$->jedec.nid = 1;		}	| ajedec ',' NUMBER NUMBER		{		    $$->jedec.id[$$->jedec.nid].mfr = $3;		    $$->jedec.id[$$->jedec.nid++].info = $4;		}	;config:	  CONFIG BASE NUMBER MASK NUMBER  LAST_INDEX NUMBER		{		    $$ = calloc(1, sizeof(cisparse_t));		    $$->config.base = $3;		    $$->config.rmask[0] = $5;		    $$->config.last_idx = $7;		}	;pwr:	  VNOM VOLTAGE		{		    $$.present = CISTPL_POWER_VNOM;		    $$.param[0] = $2;		}	| VMIN VOLTAGE		{		    $$.present = CISTPL_POWER_VMIN;		    $$.param[0] = $2;		}	| VMAX VOLTAGE		{		    $$.present = CISTPL_POWER_VMAX;		    $$.param[0] = $2;		}	| ISTATIC CURRENT		{		    $$.present = CISTPL_POWER_ISTATIC;		    $$.param[0] = $2;		}	| IAVG CURRENT		{		    $$.present = CISTPL_POWER_IAVG;		    $$.param[0] = $2;		}	| IPEAK CURRENT		{		    $$.present = CISTPL_POWER_IPEAK;		    $$.param[0] = $2;		}	| IDOWN CURRENT		{		    $$.present = CISTPL_POWER_IDOWN;		    $$.param[0] = $2;		}	;pwrlist:  /* nothing */		{		    $$.present = 0;		}	| pwrlist pwr		{		    $$.present |= 1<<($2.present);		    $$.param[$2.present] = $2.param[0];		}	;timing:	  cftab TIMING	| timing WAIT TIME	| timing READY TIME	| timing RESERVED TIME	;io:	  cftab IO NUMBER '-' NUMBER		{		    int n = $$->cftable_entry.io.nwin;		    $$->cftable_entry.io.win[n].base = $3;		    $$->cftable_entry.io.win[n].len = $5-$3+1;		    $$->cftable_entry.io.nwin++;		}	| io ',' NUMBER '-' NUMBER		{		    int n = $$->cftable_entry.io.nwin;		    $$->cftable_entry.io.win[n].base = $3;		    $$->cftable_entry.io.win[n].len = $5-$3+1;		    $$->cftable_entry.io.nwin++;		}	| io BIT8		{ $$->cftable_entry.io.flags |= CISTPL_IO_8BIT; }	| io BIT16		{ $$->cftable_entry.io.flags |= CISTPL_IO_16BIT; }	| io LINES '=' NUMBER ']'		{ $$->cftable_entry.io.flags |= $4; }	| io RANGE	;	mem:	  cftab MEM NUMBER '-' NUMBER '@' NUMBER		{		    int n = $$->cftable_entry.mem.nwin;		    $$->cftable_entry.mem.win[n].card_addr = $3;		    $$->cftable_entry.mem.win[n].host_addr = $7;		    $$->cftable_entry.mem.win[n].len = $5-$3+1;		    $$->cftable_entry.mem.nwin++;		}	| mem ',' NUMBER '-' NUMBER '@' NUMBER		{		    int n = $$->cftable_entry.mem.nwin;		    $$->cftable_entry.mem.win[n].card_addr = $3;		    $$->cftable_entry.mem.win[n].host_addr = $7;		    $$->cftable_entry.mem.win[n].len = $5-$3+1;		    $$->cftable_entry.mem.nwin++;		}	| mem BIT8		{ $$->cftable_entry.io.flags |= CISTPL_IO_8BIT; }	| mem BIT16		{ $$->cftable_entry.io.flags |= CISTPL_IO_16BIT; }	;	irq:	  cftab IRQ_NO NUMBER		{ $$->cftable_entry.irq.IRQInfo1 = ($3 & 0x0f); }	| cftab IRQ_NO MASK NUMBER		{		    $$->cftable_entry.irq.IRQInfo1 = IRQ_INFO2_VALID;		    $$->cftable_entry.irq.IRQInfo2 = $4;		}	| irq PULSE		{ $$->cftable_entry.irq.IRQInfo1 |= IRQ_PULSE_ID; }	| irq LEVEL		{ $$->cftable_entry.irq.IRQInfo1 |= IRQ_LEVEL_ID; }	| irq SHARED		{ $$->cftable_entry.irq.IRQInfo1 |= IRQ_SHARE_ID; }	;cftab:	  CFTABLE NUMBER		{		    $$ = calloc(1, sizeof(cisparse_t));		    $$->cftable_entry.index = $2;		}	| cftab DEFAULT		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_DEFAULT; }	| cftab BVD		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_BVDS; }	| cftab WP		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_WP; }	| cftab RDYBSY		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_RDYBSY; }	| cftab MWAIT		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_MWAIT; }	| cftab AUDIO		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_AUDIO; }	| cftab READONLY		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_READONLY; }	| cftab PWRDOWN		{ $$->cftable_entry.flags |= CISTPL_CFTABLE_PWRDOWN; }	| cftab VCC pwrlist		{ $$->cftable_entry.vcc = $3; }	| cftab VPP1 pwrlist		{ $$->cftable_entry.vpp1 = $3; }	| cftab VPP2 pwrlist		{ $$->cftable_entry.vpp2 = $3; }	| io	| mem	| irq	| timing	;checksum: CHECKSUM NUMBER '-' NUMBER '=' NUMBER	{ $$ = NULL; }%%static tuple_info_t *new_tuple(u_char type, cisparse_t *parse){    tuple_info_t *t = calloc(1, sizeof(tuple_info_t));    t->type = type;    t->parse = parse;    t->next = NULL;}void yyerror(char *msg, ...){    va_list ap;    char str[256];    va_start(ap, msg);    sprintf(str, "error at line %d: ", current_lineno);    vsprintf(str+strlen(str), msg, ap);    fprintf(stderr, "%s\n", str);    va_end(ap);}#ifdef DEBUGvoid main(int argc, char *argv[]){    if (argc > 1)	parse_cis(argv[1]);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -