xref: /original-bsd/usr.sbin/config/lang.l (revision a5e8528f)
1 %{
2 
3 /*
4  * Copyright (c) 1980 Regents of the University of California.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms are permitted
8  * provided that the above copyright notice and this paragraph are
9  * duplicated in all such forms and that any documentation,
10  * advertising materials, and other materials related to such
11  * distribution and use acknowledge that the software was developed
12  * by the University of California, Berkeley.  The name of the
13  * University may not be used to endorse or promote products derived
14  * from this software without specific prior written permission.
15  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18  *
19  *	@(#)lang.l	5.6 (Berkeley) 05/16/90
20  */
21 
22 #include <ctype.h>
23 #include "y.tab.h"
24 #include "config.h"
25 
26 #define tprintf if (do_trace) printf
27 
28 /*
29  * Key word table
30  */
31 
32 struct kt {
33 	char *kt_name;
34 	int kt_val;
35 } key_words[] = {
36 	{ "and",	AND },
37 	{ "args",	ARGS },
38 	{ "at",		AT },
39 	{ "config",	CONFIG },
40 	{ "controller",	CONTROLLER },
41 	{ "cpu",	CPU },
42 	{ "csr",	CSR },
43 	{ "device",	DEVICE },
44 	{ "disk",	DISK },
45 	{ "drive",	DRIVE },
46 	{ "dst",	DST },
47 	{ "dumps",	DUMPS },
48 	{ "flags",	FLAGS },
49 	{ "hz",		HZ },
50 	{ "ident",	IDENT },
51 	{ "machine",	MACHINE },
52 	{ "major",	MAJOR },
53 	{ "makeoptions", MAKEOPTIONS },
54 	{ "master",	MASTER },
55 	{ "maxusers",	MAXUSERS },
56 	{ "minor",	MINOR },
57 	{ "nexus",	NEXUS },
58 	{ "on",		ON },
59 	{ "options",	OPTIONS },
60 	{ "priority",	PRIORITY },
61 	{ "pseudo-device",PSEUDO_DEVICE },
62 	{ "root",	ROOT },
63 #if MACHINE_HP300
64 	{ "scode",	NEXUS },
65 #endif
66 	{ "size",	SIZE },
67 	{ "slave",	SLAVE },
68 	{ "swap",	SWAP },
69 	{ "tape",	DEVICE },
70 	{ "timezone",	TIMEZONE },
71 	{ "trace",	TRACE },
72 	{ "vector",	VECTOR },
73 	{ 0, 0 },
74 };
75 %}
76 WORD	[A-Za-z_][-A-Za-z_]*
77 %%
78 {WORD}		{
79 			int i;
80 
81 			if ((i = kw_lookup(yytext)) == -1)
82 			{
83 				yylval.str = yytext;
84 				tprintf("id(%s) ", yytext);
85 				return ID;
86 			}
87 			tprintf("(%s) ", yytext);
88 			return i;
89 		}
90 \"[^"]+\"	{
91 			yytext[strlen(yytext)-1] = '\0';
92 			yylval.str = yytext + 1;
93 			return ID;
94 		}
95 0[0-7]*		{
96 			yylval.val = octal(yytext);
97 			tprintf("#O:%o ", yylval.val);
98 			return NUMBER;
99 		}
100 0x[0-9a-fA-F]+	{
101 			yylval.val = hex(yytext);
102 			tprintf("#X:%x ", yylval.val);
103 			return NUMBER;
104 		}
105 [1-9][0-9]*	{
106 			yylval.val = atoi(yytext);
107 			tprintf("#D:%d ", yylval.val);
108 			return NUMBER;
109 		}
110 [0-9]"."[0-9]*	{
111 			double atof();
112 			yylval.val = (int) (60 * atof(yytext) + 0.5);
113 			return FPNUMBER;
114 		}
115 "-"		{
116 			return MINUS;
117 		}
118 "?"		{
119 			yylval.val = -1;
120 			tprintf("? ");
121 			return NUMBER;
122 		}
123 \n/[ \t]	{
124 			yyline++;
125 			tprintf("\n... ");
126 		}
127 \n		{
128 			yyline++;
129 			tprintf("\n");
130 			return SEMICOLON;
131 		}
132 #.*		{	/* Ignored (comment) */;	}
133 [ \t]*		{	/* Ignored (white space) */;	}
134 ";"		{	return SEMICOLON;		}
135 ","		{	return COMMA;			}
136 "="		{	return EQUALS;			}
137 "@"		{	return AT;			}
138 .		{	return yytext[0];		}
139 
140 %%
141 /*
142  * kw_lookup
143  *	Look up a string in the keyword table.  Returns a -1 if the
144  *	string is not a keyword otherwise it returns the keyword number
145  */
146 
147 kw_lookup(word)
148 register char *word;
149 {
150 	register struct kt *kp;
151 
152 	for (kp = key_words; kp->kt_name != 0; kp++)
153 		if (eq(word, kp->kt_name))
154 			return kp->kt_val;
155 	return -1;
156 }
157 
158 /*
159  * Number conversion routines
160  */
161 
162 octal(str)
163 char *str;
164 {
165 	int num;
166 
167 	(void) sscanf(str, "%o", &num);
168 	return num;
169 }
170 
171 hex(str)
172 char *str;
173 {
174 	int num;
175 
176 	(void) sscanf(str+2, "%x", &num);
177 	return num;
178 }
179