[BACK]Return to yacc.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ctags

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: }