xref: /minix3/external/bsd/bind/dist/bin/tests/lex_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: lex_test.c,v 1.6 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1998-2001  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: lex_test.c,v 1.23 2007/06/19 23:46:59 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek /*! \file */
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <isc/commandline.h>
26*00b67f09SDavid van Moolenbroek #include <isc/lex.h>
27*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
28*00b67f09SDavid van Moolenbroek #include <isc/util.h>
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
31*00b67f09SDavid van Moolenbroek isc_lex_t *lex;
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek isc_lexspecials_t specials;
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek static void
print_token(isc_token_t * tokenp,FILE * stream)36*00b67f09SDavid van Moolenbroek print_token(isc_token_t *tokenp, FILE *stream) {
37*00b67f09SDavid van Moolenbroek 	switch (tokenp->type) {
38*00b67f09SDavid van Moolenbroek 	case isc_tokentype_unknown:
39*00b67f09SDavid van Moolenbroek 		fprintf(stream, "UNKNOWN");
40*00b67f09SDavid van Moolenbroek 		break;
41*00b67f09SDavid van Moolenbroek 	case isc_tokentype_string:
42*00b67f09SDavid van Moolenbroek 		fprintf(stream, "STRING %.*s",
43*00b67f09SDavid van Moolenbroek 			(int)tokenp->value.as_region.length,
44*00b67f09SDavid van Moolenbroek 			tokenp->value.as_region.base);
45*00b67f09SDavid van Moolenbroek 		break;
46*00b67f09SDavid van Moolenbroek 	case isc_tokentype_number:
47*00b67f09SDavid van Moolenbroek 		fprintf(stream, "NUMBER %lu", tokenp->value.as_ulong);
48*00b67f09SDavid van Moolenbroek 		break;
49*00b67f09SDavid van Moolenbroek 	case isc_tokentype_qstring:
50*00b67f09SDavid van Moolenbroek 		fprintf(stream, "QSTRING \"%.*s\"",
51*00b67f09SDavid van Moolenbroek 			(int)tokenp->value.as_region.length,
52*00b67f09SDavid van Moolenbroek 			tokenp->value.as_region.base);
53*00b67f09SDavid van Moolenbroek 		break;
54*00b67f09SDavid van Moolenbroek 	case isc_tokentype_eol:
55*00b67f09SDavid van Moolenbroek 		fprintf(stream, "EOL");
56*00b67f09SDavid van Moolenbroek 		break;
57*00b67f09SDavid van Moolenbroek 	case isc_tokentype_eof:
58*00b67f09SDavid van Moolenbroek 		fprintf(stream, "EOF");
59*00b67f09SDavid van Moolenbroek 		break;
60*00b67f09SDavid van Moolenbroek 	case isc_tokentype_initialws:
61*00b67f09SDavid van Moolenbroek 		fprintf(stream, "INITIALWS");
62*00b67f09SDavid van Moolenbroek 		break;
63*00b67f09SDavid van Moolenbroek 	case isc_tokentype_special:
64*00b67f09SDavid van Moolenbroek 		fprintf(stream, "SPECIAL %c", tokenp->value.as_char);
65*00b67f09SDavid van Moolenbroek 		break;
66*00b67f09SDavid van Moolenbroek 	case isc_tokentype_nomore:
67*00b67f09SDavid van Moolenbroek 		fprintf(stream, "NOMORE");
68*00b67f09SDavid van Moolenbroek 		break;
69*00b67f09SDavid van Moolenbroek 	default:
70*00b67f09SDavid van Moolenbroek 		FATAL_ERROR(__FILE__, __LINE__, "Unexpected type %d",
71*00b67f09SDavid van Moolenbroek 			    tokenp->type);
72*00b67f09SDavid van Moolenbroek 	}
73*00b67f09SDavid van Moolenbroek }
74*00b67f09SDavid van Moolenbroek 
75*00b67f09SDavid van Moolenbroek int
main(int argc,char * argv[])76*00b67f09SDavid van Moolenbroek main(int argc, char *argv[]) {
77*00b67f09SDavid van Moolenbroek 	isc_token_t token;
78*00b67f09SDavid van Moolenbroek 	isc_result_t result;
79*00b67f09SDavid van Moolenbroek 	int quiet = 0;
80*00b67f09SDavid van Moolenbroek 	int c;
81*00b67f09SDavid van Moolenbroek 	int masterfile = 1;
82*00b67f09SDavid van Moolenbroek 	int stats = 0;
83*00b67f09SDavid van Moolenbroek 	unsigned int options = 0;
84*00b67f09SDavid van Moolenbroek 	int done = 0;
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek 	while ((c = isc_commandline_parse(argc, argv, "qmcs")) != -1) {
87*00b67f09SDavid van Moolenbroek 		switch (c) {
88*00b67f09SDavid van Moolenbroek 		case 'q':
89*00b67f09SDavid van Moolenbroek 			quiet = 1;
90*00b67f09SDavid van Moolenbroek 			break;
91*00b67f09SDavid van Moolenbroek 		case 'm':
92*00b67f09SDavid van Moolenbroek 			masterfile = 1;
93*00b67f09SDavid van Moolenbroek 			break;
94*00b67f09SDavid van Moolenbroek 		case 'c':
95*00b67f09SDavid van Moolenbroek 			masterfile = 0;
96*00b67f09SDavid van Moolenbroek 			break;
97*00b67f09SDavid van Moolenbroek 		case 's':
98*00b67f09SDavid van Moolenbroek 			stats = 1;
99*00b67f09SDavid van Moolenbroek 			break;
100*00b67f09SDavid van Moolenbroek 		}
101*00b67f09SDavid van Moolenbroek 	}
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
104*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_lex_create(mctx, 256, &lex) == ISC_R_SUCCESS);
105*00b67f09SDavid van Moolenbroek 
106*00b67f09SDavid van Moolenbroek 	if (masterfile) {
107*00b67f09SDavid van Moolenbroek 		/* Set up to lex DNS master file. */
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek 		specials['('] = 1;
110*00b67f09SDavid van Moolenbroek 		specials[')'] = 1;
111*00b67f09SDavid van Moolenbroek 		specials['"'] = 1;
112*00b67f09SDavid van Moolenbroek 		isc_lex_setspecials(lex, specials);
113*00b67f09SDavid van Moolenbroek 		options = ISC_LEXOPT_DNSMULTILINE | ISC_LEXOPT_ESCAPE |
114*00b67f09SDavid van Moolenbroek 			ISC_LEXOPT_EOF |
115*00b67f09SDavid van Moolenbroek 			ISC_LEXOPT_QSTRING | ISC_LEXOPT_NOMORE;
116*00b67f09SDavid van Moolenbroek 		isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE);
117*00b67f09SDavid van Moolenbroek 	} else {
118*00b67f09SDavid van Moolenbroek 		/* Set up to lex DNS config file. */
119*00b67f09SDavid van Moolenbroek 
120*00b67f09SDavid van Moolenbroek 		specials['{'] = 1;
121*00b67f09SDavid van Moolenbroek 		specials['}'] = 1;
122*00b67f09SDavid van Moolenbroek 		specials[';'] = 1;
123*00b67f09SDavid van Moolenbroek 		specials['/'] = 1;
124*00b67f09SDavid van Moolenbroek 		specials['"'] = 1;
125*00b67f09SDavid van Moolenbroek 		specials['!'] = 1;
126*00b67f09SDavid van Moolenbroek 		specials['*'] = 1;
127*00b67f09SDavid van Moolenbroek 		isc_lex_setspecials(lex, specials);
128*00b67f09SDavid van Moolenbroek 		options = ISC_LEXOPT_EOF |
129*00b67f09SDavid van Moolenbroek 			ISC_LEXOPT_QSTRING |
130*00b67f09SDavid van Moolenbroek 			ISC_LEXOPT_NUMBER | ISC_LEXOPT_NOMORE;
131*00b67f09SDavid van Moolenbroek 		isc_lex_setcomments(lex, (ISC_LEXCOMMENT_C|
132*00b67f09SDavid van Moolenbroek 					  ISC_LEXCOMMENT_CPLUSPLUS|
133*00b67f09SDavid van Moolenbroek 					  ISC_LEXCOMMENT_SHELL));
134*00b67f09SDavid van Moolenbroek 	}
135*00b67f09SDavid van Moolenbroek 
136*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_lex_openstream(lex, stdin) == ISC_R_SUCCESS);
137*00b67f09SDavid van Moolenbroek 
138*00b67f09SDavid van Moolenbroek 	while ((result = isc_lex_gettoken(lex, options, &token)) ==
139*00b67f09SDavid van Moolenbroek 	       ISC_R_SUCCESS && !done) {
140*00b67f09SDavid van Moolenbroek 		if (!quiet) {
141*00b67f09SDavid van Moolenbroek 			char *name = isc_lex_getsourcename(lex);
142*00b67f09SDavid van Moolenbroek 			print_token(&token, stdout);
143*00b67f09SDavid van Moolenbroek 			printf(" line = %lu file = %s\n",
144*00b67f09SDavid van Moolenbroek 				isc_lex_getsourceline(lex),
145*00b67f09SDavid van Moolenbroek 				(name == NULL) ? "<none>" : name);
146*00b67f09SDavid van Moolenbroek 		}
147*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_eof)
148*00b67f09SDavid van Moolenbroek 			isc_lex_close(lex);
149*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_nomore)
150*00b67f09SDavid van Moolenbroek 			done = 1;
151*00b67f09SDavid van Moolenbroek 	}
152*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
153*00b67f09SDavid van Moolenbroek 		printf("Result: %s\n", isc_result_totext(result));
154*00b67f09SDavid van Moolenbroek 
155*00b67f09SDavid van Moolenbroek 	isc_lex_close(lex);
156*00b67f09SDavid van Moolenbroek 	isc_lex_destroy(&lex);
157*00b67f09SDavid van Moolenbroek 	if (!quiet && stats)
158*00b67f09SDavid van Moolenbroek 		isc_mem_stats(mctx, stdout);
159*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
160*00b67f09SDavid van Moolenbroek 
161*00b67f09SDavid van Moolenbroek 	return (0);
162*00b67f09SDavid van Moolenbroek }
163