Commit | Line | Data |
---|---|---|
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 | 9 | static 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 | */ | |
22 | pfnote(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 | ||
71 | add_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 | ||
101 | free_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 | } |