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