config.y revision 72844
1%union { 2 char *str; 3 int val; 4 struct file_list *file; 5} 6 7%token ARCH 8%token COMMA 9%token CONFIG 10%token CPU 11%token DEVICE 12%token EQUALS 13%token HINTS 14%token IDENT 15%token MAXUSERS 16%token PROFILE 17%token OPTIONS 18%token MAKEOPTIONS 19%token SEMICOLON 20 21%token <str> ID 22%token <val> NUMBER 23 24%type <str> Save_id 25%type <str> Opt_value 26%type <str> Dev 27 28%{ 29 30/* 31 * Copyright (c) 1988, 1993 32 * The Regents of the University of California. All rights reserved. 33 * 34 * Redistribution and use in source and binary forms, with or without 35 * modification, are permitted provided that the following conditions 36 * are met: 37 * 1. Redistributions of source code must retain the above copyright 38 * notice, this list of conditions and the following disclaimer. 39 * 2. Redistributions in binary form must reproduce the above copyright 40 * notice, this list of conditions and the following disclaimer in the 41 * documentation and/or other materials provided with the distribution. 42 * 3. All advertising materials mentioning features or use of this software 43 * must display the following acknowledgement: 44 * This product includes software developed by the University of 45 * California, Berkeley and its contributors. 46 * 4. Neither the name of the University nor the names of its contributors 47 * may be used to endorse or promote products derived from this software 48 * without specific prior written permission. 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 51 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 52 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 53 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 54 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 55 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 56 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 57 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 58 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 59 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 60 * SUCH DAMAGE. 61 * 62 * @(#)config.y 8.1 (Berkeley) 6/6/93 63 * $FreeBSD: head/usr.sbin/config/config.y 72844 2001-02-22 04:00:29Z peter $ 64 */ 65 66#include <ctype.h> 67#include <err.h> 68#include <stdio.h> 69#include <string.h> 70 71#include "config.h" 72 73static struct device *curp = 0; 74 75struct device *dtab; 76char *ident; 77char *hints; 78int hintmode; 79int yyline; 80struct file_list *ftab; 81char errbuf[80]; 82int maxusers; 83 84#define ns(s) strdup(s) 85 86static void yyerror(const char *s); 87 88static char * 89devopt(char *dev) 90{ 91 char *ret = malloc(strlen(dev) + 5); 92 93 sprintf(ret, "DEV_%s", dev); 94 raisestr(ret); 95 return ret; 96} 97 98%} 99%% 100Configuration: 101 Many_specs 102 ; 103 104Many_specs: 105 Many_specs Spec 106 | 107 /* lambda */ 108 ; 109 110Spec: 111 Device_spec SEMICOLON 112 | 113 Config_spec SEMICOLON 114 | 115 SEMICOLON 116 | 117 error SEMICOLON 118 ; 119 120Config_spec: 121 ARCH Save_id 122 = { 123 machinename = $2; 124 } | 125 CPU Save_id 126 = { 127 struct cputype *cp = 128 (struct cputype *)malloc(sizeof (struct cputype)); 129 memset(cp, 0, sizeof(*cp)); 130 cp->cpu_name = $2; 131 cp->cpu_next = cputype; 132 cputype = cp; 133 } | 134 OPTIONS Opt_list 135 | 136 MAKEOPTIONS Mkopt_list 137 | 138 IDENT ID 139 = { ident = $2; } | 140 System_spec 141 | 142 MAXUSERS NUMBER 143 = { maxusers = $2; } | 144 PROFILE NUMBER 145 = { profiling = $2; } | 146 HINTS ID 147 = { 148 hints = $2; 149 hintmode = 1; 150 }; 151 152System_spec: 153 CONFIG System_id System_parameter_list 154 = { errx(1, "line %d: root/dump/swap specifications obsolete", yyline);} 155 | 156 CONFIG System_id 157 ; 158 159System_id: 160 Save_id 161 = { newopt(&mkopt, ns("KERNEL"), $1); }; 162 163System_parameter_list: 164 System_parameter_list ID 165 | ID 166 ; 167 168Opt_list: 169 Opt_list COMMA Option 170 | 171 Option 172 ; 173 174Option: 175 Save_id 176 = { 177 char *s; 178 179 newopt(&opt, $1, NULL); 180 if ((s = strchr($1, '='))) 181 errx(1, "line %d: The `=' in options should not be quoted", yyline); 182 } | 183 Save_id EQUALS Opt_value 184 = { 185 newopt(&opt, $1, $3); 186 } ; 187 188Opt_value: 189 ID 190 = { $$ = $1; } | 191 NUMBER 192 = { 193 char buf[80]; 194 195 (void) snprintf(buf, sizeof(buf), "%d", $1); 196 $$ = ns(buf); 197 } ; 198 199Save_id: 200 ID 201 = { $$ = $1; } 202 ; 203 204Mkopt_list: 205 Mkopt_list COMMA Mkoption 206 | 207 Mkoption 208 ; 209 210Mkoption: 211 Save_id EQUALS Opt_value 212 = { newopt(&mkopt, $1, $3); } ; 213 214Dev: 215 ID 216 = { $$ = $1; } 217 ; 218 219Device_spec: 220 DEVICE Dev 221 = { 222 newopt(&opt, devopt($2), ns("1")); 223 /* and the device part */ 224 newdev($2, UNKNOWN); 225 } | 226 DEVICE Dev NUMBER 227 = { 228 newopt(&opt, devopt($2), ns("1")); 229 /* and the device part */ 230 newdev($2, $3); 231 if ($3 == 0) 232 errx(1, "line %d: devices with zero units are not likely to be correct", yyline); 233 } ; 234 235%% 236 237static void 238yyerror(const char *s) 239{ 240 241 errx(1, "line %d: %s", yyline + 1, s); 242} 243 244/* 245 * add a device to the list of devices 246 */ 247static void 248newdev(char *name, int count) 249{ 250 struct device *np; 251 252 np = (struct device *) malloc(sizeof *np); 253 memset(np, 0, sizeof(*np)); 254 np->d_name = name; 255 np->d_count = count; 256 np->d_next = 0; 257 if (curp == 0) 258 dtab = np; 259 else 260 curp->d_next = np; 261 curp = np; 262} 263 264static void 265newopt(struct opt **list, char *name, char *value) 266{ 267 struct opt *op; 268 269 op = (struct opt *)malloc(sizeof (struct opt)); 270 memset(op, 0, sizeof(*op)); 271 op->op_name = name; 272 op->op_ownfile = 0; 273 op->op_value = value; 274 op->op_next = *list; 275 *list = op; 276} 277