defs/RPSLSyntax.java
/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following functions.
- RPSLSyntax
- getSyntaxOfs
- getSyntaxByName
- escapeStringForC
- writeAttributeInfo
- writeSyntaxTab
- writeSyntaxMakefile
- main
1 /******************
2 Copyright (c) 2002 RIPE NCC
3
4 All Rights Reserved
5
6 Permission to use, copy, modify, and distribute this software and its
7 documentation for any purpose and without fee is hereby granted,
8 provided that the above copyright notice appear in all copies and that
9 both that copyright notice and this permission notice appear in
10 supporting documentation, and that the name of the author not be
11 used in advertising or publicity pertaining to distribution of the
12 software without specific, written prior permission.
13
14 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
16 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
17 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
18 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 ***************************************/
21
22 import javax.xml.parsers.*;
23 import org.w3c.dom.*;
24 import org.xml.sax.*;
25
26 import java.util.*;
27 import java.io.*;
28
29 public class RPSLSyntax {
/* [<][>][^][v][top][bottom][index][help] */
30 private Vector attributeSyntaxes;
31
32 // constructor - call with an XML rpsl_syntax node
33 public RPSLSyntax(Node node)
34 {
35 attributeSyntaxes = new Vector();
36
37 // load values from the XML node
38 Node kid = node.getFirstChild();
39 while (kid != null)
40 {
41 String nodeName = kid.getNodeName();
42 String nodeValue = kid.getNodeValue();
43 if (nodeName.equals("attribute_syntax"))
44 {
45 attributeSyntaxes.add(new AttributeSyntax(kid));
46 }
47 kid = kid.getNextSibling();
48 }
49 }
50
51 public int getSyntaxOfs(String name)
/* [<][>][^][v][top][bottom][index][help] */
52 {
53 for (int i=0; i<attributeSyntaxes.size(); i++) {
54 AttributeSyntax as=(AttributeSyntax)attributeSyntaxes.elementAt(i);
55 if (as.getName().equals(name)) {
56 return i;
57 }
58 }
59 return -1;
60 }
61
62 public AttributeSyntax getSyntaxByName(String name)
/* [<][>][^][v][top][bottom][index][help] */
63 {
64 for (int i=0; i<attributeSyntaxes.size(); i++) {
65 AttributeSyntax as=(AttributeSyntax)attributeSyntaxes.elementAt(i);
66 if (as.getName().equals(name)) {
67 return as;
68 }
69 }
70 return null;
71 }
72
73 private String escapeStringForC(String s)
/* [<][>][^][v][top][bottom][index][help] */
74 {
75 StringBuffer sb = new StringBuffer();
76
77 byte[] bytes = s.getBytes();
78
79 for (int i=0; i<bytes.length; i++) {
80 byte c = bytes[i];
81 if (c == '\\') {
82 sb.append("\\\\");
83 } else if (c == '"') {
84 sb.append("\\\"");
85 } else if ((c <= 0x1F) || (c >= 0x7F)) {
86 if (c < 0x10) {
87 sb.append("\\x0");
88 } else {
89 sb.append("\\x");
90 }
91 Byte b = new Byte(c);
92 sb.append(Integer.toHexString(b.intValue()));
93 } else {
94 sb.append(s.substring(i, i+1));
95 }
96 }
97 return sb.toString();
98 }
99
100 private void writeAttributeInfo(PrintWriter out, AttributeSyntax a)
/* [<][>][^][v][top][bottom][index][help] */
101 {
102 out.println(" /* name */");
103 out.println(" \"" + a.getName() + "\",");
104 out.println(" /* core_regex_pattern */");
105 String coreRegex = a.getCoreRegex();
106 if (coreRegex == null) {
107 out.println(" NULL,");
108 } else {
109 out.println(" \"" + escapeStringForC(coreRegex.trim()) +
110 "\",");
111 }
112 out.println(" /* core_regex, set by syntax_init() */");
113 out.println(" NULL,");
114 out.println(" /* core_reserved_regex_pattern */");
115 String coreReservedRegex = a.getCoreReservedRegex();
116 if (coreReservedRegex == null) {
117 out.println(" NULL,");
118 } else {
119 out.println(" \"" +
120 escapeStringForC(coreReservedRegex.trim()) + "\",");
121 }
122 out.println(" /* core_reserved_regex, set by syntax_init() */");
123 out.println(" NULL,");
124 String coreParserName = a.getCoreParserName();
125 out.println(" /* core_parser_reset */");
126 if (coreParserName == null) {
127 out.println(" NULL,");
128 } else {
129 out.println(" " + coreParserName + "_reset,");
130 }
131 out.println(" /* core_parser */");
132 if (coreParserName == null) {
133 out.println(" NULL,");
134 } else {
135 out.println(" " + coreParserName + "parse,");
136 }
137 out.println(" /* front_end_regex_pattern */");
138 String regex = a.getFrontEndRegex();
139 if (regex == null) {
140 regex = coreRegex;
141 }
142 if (regex == null) {
143 out.println(" NULL,");
144 } else {
145 out.println(" \""+escapeStringForC(regex.trim())+"\",");
146 }
147 out.println(" /* front_end_regex, set by syntax_init() */");
148 out.println(" NULL,");
149 out.println(" /* front_end_reserved_regex_pattern */");
150 regex = a.getFrontEndReservedRegex();
151 if (regex == null) {
152 regex = coreReservedRegex;
153 }
154 if (regex == null) {
155 out.println(" NULL,");
156 } else {
157 out.println(" \""+escapeStringForC(regex.trim())+"\",");
158 }
159 out.println(" /* front_end_reserved_regex, set by syntax_init() */");
160 out.println(" NULL,");
161 String parser_name = a.getFrontEndParserName();
162 if (parser_name == null) {
163 parser_name = coreParserName;
164 }
165 out.println(" /* front_end_parser_reset */");
166 if (parser_name == null) {
167 out.println(" NULL,");
168 } else {
169 out.println(" " + parser_name + "_reset,");
170 }
171 out.println(" /* front_end_parser */");
172 if (parser_name == null) {
173 out.println(" NULL ");
174 } else {
175 out.println(" " + parser_name + "parse");
176 }
177 }
178
179 public void writeSyntaxTab(String fileName) throws IOException
/* [<][>][^][v][top][bottom][index][help] */
180 {
181 PrintWriter out = new PrintWriter(new FileWriter(fileName));
182 out.println("/* generated by 'RPSLSyntax.java' - DO NOT HAND-EDIT */");
183 out.println("#ifndef SYNTAX_TAB_H");
184 out.println("#define SYNTAX_TAB_H");
185 out.println();
186
187 Enumeration e = attributeSyntaxes.elements();
188 while (e.hasMoreElements()) {
189 AttributeSyntax a = (AttributeSyntax)e.nextElement();
190 String parserName = a.getCoreParserName();
191 if (parserName != null) {
192 out.println("extern void " + parserName + "_reset();");
193 out.println("extern int " + parserName + "parse();");
194 }
195 parserName = a.getFrontEndParserName();
196 if (parserName != null) {
197 out.println("extern void " + parserName + "_reset();");
198 out.println("extern int " + parserName + "parse();");
199 }
200 }
201
202 out.println();
203 out.println("syntax_t syntax_tab[] = {");
204
205 if (!attributeSyntaxes.isEmpty()) {
206 out.println(" {");
207 e = attributeSyntaxes.elements();
208 writeAttributeInfo(out, (AttributeSyntax)e.nextElement());
209 while (e.hasMoreElements()) {
210 out.println(" },");
211 out.println(" {");
212 writeAttributeInfo(out, (AttributeSyntax)e.nextElement());
213 }
214 out.println(" }");
215 }
216
217 out.println("};");
218 out.println();
219 out.println("#endif /* SYNTAX_TAB_H */");
220 out.close();
221 }
222
223 public void writeSyntaxMakefile(String fileName) throws IOException
/* [<][>][^][v][top][bottom][index][help] */
224 {
225 PrintWriter out = new PrintWriter(new FileWriter(fileName));
226 out.println("# generated by 'RPSLSyntax.java' - DO NOT HAND-EDIT");
227 out.println();
228
229 out.println("all: $(RIPLIBDIR)/librpsl.a $(RIPINCDIR)/syntax_api.h");
230 out.println();
231
232 out.println("$(RIPINCDIR)/syntax_api.h: syntax_api.h");
233 out.println("\trm -f $(RIPINCDIR)/syntax_api.h");
234 out.println("\tln -s syntax_api.h $(RIPINCDIR)/syntax_api.h");
235 out.println();
236
237 int numOfParser = 0;
238 Enumeration e = attributeSyntaxes.elements();
239 while (e.hasMoreElements()) {
240 AttributeSyntax a = (AttributeSyntax)e.nextElement();
241 if (a.getCoreParserName() != null) {
242 numOfParser++;
243 }
244 if (a.getFrontEndParserName() != null) {
245 numOfParser++;
246 }
247 }
248
249 if (numOfParser == 0) {
250 out.println("$(RIPLIBDIR)/librpsl.a: " +
251 "syntax_api.o class.o attribute.o syntax.o");
252 } else {
253 out.println("$(RIPLIBDIR)/librpsl.a: " +
254 "syntax_api.o class.o attribute.o syntax.o\\");
255 e = attributeSyntaxes.elements();
256 int parsersLeft = numOfParser;
257 while (parsersLeft > 0) {
258 AttributeSyntax a = (AttributeSyntax)e.nextElement();
259 String parserName = a.getCoreParserName();
260 if (parserName != null) {
261 out.print(" " + parserName + ".lex.o " +
262 parserName + ".tab.o");
263 if (parsersLeft > 1) {
264 out.println(" \\");
265 } else {
266 out.println();
267 }
268 parsersLeft--;
269 }
270 parserName = a.getFrontEndParserName();
271 if (parserName != null) {
272 out.print(" " + parserName + ".lex.o " +
273 parserName + ".tab.o");
274 if (parsersLeft > 1) {
275 out.println(" \\");
276 } else {
277 out.println();
278 }
279 parsersLeft--;
280 }
281 }
282 }
283 out.println("\tar -r $(RIPLIBDIR)/librpsl.a $?");
284 out.println("\tar -r $(RIPLIBDIR)/librip.a $?");
285 out.println();
286
287 e = attributeSyntaxes.elements();
288 while (e.hasMoreElements()) {
289 AttributeSyntax a = (AttributeSyntax)e.nextElement();
290 String parserName = a.getCoreParserName();
291 if (parserName != null) {
292 out.println(parserName + ".lex.o: " + parserName + ".lex.c " +
293 parserName + ".tab.h");
294 out.println("\t$(CC) $(CFLAGS) -c " + parserName + ".lex.c");
295 out.println();
296
297 out.println(parserName + ".tab.o: " + parserName + ".tab.c " +
298 parserName + ".tab.h");
299 out.println("\t$(CC) $(CFLAGS) -c " + parserName + ".tab.c");
300 out.println();
301
302 out.println(parserName + ".lex.c: " + parserName + ".l");
303 out.println("\tflex -i -P" + parserName +
304 " -o" + parserName + ".lex.c " +
305 parserName + ".l");
306 out.println();
307
308 out.println(parserName + ".tab.c " + parserName + ".tab.h: " +
309 parserName + ".y");
310 out.println("\tbison -d -p" + parserName + " " +
311 parserName + ".y");
312 out.println();
313 }
314 parserName = a.getFrontEndParserName();
315 if (parserName != null) {
316 out.println(parserName + ".lex.o: " + parserName + ".lex.c " +
317 parserName + ".tab.h");
318 out.println("\t$(CC) $(CFLAGS) -c " + parserName + ".lex.c");
319 out.println();
320
321 out.println(parserName + ".tab.o: " + parserName + ".tab.c " +
322 parserName + ".tab.h");
323 out.println("\t$(CC) $(CFLAGS) -c " + parserName + ".tab.c");
324 out.println();
325
326 out.println(parserName + ".lex.c: " + parserName + ".l");
327 out.println("\tflex -i -P" + parserName +
328 " -o" + parserName + ".lex.c " +
329 parserName + ".l");
330 out.println();
331
332 out.println(parserName + ".tab.c " + parserName + ".tab.h: " +
333 parserName + ".y");
334 out.println("\tbison -d -p" + parserName + " " +
335 parserName + ".y");
336 out.println();
337 }
338 }
339 out.close();
340 }
341
342 // when run as an application, produce the "syntax_tab.h" header, as
343 // well as the Makefile.syntax to actually compile everything
344 public static void main(String[] args) throws ParserConfigurationException,
/* [<][>][^][v][top][bottom][index][help] */
345 SAXException,
346 IOException
347 {
348 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
349 DocumentBuilder db = dbf.newDocumentBuilder();
350 Document doc = db.parse(new File("syntax.xml"));
351 RPSLSyntax syntaxes = null;
352 Node syntax_search = doc.getFirstChild();
353 while (syntax_search != null) {
354 if (syntax_search.getNodeName().equals("rpsl_syntax")) {
355 syntaxes = new RPSLSyntax(syntax_search);
356 }
357 syntax_search = syntax_search.getNextSibling();
358 }
359 syntaxes.writeSyntaxTab("syntax_tab.h");
360 syntaxes.writeSyntaxMakefile("Makefile.syntax");
361 }
362 }
363