1331722Seadler/* 21590Srgrimes * Copyright (c) 1987, 1993, 1994 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * Redistribution and use in source and binary forms, with or without 61590Srgrimes * modification, are permitted provided that the following conditions 71590Srgrimes * are met: 81590Srgrimes * 1. Redistributions of source code must retain the above copyright 91590Srgrimes * notice, this list of conditions and the following disclaimer. 101590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111590Srgrimes * notice, this list of conditions and the following disclaimer in the 121590Srgrimes * documentation and/or other materials provided with the distribution. 131590Srgrimes * 4. Neither the name of the University nor the names of its contributors 141590Srgrimes * may be used to endorse or promote products derived from this software 151590Srgrimes * without specific prior written permission. 161590Srgrimes * 171590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 181590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 211590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271590Srgrimes * SUCH DAMAGE. 281590Srgrimes */ 291590Srgrimes 3087628Sdwmalone#if 0 3187628Sdwmalone#ifndef lint 3287628Sdwmalonestatic char sccsid[] = "@(#)print.c 8.3 (Berkeley) 4/2/94"; 3387628Sdwmalone#endif 3487628Sdwmalone#endif 3587628Sdwmalone 3687249Smarkm#include <sys/cdefs.h> 3787249Smarkm__FBSDID("$FreeBSD$"); 3887249Smarkm 391590Srgrimes#include <limits.h> 401590Srgrimes#include <stdio.h> 411590Srgrimes#include <unistd.h> 421590Srgrimes 431590Srgrimes#include "ctags.h" 441590Srgrimes 451590Srgrimes/* 46299355Sbapt * get_line -- 471590Srgrimes * get the line the token of interest occurred on, 481590Srgrimes * prepare it for printing. 491590Srgrimes */ 501590Srgrimesvoid 51299355Sbaptget_line(void) 521590Srgrimes{ 531590Srgrimes long saveftell; 541590Srgrimes int c; 551590Srgrimes int cnt; 561590Srgrimes char *cp; 571590Srgrimes 581590Srgrimes saveftell = ftell(inf); 591590Srgrimes (void)fseek(inf, lineftell, L_SET); 601590Srgrimes if (xflag) 6135307Sphk for (cp = lbuf; GETC(!=, EOF) && c != '\n'; *cp++ = c) 621590Srgrimes continue; 631590Srgrimes /* 641590Srgrimes * do all processing here, so we don't step through the 651590Srgrimes * line more than once; means you don't call this routine 661590Srgrimes * unless you're sure you've got a keeper. 671590Srgrimes */ 681590Srgrimes else for (cnt = 0, cp = lbuf; GETC(!=, EOF) && cnt < ENDLINE; ++cnt) { 691590Srgrimes if (c == '\\') { /* backslashes */ 701590Srgrimes if (cnt > ENDLINE - 2) 711590Srgrimes break; 721590Srgrimes *cp++ = '\\'; *cp++ = '\\'; 731590Srgrimes ++cnt; 741590Srgrimes } 751590Srgrimes else if (c == (int)searchar) { /* search character */ 761590Srgrimes if (cnt > ENDLINE - 2) 771590Srgrimes break; 781590Srgrimes *cp++ = '\\'; *cp++ = c; 791590Srgrimes ++cnt; 801590Srgrimes } 811590Srgrimes else if (c == '\n') { /* end of keep */ 821590Srgrimes *cp++ = '$'; /* can find whole line */ 831590Srgrimes break; 841590Srgrimes } 851590Srgrimes else 861590Srgrimes *cp++ = c; 871590Srgrimes } 881590Srgrimes *cp = EOS; 891590Srgrimes (void)fseek(inf, saveftell, L_SET); 901590Srgrimes} 911590Srgrimes 921590Srgrimes/* 931590Srgrimes * put_entries -- 941590Srgrimes * write out the tags 951590Srgrimes */ 961590Srgrimesvoid 97100822Sdwmaloneput_entries(NODE *node) 981590Srgrimes{ 991590Srgrimes 1001590Srgrimes if (node->left) 1011590Srgrimes put_entries(node->left); 1021590Srgrimes if (vflag) 1031590Srgrimes printf("%s %s %d\n", 1041590Srgrimes node->entry, node->file, (node->lno + 63) / 64); 1051590Srgrimes else if (xflag) 10681783Smikeh printf("%-16s %4d %-16s %s\n", 1071590Srgrimes node->entry, node->lno, node->file, node->pat); 1081590Srgrimes else 1091590Srgrimes fprintf(outf, "%s\t%s\t%c^%s%c\n", 1101590Srgrimes node->entry, node->file, searchar, node->pat, searchar); 1111590Srgrimes if (node->right) 1121590Srgrimes put_entries(node->right); 1131590Srgrimes} 114