1 /* 2 * Copyright (c) 1987 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)yacc.c 5.5 (Berkeley) 06/01/90"; 10 #endif /* not lint */ 11 12 #include <ctags.h> 13 #include <string.h> 14 15 /* 16 * y_entries: 17 * find the yacc tags and put them in. 18 */ 19 y_entries() 20 { 21 register int c; 22 register char *sp; 23 register bool in_rule; 24 char tok[MAXTOKEN]; 25 26 while (GETC(!=,EOF)) 27 switch ((char)c) { 28 case '\n': 29 SETLINE; 30 /* FALLTHROUGH */ 31 case ' ': 32 case '\f': 33 case '\r': 34 case '\t': 35 break; 36 case '{': 37 if (skip_key((int)'}')) 38 in_rule = NO; 39 break; 40 case '\'': 41 case '"': 42 if (skip_key(c)) 43 in_rule = NO; 44 break; 45 case '%': 46 if (GETC(==,'%')) 47 return; 48 (void)ungetc(c,inf); 49 break; 50 case '/': 51 if (GETC(==,'*')) 52 skip_comment(); 53 else 54 (void)ungetc(c,inf); 55 break; 56 case '|': 57 case ';': 58 in_rule = NO; 59 break; 60 default: 61 if (in_rule || !isalpha(c) && c != (int)'.' 62 && c != (int)'_') 63 break; 64 sp = tok; 65 *sp++ = c; 66 while (GETC(!=,EOF) && (intoken(c) || c == (int)'.')) 67 *sp++ = c; 68 *sp = EOS; 69 getline(); /* may change before ':' */ 70 while (iswhite(c)) { 71 if (c == (int)'\n') 72 SETLINE; 73 if (GETC(==,EOF)) 74 return; 75 } 76 if (c == (int)':') { 77 pfnote(tok,lineno); 78 in_rule = YES; 79 } 80 else 81 (void)ungetc(c,inf); 82 } 83 } 84 85 /* 86 * toss_yysec -- 87 * throw away lines up to the next "\n%%\n" 88 */ 89 toss_yysec() 90 { 91 register int c, /* read character */ 92 state; 93 94 /* 95 * state == 0 : waiting 96 * state == 1 : received a newline 97 * state == 2 : received first % 98 * state == 3 : recieved second % 99 */ 100 lineftell = ftell(inf); 101 for (state = 0;GETC(!=,EOF);) 102 switch ((char)c) { 103 case '\n': 104 ++lineno; 105 lineftell = ftell(inf); 106 if (state == 3) /* done! */ 107 return; 108 state = 1; /* start over */ 109 break; 110 case '%': 111 if (state) /* if 1 or 2 */ 112 ++state; /* goto 3 */ 113 break; 114 default: 115 state = 0; /* reset */ 116 } 117 } 118