new copyright notice
[unix-history] / usr / src / usr.bin / ctags / print.c
CommitLineData
70f42695 1/*
ffa8a268
KB
2 * Copyright (c) 1987 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
70f42695
KB
16 */
17
18#ifndef lint
ffa8a268
KB
19static char sccsid[] = "@(#)print.c 5.2 (Berkeley) %G%";
20#endif /* not lint */
70f42695
KB
21
22#include <sys/types.h>
23#include <sys/file.h>
24#include <ctags.h>
25
26extern char searchar; /* ex search character */
27
28/*
29 * getline --
30 * get the line the token of interest occurred on,
31 * prepare it for printing.
32 */
33getline()
34{
35 register long saveftell;
36 register int c,
37 cnt;
38 register char *cp;
39
40 saveftell = ftell(inf);
41 (void)fseek(inf,lineftell,L_SET);
42 if (xflag)
43 for (cp = lbuf;GETC(!=,'\n');*cp++ = c);
44 /*
45 * do all processing here, so we don't step through the
46 * line more than once; means you don't call this routine
47 * unless you're sure you've got a keeper.
48 */
49 else for (cnt = 0,cp = lbuf;GETC(!=,EOF) && cnt < ENDLINE;++cnt) {
50 if (c == (int)'\\') { /* backslashes */
51 if (cnt > ENDLINE - 2)
52 break;
53 *cp++ = '\\'; *cp++ = '\\';
54 ++cnt;
55 }
56 else if (c == (int)searchar) { /* search character */
57 if (cnt > ENDLINE - 2)
58 break;
59 *cp++ = '\\'; *cp++ = c;
60 ++cnt;
61 }
62 else if (c == (int)'\n') { /* end of keep */
63 *cp++ = '$'; /* can find whole line */
64 break;
65 }
66 else
67 *cp++ = c;
68 }
69 *cp = EOS;
70 (void)fseek(inf,saveftell,L_SET);
71}
72
73/*
74 * put_entries --
75 * write out the tags
76 */
77put_entries(node)
78 register NODE *node;
79{
80 extern FILE *outf; /* ioptr for tags file */
81 extern int vflag; /* -v: vgrind style output */
82
83 if (node->left)
84 put_entries(node->left);
85 if (vflag)
86 printf("%s %s %d\n",
87 node->entry,node->file,(node->lno + 63) / 64);
88 else if (xflag)
89 printf("%-16s%4d %-16s %s\n",
90 node->entry,node->lno,node->file,node->pat);
91 else
92 fprintf(outf,"%s\t%s\t%c^%s%c\n",
93 node->entry,node->file,searchar,node->pat,searchar);
94 if (node->right)
95 put_entries(node->right);
96}
97
98char *
99savestr(str)
100 char *str;
101{
102 register u_int len;
103 register char *space;
104 char *malloc();
105
106 len = strlen(str) + 1;
107 if (!(space = malloc((u_int)len))) {
108 /*
109 * should probably free up the tree, here,
110 * we're just as likely to fail here as we
111 * are when getting the NODE structure
112 */
113 fputs("ctags: no more space.\n",stderr);
114 exit(1);
115 }
116 bcopy(str,space,len);
117 return(space);
118}