1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1987, 1993, 1994
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33#include <limits.h>
34#include <stdio.h>
35#include <unistd.h>
36
37#include "ctags.h"
38
39/*
40 * get_line --
41 *	get the line the token of interest occurred on,
42 *	prepare it for printing.
43 */
44void
45get_line(void)
46{
47	long	saveftell;
48	int	c;
49	int	cnt;
50	char	*cp;
51
52	saveftell = ftell(inf);
53	(void)fseek(inf, lineftell, L_SET);
54	if (xflag)
55		for (cp = lbuf; GETC(!=, EOF) && c != '\n'; *cp++ = c)
56			continue;
57	/*
58	 * do all processing here, so we don't step through the
59	 * line more than once; means you don't call this routine
60	 * unless you're sure you've got a keeper.
61	 */
62	else for (cnt = 0, cp = lbuf; GETC(!=, EOF) && cnt < ENDLINE; ++cnt) {
63		if (c == '\\') {		/* backslashes */
64			if (cnt > ENDLINE - 2)
65				break;
66			*cp++ = '\\'; *cp++ = '\\';
67			++cnt;
68		}
69		else if (c == (int)searchar) {	/* search character */
70			if (cnt > ENDLINE - 2)
71				break;
72			*cp++ = '\\'; *cp++ = c;
73			++cnt;
74		}
75		else if (c == '\n') {	/* end of keep */
76			*cp++ = '$';		/* can find whole line */
77			break;
78		}
79		else
80			*cp++ = c;
81	}
82	*cp = EOS;
83	(void)fseek(inf, saveftell, L_SET);
84}
85
86/*
87 * put_entries --
88 *	write out the tags
89 */
90void
91put_entries(NODE *node)
92{
93
94	if (node->left)
95		put_entries(node->left);
96	if (vflag)
97		printf("%s %s %d\n",
98		    node->entry, node->file, (node->lno + 63) / 64);
99	else if (xflag)
100		printf("%-16s %4d %-16s %s\n",
101		    node->entry, node->lno, node->file, node->pat);
102	else
103		fprintf(outf, "%s\t%s\t%c^%s%c\n",
104		    node->entry, node->file, searchar, node->pat, searchar);
105	if (node->right)
106		put_entries(node->right);
107}
108