]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/amd/amd/conf_parse.y
MFC r308493, r308619: Update amd from am-utils 6.1.5 to 6.2.
[FreeBSD/stable/10.git] / contrib / amd / amd / conf_parse.y
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 }