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