1 /*
2 * Copyright (c) 1987, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)print.c 8.3 (Berkeley) 04/02/94";
10 #endif /* not lint */
11
12 #include <limits.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <unistd.h>
17
18 #include "ctags.h"
19
20 /*
21 * getline --
22 * get the line the token of interest occurred on,
23 * prepare it for printing.
24 */
25 void
getline()26 getline()
27 {
28 long saveftell;
29 int c;
30 int cnt;
31 char *cp;
32
33 saveftell = ftell(inf);
34 (void)fseek(inf, lineftell, L_SET);
35 if (xflag)
36 for (cp = lbuf; GETC(!=, '\n'); *cp++ = c)
37 continue;
38 /*
39 * do all processing here, so we don't step through the
40 * line more than once; means you don't call this routine
41 * unless you're sure you've got a keeper.
42 */
43 else for (cnt = 0, cp = lbuf; GETC(!=, EOF) && cnt < ENDLINE; ++cnt) {
44 if (c == '\\') { /* backslashes */
45 if (cnt > ENDLINE - 2)
46 break;
47 *cp++ = '\\'; *cp++ = '\\';
48 ++cnt;
49 }
50 else if (c == (int)searchar) { /* search character */
51 if (cnt > ENDLINE - 2)
52 break;
53 *cp++ = '\\'; *cp++ = c;
54 ++cnt;
55 }
56 else if (c == '\n') { /* end of keep */
57 *cp++ = '$'; /* can find whole line */
58 break;
59 }
60 else
61 *cp++ = c;
62 }
63 *cp = EOS;
64 (void)fseek(inf, saveftell, L_SET);
65 }
66
67 /*
68 * put_entries --
69 * write out the tags
70 */
71 void
put_entries(node)72 put_entries(node)
73 NODE *node;
74 {
75
76 if (node->left)
77 put_entries(node->left);
78 if (vflag)
79 printf("%s %s %d\n",
80 node->entry, node->file, (node->lno + 63) / 64);
81 else if (xflag)
82 printf("%-16s%4d %-16s %s\n",
83 node->entry, node->lno, node->file, node->pat);
84 else
85 fprintf(outf, "%s\t%s\t%c^%s%c\n",
86 node->entry, node->file, searchar, node->pat, searchar);
87 if (node->right)
88 put_entries(node->right);
89 }
90