less -> more
[unix-history] / usr / src / usr.bin / ctags / print.c
CommitLineData
70f42695
KB
1/*
2 * Copyright (c) 1987 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8static char sccsid[] = "@(#)print.c 5.1 (Berkeley) %G%";
9#endif not lint
10
11#include <sys/types.h>
12#include <sys/file.h>
13#include <ctags.h>
14
15extern char searchar; /* ex search character */
16
17/*
18 * getline --
19 * get the line the token of interest occurred on,
20 * prepare it for printing.
21 */
22getline()
23{
24 register long saveftell;
25 register int c,
26 cnt;
27 register char *cp;
28
29 saveftell = ftell(inf);
30 (void)fseek(inf,lineftell,L_SET);
31 if (xflag)
32 for (cp = lbuf;GETC(!=,'\n');*cp++ = c);
33 /*
34 * do all processing here, so we don't step through the
35 * line more than once; means you don't call this routine
36 * unless you're sure you've got a keeper.
37 */
38 else for (cnt = 0,cp = lbuf;GETC(!=,EOF) && cnt < ENDLINE;++cnt) {
39 if (c == (int)'\\') { /* backslashes */
40 if (cnt > ENDLINE - 2)
41 break;
42 *cp++ = '\\'; *cp++ = '\\';
43 ++cnt;
44 }
45 else if (c == (int)searchar) { /* search character */
46 if (cnt > ENDLINE - 2)
47 break;
48 *cp++ = '\\'; *cp++ = c;
49 ++cnt;
50 }
51 else if (c == (int)'\n') { /* end of keep */
52 *cp++ = '$'; /* can find whole line */
53 break;
54 }
55 else
56 *cp++ = c;
57 }
58 *cp = EOS;
59 (void)fseek(inf,saveftell,L_SET);
60}
61
62/*
63 * put_entries --
64 * write out the tags
65 */
66put_entries(node)
67 register NODE *node;
68{
69 extern FILE *outf; /* ioptr for tags file */
70 extern int vflag; /* -v: vgrind style output */
71
72 if (node->left)
73 put_entries(node->left);
74 if (vflag)
75 printf("%s %s %d\n",
76 node->entry,node->file,(node->lno + 63) / 64);
77 else if (xflag)
78 printf("%-16s%4d %-16s %s\n",
79 node->entry,node->lno,node->file,node->pat);
80 else
81 fprintf(outf,"%s\t%s\t%c^%s%c\n",
82 node->entry,node->file,searchar,node->pat,searchar);
83 if (node->right)
84 put_entries(node->right);
85}
86
87char *
88savestr(str)
89 char *str;
90{
91 register u_int len;
92 register char *space;
93 char *malloc();
94
95 len = strlen(str) + 1;
96 if (!(space = malloc((u_int)len))) {
97 /*
98 * should probably free up the tree, here,
99 * we're just as likely to fail here as we
100 * are when getting the NODE structure
101 */
102 fputs("ctags: no more space.\n",stderr);
103 exit(1);
104 }
105 bcopy(str,space,len);
106 return(space);
107}