xref: /original-bsd/usr.bin/ctags/tree.c (revision 09b04dfe)
1 /*
2  * Copyright (c) 1987 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)tree.c	5.4 (Berkeley) 06/01/90";
10 #endif /* not lint */
11 
12 #include <ctags.h>
13 #include <string.h>
14 
15 /*
16  * pfnote --
17  *	enter a new node in the tree
18  */
19 pfnote(name,ln)
20 	char	*name;
21 	int	ln;
22 {
23 	extern NODE	*head;		/* head of the sorted binary tree */
24 	extern char	*curfile;	/* current input file name */
25 	register NODE	*np;
26 	register char	*fp;
27 	char	nbuf[MAXTOKEN],
28 		*malloc(), *savestr();
29 
30 	/*NOSTRICT*/
31 	if (!(np = (NODE *)malloc(sizeof(NODE)))) {
32 		fputs("ctags: too many entries to sort\n",stderr);
33 		put_entries(head);
34 		free_tree(head);
35 		/*NOSTRICT*/
36 		if (!(head = np = (NODE *)malloc(sizeof(NODE)))) {
37 			fputs("ctags: out of space.\n",stderr);
38 			exit(1);
39 		}
40 	}
41 	if (!xflag && !strcmp(name,"main")) {
42 		if (!(fp = rindex(curfile,'/')))
43 			fp = curfile;
44 		else
45 			++fp;
46 		(void)sprintf(nbuf,"M%s",fp);
47 		fp = rindex(nbuf,'.');
48 		if (fp && !fp[2])
49 			*fp = EOS;
50 		name = nbuf;
51 	}
52 	np->entry = savestr(name);
53 	np->file = curfile;
54 	np->lno = ln;
55 	np->left = np->right = 0;
56 	np->pat = savestr(lbuf);
57 	if (!head)
58 		head = np;
59 	else
60 		add_node(np,head);
61 }
62 
63 add_node(node,cur_node)
64 	register NODE	*node,
65 			*cur_node;
66 {
67 	extern int	wflag;			/* -w: suppress warnings */
68 	register int	dif;
69 
70 	dif = strcmp(node->entry,cur_node->entry);
71 	if (!dif) {
72 		if (node->file == cur_node->file) {
73 			if (!wflag)
74 				fprintf(stderr,"Duplicate entry in file %s, line %d: %s\nSecond entry ignored\n",node->file,lineno,node->entry);
75 			return;
76 		}
77 		if (!cur_node->been_warned)
78 			if (!wflag)
79 				fprintf(stderr,"Duplicate entry in files %s and %s: %s (Warning only)\n",node->file,cur_node->file,node->entry);
80 		cur_node->been_warned = YES;
81 	}
82 	else if (dif < 0)
83 		if (cur_node->left)
84 			add_node(node,cur_node->left);
85 		else
86 			cur_node->left = node;
87 	else if (cur_node->right)
88 		add_node(node,cur_node->right);
89 	else
90 		cur_node->right = node;
91 }
92 
93 free_tree(node)
94 	register NODE	*node;
95 {
96 	while (node) {
97 		if (node->right)
98 			free_tree(node->right);
99 		cfree(node);
100 		node = node->left;
101 	}
102 }
103