yacc.c revision 1590
1251881Speter/*
2251881Speter * Copyright (c) 1987, 1993, 1994
3251881Speter *	The Regents of the University of California.  All rights reserved.
4251881Speter *
5251881Speter * Redistribution and use in source and binary forms, with or without
6251881Speter * modification, are permitted provided that the following conditions
7251881Speter * are met:
8251881Speter * 1. Redistributions of source code must retain the above copyright
9251881Speter *    notice, this list of conditions and the following disclaimer.
10251881Speter * 2. Redistributions in binary form must reproduce the above copyright
11251881Speter *    notice, this list of conditions and the following disclaimer in the
12251881Speter *    documentation and/or other materials provided with the distribution.
13251881Speter * 3. All advertising materials mentioning features or use of this software
14251881Speter *    must display the following acknowledgement:
15251881Speter *	This product includes software developed by the University of
16251881Speter *	California, Berkeley and its contributors.
17251881Speter * 4. Neither the name of the University nor the names of its contributors
18251881Speter *    may be used to endorse or promote products derived from this software
19251881Speter *    without specific prior written permission.
20251881Speter *
21251881Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22251881Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23251881Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24251881Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25251881Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26251881Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27251881Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28251881Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29251881Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30251881Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31251881Speter * SUCH DAMAGE.
32251881Speter */
33251881Speter
34251881Speter#ifndef lint
35251881Speterstatic char sccsid[] = "@(#)yacc.c	8.3 (Berkeley) 4/2/94";
36251881Speter#endif /* not lint */
37251881Speter
38251881Speter#include <ctype.h>
39251881Speter#include <limits.h>
40251881Speter#include <stdio.h>
41251881Speter#include <string.h>
42251881Speter
43251881Speter#include "ctags.h"
44251881Speter
45251881Speter/*
46251881Speter * y_entries:
47251881Speter *	find the yacc tags and put them in.
48251881Speter */
49251881Spetervoid
50251881Spetery_entries()
51251881Speter{
52251881Speter	int	c;
53251881Speter	char	*sp;
54251881Speter	bool	in_rule;
55251881Speter	char	tok[MAXTOKEN];
56251881Speter
57251881Speter	in_rule = NO;
58251881Speter
59251881Speter	while (GETC(!=, EOF))
60251881Speter		switch (c) {
61251881Speter		case '\n':
62251881Speter			SETLINE;
63251881Speter			/* FALLTHROUGH */
64251881Speter		case ' ':
65251881Speter		case '\f':
66251881Speter		case '\r':
67251881Speter		case '\t':
68251881Speter			break;
69251881Speter		case '{':
70251881Speter			if (skip_key('}'))
71251881Speter				in_rule = NO;
72251881Speter			break;
73251881Speter		case '\'':
74251881Speter		case '"':
75251881Speter			if (skip_key(c))
76251881Speter				in_rule = NO;
77251881Speter			break;
78251881Speter		case '%':
79251881Speter			if (GETC(==, '%'))
80251881Speter				return;
81251881Speter			(void)ungetc(c, inf);
82251881Speter			break;
83251881Speter		case '/':
84251881Speter			if (GETC(==, '*'))
85251881Speter				skip_comment();
86251881Speter			else
87251881Speter				(void)ungetc(c, inf);
88251881Speter			break;
89251881Speter		case '|':
90251881Speter		case ';':
91251881Speter			in_rule = NO;
92251881Speter			break;
93251881Speter		default:
94251881Speter			if (in_rule || !isalpha(c) && c != '.' && c != '_')
95251881Speter				break;
96251881Speter			sp = tok;
97251881Speter			*sp++ = c;
98251881Speter			while (GETC(!=, EOF) && (intoken(c) || c == '.'))
99251881Speter				*sp++ = c;
100251881Speter			*sp = EOS;
101251881Speter			getline();		/* may change before ':' */
102251881Speter			while (iswhite(c)) {
103251881Speter				if (c == '\n')
104251881Speter					SETLINE;
105251881Speter				if (GETC(==, EOF))
106251881Speter					return;
107251881Speter			}
108251881Speter			if (c == ':') {
109251881Speter				pfnote(tok, lineno);
110251881Speter				in_rule = YES;
111251881Speter			}
112251881Speter			else
113251881Speter				(void)ungetc(c, inf);
114251881Speter		}
115251881Speter}
116251881Speter
117251881Speter/*
118251881Speter * toss_yysec --
119251881Speter *	throw away lines up to the next "\n%%\n"
120251881Speter */
121251881Spetervoid
122251881Spetertoss_yysec()
123251881Speter{
124251881Speter	int	c;			/* read character */
125251881Speter	int	state;
126251881Speter
127251881Speter	/*
128251881Speter	 * state == 0 : waiting
129251881Speter	 * state == 1 : received a newline
130251881Speter	 * state == 2 : received first %
131251881Speter	 * state == 3 : recieved second %
132251881Speter	 */
133251881Speter	lineftell = ftell(inf);
134251881Speter	for (state = 0; GETC(!=, EOF);)
135251881Speter		switch (c) {
136251881Speter		case '\n':
137251881Speter			++lineno;
138251881Speter			lineftell = ftell(inf);
139251881Speter			if (state == 3)		/* done! */
140251881Speter				return;
141251881Speter			state = 1;		/* start over */
142251881Speter			break;
143251881Speter		case '%':
144251881Speter			if (state)		/* if 1 or 2 */
145251881Speter				++state;	/* goto 3 */
146251881Speter			break;
147251881Speter		default:
148251881Speter			state = 0;		/* reset */
149251881Speter			break;
150251881Speter		}
151251881Speter}
152251881Speter