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

📄 config.y

📁 早期freebsd实现
💻 Y
📖 第 1 页 / 共 2 页
字号:
%union {	char	*str;	int	val;	struct	file_list *file;	struct	idlst *lst;}%token	AND%token	ANY%token	ARGS%token	AT%token	BIO%token	COMMA%token	CONFIG%token	CONTROLLER%token	CPU%token	CSR%token	DEVICE%token	DISK%token	DRIVE%token	DRQ%token	DST%token	DUMPS%token	EQUALS%token	FLAGS%token	HZ%token	IDENT%token	INTERLEAVE%token	IOMEM%token	IOSIZ%token	IRQ%token	MACHINE%token	MAJOR%token	MASTER%token	MAXUSERS%token	MINOR%token	MINUS%token	NET%token	NEXUS%token	ON%token	OPTIONS%token	MAKEOPTIONS%token	PORT%token	PRIORITY%token	PSEUDO_DEVICE%token	ROOT%token	SEMICOLON%token	SEQUENTIAL%token	SIZE%token	SLAVE%token	SWAP%token	TIMEZONE%token	TTY%token	TRACE%token	VECTOR%token	<str>	ID%token	<val>	NUMBER%token	<val>	FPNUMBER%type	<str>	Save_id%type	<str>	Opt_value%type	<str>	Dev%type	<lst>	Id_list%type	<val>	optional_size%type	<val>	optional_sflag%type	<str>	device_name%type	<val>	major_minor%type	<val>	arg_device_spec%type	<val>	root_device_spec%type	<val>	dump_device_spec%type	<file>	swap_device_spec%type	<file>	comp_device_spec%{/* * Copyright (c) 1988, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	@(#)config.y	8.1 (Berkeley) 6/6/93 */#include "config.h"#include <ctype.h>#include <stdio.h>struct	device cur;struct	device *curp = 0;char	*temp_id;char	*val_id;%}%%Configuration:	Many_specs		= { verifysystemspecs(); }		;Many_specs:	Many_specs Spec		|	/* lambda */		;Spec:	Device_spec SEMICOLON	      = { newdev(&cur); } |	Config_spec SEMICOLON		|	TRACE SEMICOLON	      = { do_trace = !do_trace; } |	SEMICOLON		|	error SEMICOLON		;Config_spec:	MACHINE Save_id	    = {		if (!strcmp($2, "vax")) {			machine = MACHINE_VAX;			machinename = "vax";		} else if (!strcmp($2, "tahoe")) {			machine = MACHINE_TAHOE;			machinename = "tahoe";		} else if (!strcmp($2, "hp300")) {			machine = MACHINE_HP300;			machinename = "hp300";		} else if (!strcmp($2, "i386")) {			machine = MACHINE_I386;			machinename = "i386";		} else if (!strcmp($2, "mips")) {			machine = MACHINE_MIPS;			machinename = "mips";		} else if (!strcmp($2, "pmax")) {			machine = MACHINE_PMAX;			machinename = "pmax";		} else if (!strcmp($2, "luna68k")) {			machine = MACHINE_LUNA68K;			machinename = "luna68k";		} else if (!strcmp($2, "news3400")) {			machine = MACHINE_NEWS3400;			machinename = "news3400";		} else			yyerror("Unknown machine type");	      } |	CPU Save_id	      = {		struct cputype *cp =		    (struct cputype *)malloc(sizeof (struct cputype));		cp->cpu_name = ns($2);		cp->cpu_next = cputype;		cputype = cp;		free(temp_id);	      } |	OPTIONS Opt_list		|	MAKEOPTIONS Mkopt_list		|	IDENT ID	      = { ident = ns($2); } |	System_spec		|	HZ NUMBER	      = { hz = $2; }|	TIMEZONE NUMBER	      = { zone = 60 * $2; check_tz(); } |	TIMEZONE NUMBER DST NUMBER	      = { zone = 60 * $2; dst = $4; check_tz(); } |	TIMEZONE NUMBER DST	      = { zone = 60 * $2; dst = 1; check_tz(); } |	TIMEZONE FPNUMBER	      = { zone = $2; check_tz(); } |	TIMEZONE FPNUMBER DST NUMBER	      = { zone = $2; dst = $4; check_tz(); } |	TIMEZONE FPNUMBER DST	      = { zone = $2; dst = 1; check_tz(); } |	TIMEZONE MINUS NUMBER	      = { zone = -60 * $3; check_tz(); } |	TIMEZONE MINUS NUMBER DST NUMBER	      = { zone = -60 * $3; dst = $5; check_tz(); } |	TIMEZONE MINUS NUMBER DST	      = { zone = -60 * $3; dst = 1; check_tz(); } |	TIMEZONE MINUS FPNUMBER	      = { zone = -$3; check_tz(); } |	TIMEZONE MINUS FPNUMBER DST NUMBER	      = { zone = -$3; dst = $5; check_tz(); } |	TIMEZONE MINUS FPNUMBER DST	      = { zone = -$3; dst = 1; check_tz(); } |	MAXUSERS NUMBER	      = { maxusers = $2; };System_spec:	  System_id System_parameter_list		= { checksystemspec(*confp); }	;		System_id:	  CONFIG Save_id		= { mkconf($2); }	;System_parameter_list:	  System_parameter_list System_parameter	| System_parameter	;System_parameter:	  swap_spec	| root_spec	| dump_spec	| arg_spec	;	swap_spec:	  SWAP optional_on swap_device_list	;	swap_device_list:	  swap_device_list AND swap_device	| swap_device	;	swap_device:	  swap_device_spec optional_size optional_sflag	      = { mkswap(*confp, $1, $2, $3); }	;swap_device_spec:	  device_name		= {			struct file_list *fl = newflist(SWAPSPEC);			if (eq($1, "generic"))				fl->f_fn = $1;			else {				fl->f_swapdev = nametodev($1, 0, 'b');				fl->f_fn = devtoname(fl->f_swapdev);			}			$$ = fl;		}	| major_minor		= {			struct file_list *fl = newflist(SWAPSPEC);			fl->f_swapdev = $1;			fl->f_fn = devtoname($1);			$$ = fl;		}	;root_spec:	  ROOT optional_on root_device_spec		= {			struct file_list *fl = *confp;			if (fl && fl->f_rootdev != NODEV)				yyerror("extraneous root device specification");			else				fl->f_rootdev = $3;		}	;root_device_spec:	  device_name		= { $$ = nametodev($1, 0, 'a'); }	| major_minor	;dump_spec:	  DUMPS optional_on dump_device_spec		= {			struct file_list *fl = *confp;			if (fl && fl->f_dumpdev != NODEV)				yyerror("extraneous dump device specification");			else				fl->f_dumpdev = $3;		}	;dump_device_spec:	  device_name		= { $$ = nametodev($1, 0, 'b'); }	| major_minor	;arg_spec:	  ARGS optional_on arg_device_spec		= { yyerror("arg device specification obsolete, ignored"); }	;arg_device_spec:	  device_name		= { $$ = nametodev($1, 0, 'b'); }	| major_minor	;major_minor:	  MAJOR NUMBER MINOR NUMBER		= { $$ = makedev($2, $4); }	;optional_on:	  ON	| /* empty */	;optional_size:	  SIZE NUMBER	      = { $$ = $2; }	| /* empty */	      = { $$ = 0; }	;optional_sflag:	  SEQUENTIAL	      = { $$ = 2; }	| /* empty */	      = { $$ = 0; }	;device_name:	  Save_id		= { $$ = $1; }	| Save_id NUMBER		= {			char buf[80];			(void) sprintf(buf, "%s%d", $1, $2);			$$ = ns(buf); free($1);		}	| Save_id NUMBER ID		= {			char buf[80];			(void) sprintf(buf, "%s%d%s", $1, $2, $3);			$$ = ns(buf); free($1);		}	;Opt_list:	Opt_list COMMA Option		|	Option		;Option:	Save_id	      = {		struct opt *op = (struct opt *)malloc(sizeof (struct opt));		op->op_name = ns($1);		op->op_next = opt;		op->op_value = 0;		opt = op;		free(temp_id);	      } |	Save_id EQUALS Opt_value	      = {		struct opt *op = (struct opt *)malloc(sizeof (struct opt));		op->op_name = ns($1);		op->op_next = opt;		op->op_value = ns($3);		opt = op;		free(temp_id);		free(val_id);	      } ;Opt_value:	ID	      = { $$ = val_id = ns($1); } |	NUMBER	      = {		char nb[16];	        (void) sprintf(nb, "%d", $1);		$$ = val_id = ns(nb);	      } ;Save_id:	ID	      = { $$ = temp_id = ns($1); }	;Mkopt_list:	Mkopt_list COMMA Mkoption		|	Mkoption		;Mkoption:	Save_id EQUALS Opt_value	      = {		struct opt *op = (struct opt *)malloc(sizeof (struct opt));		op->op_name = ns($1);		op->op_next = mkopt;		op->op_value = ns($3);		mkopt = op;		free(temp_id);		free(val_id);	      } ;Dev:	ID	      = { $$ = ns($1); }	;Device_spec:	DEVICE Dev_name Dev_info Int_spec	      = { cur.d_type = DEVICE; } |	MASTER Dev_name Dev_info Int_spec	      = { cur.d_type = MASTER; } |	DISK Dev_name Dev_info Int_spec	      = { cur.d_dk = 1; cur.d_type = DEVICE; } |	CONTROLLER Dev_name Dev_info Int_spec	      = { cur.d_type = CONTROLLER; } |	PSEUDO_DEVICE Init_dev Dev	      = {		cur.d_name = $3;		cur.d_type = PSEUDO_DEVICE;		} |	PSEUDO_DEVICE Init_dev Dev NUMBER	      = {		cur.d_name = $3;		cur.d_type = PSEUDO_DEVICE;		cur.d_slave = $4;		} |	PSEUDO_DEVICE Dev_name Cdev_init Cdev_info	      = {		if (!eq(cur.d_name, "cd"))			yyerror("improper spec for pseudo-device");		seen_cd = 1;		cur.d_type = DEVICE;		verifycomp(*compp);		};Cdev_init:	/* lambda */	      = { mkcomp(&cur); };Cdev_info:	  optional_on comp_device_list comp_option_list	;comp_device_list:	  comp_device_list AND comp_device	| comp_device	;comp_device:	  comp_device_spec	      = { addcomp(*compp, $1); }	;comp_device_spec:	  device_name		= {			struct file_list *fl = newflist(COMPSPEC);			fl->f_compdev = nametodev($1, 0, 'c');			fl->f_fn = devtoname(fl->f_compdev);			$$ = fl;		}	| major_minor		= {			struct file_list *fl = newflist(COMPSPEC);			fl->f_compdev = $1;			fl->f_fn = devtoname($1);			$$ = fl;		}	;comp_option_list:	  comp_option_list comp_option		|	  /* lambda */		;comp_option:	INTERLEAVE NUMBER	      = { cur.d_pri = $2; } |	FLAGS NUMBER	      = { cur.d_flags = $2; };Dev_name:	Init_dev Dev NUMBER	      = {		cur.d_name = $2;		if (eq($2, "mba"))			seen_mba = 1;		else if (eq($2, "uba"))			seen_uba = 1;		else if (eq($2, "vba"))			seen_vba = 1;		else if (eq($2, "isa"))			seen_isa = 1;		cur.d_unit = $3;		};Init_dev:	/* lambda */	      = { init_dev(&cur); };Dev_info:	Con_info Info_list		|	/* lambda */		;Con_info:	AT Dev NUMBER	      = {		if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")) {			(void) sprintf(errbuf,				"%s must be connected to a nexus", cur.d_name);			yyerror(errbuf);		}		cur.d_conn = connect($2, $3);		} |	AT NEXUS NUMBER	      = { check_nexus(&cur, $3); cur.d_conn = TO_NEXUS; };    Info_list:	Info_list Info

⌨️ 快捷键说明

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