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[] = "@(#)tree.c 8.3 (Berkeley) 04/02/94";
10 #endif /* not lint */
11
12 #include <err.h>
13 #include <limits.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17
18 #include "ctags.h"
19
20 static void add_node __P((NODE *, NODE *));
21 static void free_tree __P((NODE *));
22
23 /*
24 * pfnote --
25 * enter a new node in the tree
26 */
27 void
pfnote(name,ln)28 pfnote(name, ln)
29 char *name;
30 int ln;
31 {
32 NODE *np;
33 char *fp;
34 char nbuf[MAXTOKEN];
35
36 /*NOSTRICT*/
37 if (!(np = (NODE *)malloc(sizeof(NODE)))) {
38 warnx("too many entries to sort");
39 put_entries(head);
40 free_tree(head);
41 /*NOSTRICT*/
42 if (!(head = np = (NODE *)malloc(sizeof(NODE))))
43 err(1, "out of space");
44 }
45 if (!xflag && !strcmp(name, "main")) {
46 if (!(fp = strrchr(curfile, '/')))
47 fp = curfile;
48 else
49 ++fp;
50 (void)sprintf(nbuf, "M%s", fp);
51 fp = strrchr(nbuf, '.');
52 if (fp && !fp[2])
53 *fp = EOS;
54 name = nbuf;
55 }
56 if (!(np->entry = strdup(name)))
57 err(1, NULL);
58 np->file = curfile;
59 np->lno = ln;
60 np->left = np->right = 0;
61 if (!(np->pat = strdup(lbuf)))
62 err(1, NULL);
63 if (!head)
64 head = np;
65 else
66 add_node(np, head);
67 }
68
69 static void
add_node(node,cur_node)70 add_node(node, cur_node)
71 NODE *node,
72 *cur_node;
73 {
74 int dif;
75
76 dif = strcmp(node->entry, cur_node->entry);
77 if (!dif) {
78 if (node->file == cur_node->file) {
79 if (!wflag)
80 fprintf(stderr, "Duplicate entry in file %s, line %d: %s\nSecond entry ignored\n", node->file, lineno, node->entry);
81 return;
82 }
83 if (!cur_node->been_warned)
84 if (!wflag)
85 fprintf(stderr, "Duplicate entry in files %s and %s: %s (Warning only)\n", node->file, cur_node->file, node->entry);
86 cur_node->been_warned = YES;
87 }
88 else if (dif < 0)
89 if (cur_node->left)
90 add_node(node, cur_node->left);
91 else
92 cur_node->left = node;
93 else if (cur_node->right)
94 add_node(node, cur_node->right);
95 else
96 cur_node->right = node;
97 }
98
99 static void
free_tree(node)100 free_tree(node)
101 NODE *node;
102 {
103 while (node) {
104 if (node->right)
105 free_tree(node->right);
106 free(node);
107 node = node->left;
108 }
109 }
110