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