%{
/*
* Mach Operating System
* Copyright (c) 1990 Carnegie-Mellon University
* Copyright (c) 1989 Carnegie-Mellon University
* Copyright (c) 1988 Carnegie-Mellon University
* Copyright (c) 1987 Carnegie-Mellon University
* All rights reserved. The CMU software License Agreement specifies
* the terms and conditions for use and redistribution.
*/
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* @(#)config.l 5.5 (Berkeley) 6/18/88
*/
#include <ctype.h>
#include "parser.h"
#include "config.h"
int kw_lookup(char *word);
int octal(char *str);
int hex(char *str);
int yylex(void);
#define tprintf if (do_trace) printf
/*
* Key word table
*/
struct kt {
const char *kt_name;
int kt_val;
} key_words[] = {
{ "and", AND },
{ "args", ARGS },
{ "at", AT },
{ "builddir", BUILDDIR },
{ "config", CONFIG },
{ "configdir", CONFIGDIR },
{ "controller", CONTROLLER },
{ "cpu", CPU },
{ "csr", CSR },
{ "device", DEVICE },
{ "disk", DISK },
{ "drive", DRIVE },
{ "dumps", DUMPS },
{ "flags", FLAGS },
{ "hz", HZ },
{ "ident", IDENT },
{ "init", INIT },
{ "machine", MACHINE },
{ "major", MAJOR },
{ "makeoptions", MAKEOPTIONS },
{ "makevariables", MAKEOPTIONS },
{ "master", MASTER },
{ "maxusers", MAXUSERS },
{ "mba", MBA },
{ "minor", MINOR },
{ "nexus", NEXUS },
{ "objectdir", OBJECTDIR },
{ "on", ON },
{ "options", OPTIONS },
{ "priority", PRIORITY },
{ "profile", PROFILE },
{ "pseudo-device",PSEUDO_DEVICE },
{ "root", ROOT },
{ "size", SIZE },
{ "slave", SLAVE },
{ "sourcedir", SOURCEDIR },
{ "swap", SWAP },
{ "tape", DEVICE },
{ "trace", TRACE },
{ "uba", UBA },
{ "vector", VECTOR },
{ "lun", LUN }, /* MMAX only */
{ "slot", SLOT }, /* MMAX only */
{ "tape", TAPE }, /* MMAX only */
{ "bin", BIN }, /* SQT ONLY */
{ "am", ADDRMOD }, /* MIPS */
{ "mbii", MBII }, /* MIPS */
{ "vme", VME }, /* MIPS */
{ 0, 0 },
};
%}
%option nounput
WORD ([A-Za-z_][-A-Za-z_]*|[A-Z][-A-Za-z_0-9]*)
WORD1 ([A-Za-z_][-A-Za-z_0-9]*)
%%
{WORD} |
{WORD1} {
int i;
if ((i = kw_lookup(yytext)) == -1)
{
yylval.str = yytext;
tprintf("id(%s) ", yytext);
return ID;
}
tprintf("(%s) ", yytext);
return i;
}
\"[^"]+\" {
yytext[strlen(yytext)-1] = '\0';
yylval.str = yytext + 1;
return ID;
}
0[0-7]* {
yylval.val = octal(yytext);
tprintf("#O:%o ", yylval.val);
return NUMBER;
}
0x[0-9a-fA-F]+ {
yylval.val = hex(yytext);
tprintf("#X:%x ", yylval.val);
return NUMBER;
}
[1-9][0-9]* {
yylval.val = atoi(yytext);
tprintf("#D:%d ", yylval.val);
return NUMBER;
}
[0-9]"."[0-9]* {
yylval.val = (int) (60 * atof(yytext) + 0.5);
return FPNUMBER;
}
"-" {
return MINUS;
}
"?" {
yylval.val = -1;
tprintf("? ");
return NUMBER;
}
\n/[ \t] {
yyline++;
tprintf("\n... ");
}
\n {
yyline++;
tprintf("\n");
return SEMICOLON;
}
#.* { /* Ignored (comment) */; }
[ \t]* { /* Ignored (white space) */; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQUALS; }
"@" { return AT; }
. { return yytext[0]; }
%%
/*
* kw_lookup
* Look up a string in the keyword table. Returns a -1 if the
* string is not a keyword otherwise it returns the keyword number
*/
int
kw_lookup(char *word)
{
register struct kt *kp;
for (kp = key_words; kp->kt_name != 0; kp++)
if (eq(word, kp->kt_name))
return kp->kt_val;
return -1;
}
/*
* Number conversion routines
*/
int
octal(char *str)
{
int num;
(void) sscanf(str, "%o", &num);
return num;
}
int
hex(char *str)
{
int num;
(void) sscanf(str+2, "%x", &num);
return num;
}
int
yywrap()
{
return 1;
}