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