xref: /freebsd-12.1/contrib/amd/amd/conf_parse.y (revision ad8bcc14)
1 /*
2  * Copyright (c) 1997-2014 Erez Zadok
3  * Copyright (c) 1989 Jan-Simon Pendry
4  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
5  * Copyright (c) 1989 The Regents of the University of California.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Jan-Simon Pendry at Imperial College, London.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *
36  * File: am-utils/amd/conf_parse.y
37  *
38  */
39 
40 %{
41 #ifdef HAVE_CONFIG_H
42 # include <config.h>
43 #endif /* HAVE_CONFIG_H */
44 #include <am_defs.h>
45 #include <amd.h>
46 
47 extern char *yytext;
48 extern int ayylineno;
49 extern int yylex(void);
50 
51 static int yyerror(const char *s);
52 static int retval;
53 static char *header_section = NULL; /* start with no header section */
54 
55 #define YYDEBUG 1
56 
57 #define PARSE_DEBUG 0
58 
59 #if PARSE_DEBUG
60 # define dprintf(f,s) fprintf(stderr, (f), ayylineno, (s))
61 # define amu_return(v)
62 #else /* not PARSE_DEBUG */
63 # define dprintf(f,s)
64 # define amu_return(v) return((v))
65 #endif /* not PARSE_DEBUG */
66 
67 %}
68 
69 %union {
70 char *strtype;
71 }
72 
73 %token LEFT_BRACKET RIGHT_BRACKET EQUAL
74 %token NEWLINE
75 %token <strtype> NONWS_STRING
76 %token <strtype> NONWSEQ_STRING
77 %token <strtype> QUOTED_NONWSEQ_STRING
78 
79 %start file
80 %%
81 
82 /****************************************************************************/
83 file		: { yydebug = PARSE_DEBUG; } newlines map_sections
84 		| { yydebug = PARSE_DEBUG; } map_sections
85 		;
86 
87 newlines	: NEWLINE
88 		| NEWLINE newlines
89 		;
90 
91 map_sections	: map_section
92 		| map_section map_sections
93 		;
94 
95 map_section	: sec_header kv_pairs
96 		;
97 
98 sec_header	: LEFT_BRACKET NONWS_STRING RIGHT_BRACKET NEWLINE
99 		{
100 		  if (yydebug)
101 		    fprintf(stderr, "sec_header1 = \"%s\"\n", $2);
102 		  header_section = $2;
103 		}
104 		;
105 
106 kv_pairs	: kv_pair
107 		| kv_pair kv_pairs
108 		;
109 
110 kv_pair		: NONWS_STRING EQUAL NONWS_STRING NEWLINE
111 		{
112 		  if (yydebug)
113 		    fprintf(stderr,"parse1: key=\"%s\", val=\"%s\"\n", $1, $3);
114 		  retval = set_conf_kv(header_section, $1, $3);
115 		  if (retval != 0) {
116 		    yyerror("syntax error");
117 		    YYABORT;
118 		  }
119 		}
120 		| NONWS_STRING EQUAL NONWSEQ_STRING NEWLINE
121 		{
122 		  if (yydebug)
123 		    fprintf(stderr,"parse2: key=\"%s\", val=\"%s\"\n", $1, $3);
124 		  retval = set_conf_kv(header_section, $1, $3);
125 		  if (retval != 0) {
126 		    yyerror("syntax error");
127 		    YYABORT;
128 		  }
129 		}
130 		| NONWS_STRING EQUAL QUOTED_NONWSEQ_STRING NEWLINE
131 		{
132 		  if (yydebug)
133 		    fprintf(stderr,"parse3: key=\"%s\", val=\"%s\"\n", $1, $3);
134 		  retval = set_conf_kv(header_section, $1, $3);
135 		  if (retval != 0) {
136 		    yyerror("syntax error");
137 		    YYABORT;
138 		  }
139 		}
140 		| NEWLINE
141 		;
142 
143 /****************************************************************************/
144 %%
145 
146 static int
147 yyerror(const char *s)
148 {
149   fprintf(stderr, "AMDCONF: %s on line %d (section %s)\n",
150 	  s, ayylineno,
151 	  (header_section ? header_section : "null"));
152   exit(1);
153   return 1;	/* to full compilers that insist on a return statement */
154 }
155