Annotation of src/usr.bin/ctags/yacc.c, Revision 1.4
1.4 ! aaron 1: /* $OpenBSD: yacc.c,v 1.3 2000/07/25 19:26:23 deraadt Exp $ */
1.1 deraadt 2: /* $NetBSD: yacc.c,v 1.3 1995/03/26 20:14:12 glass Exp $ */
3:
4: /*
5: * Copyright (c) 1987, 1993, 1994
6: * The Regents of the University of California. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by the University of
19: * California, Berkeley and its contributors.
20: * 4. Neither the name of the University nor the names of its contributors
21: * may be used to endorse or promote products derived from this software
22: * without specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: */
36:
37: #ifndef lint
38: #if 0
39: static char sccsid[] = "@(#)yacc.c 8.3 (Berkeley) 4/2/94";
40: #else
1.4 ! aaron 41: static char rcsid[] = "$OpenBSD: yacc.c,v 1.3 2000/07/25 19:26:23 deraadt Exp $";
1.1 deraadt 42: #endif
43: #endif /* not lint */
44:
45: #include <ctype.h>
46: #include <limits.h>
47: #include <stdio.h>
48: #include <string.h>
49:
50: #include "ctags.h"
51:
52: /*
53: * y_entries:
54: * find the yacc tags and put them in.
55: */
56: void
57: y_entries()
58: {
59: int c;
60: char *sp;
61: bool in_rule;
62: char tok[MAXTOKEN];
63:
64: in_rule = NO;
65:
66: while (GETC(!=, EOF))
67: switch (c) {
68: case '\n':
69: SETLINE;
70: /* FALLTHROUGH */
71: case ' ':
72: case '\f':
73: case '\r':
74: case '\t':
75: break;
76: case '{':
77: if (skip_key('}'))
78: in_rule = NO;
79: break;
80: case '\'':
81: case '"':
82: if (skip_key(c))
83: in_rule = NO;
84: break;
85: case '%':
86: if (GETC(==, '%'))
87: return;
88: (void)ungetc(c, inf);
89: break;
90: case '/':
91: if (GETC(==, '*'))
92: skip_comment();
93: else
94: (void)ungetc(c, inf);
95: break;
96: case '|':
97: case ';':
98: in_rule = NO;
99: break;
100: default:
1.3 deraadt 101: if (in_rule || (!isalpha(c) && c != '.' && c != '_'))
1.1 deraadt 102: break;
103: sp = tok;
104: *sp++ = c;
105: while (GETC(!=, EOF) && (intoken(c) || c == '.'))
106: *sp++ = c;
107: *sp = EOS;
108: getline(); /* may change before ':' */
109: while (iswhite(c)) {
110: if (c == '\n')
111: SETLINE;
112: if (GETC(==, EOF))
113: return;
114: }
115: if (c == ':') {
116: pfnote(tok, lineno);
117: in_rule = YES;
118: }
119: else
120: (void)ungetc(c, inf);
121: }
122: }
123:
124: /*
125: * toss_yysec --
126: * throw away lines up to the next "\n%%\n"
127: */
128: void
129: toss_yysec()
130: {
131: int c; /* read character */
132: int state;
133:
134: /*
135: * state == 0 : waiting
136: * state == 1 : received a newline
137: * state == 2 : received first %
1.4 ! aaron 138: * state == 3 : received second %
1.1 deraadt 139: */
140: lineftell = ftell(inf);
141: for (state = 0; GETC(!=, EOF);)
142: switch (c) {
143: case '\n':
144: ++lineno;
145: lineftell = ftell(inf);
146: if (state == 3) /* done! */
147: return;
148: state = 1; /* start over */
149: break;
150: case '%':
151: if (state) /* if 1 or 2 */
152: ++state; /* goto 3 */
153: break;
154: default:
155: state = 0; /* reset */
156: break;
157: }
158: }