386BSD 0.1 development
[unix-history] / usr / othersrc / public / less-177 / tags.c
CommitLineData
89edd2cf
WJ
1#include <stdio.h>
2#include "less.h"
3
4#define WHITESP(c) ((c)==' ' || (c)=='\t')
5
6#if TAGS
7
8public char *tagfile;
9public char *tagpattern;
10
11public char *tags = "tags";
12
13extern int linenums;
14extern int sigs;
15extern int jump_sline;
16
17/*
18 * Find a tag in the "tags" file.
19 * Sets "tagfile" to the name of the file containing the tag,
20 * and "tagpattern" to the search pattern which should be used
21 * to find the tag.
22 */
23 public void
24findtag(tag)
25 register char *tag;
26{
27 register char *p;
28 register FILE *f;
29 register int taglen;
30 int search_char;
31 static char tline[200];
32
33 if ((f = fopen(tags, "r")) == NULL)
34 {
35 error("No tags file", NULL_PARG);
36 tagfile = NULL;
37 return;
38 }
39
40 taglen = strlen(tag);
41
42 /*
43 * Search the tags file for the desired tag.
44 */
45 while (fgets(tline, sizeof(tline), f) != NULL)
46 {
47 if (strncmp(tag, tline, taglen) != 0 || !WHITESP(tline[taglen]))
48 continue;
49
50 /*
51 * Found it.
52 * The line contains the tag, the filename and the
53 * pattern, separated by white space.
54 * The pattern is surrounded by a pair of identical
55 * search characters.
56 * Parse the line and extract these parts.
57 */
58 tagfile = tagpattern = NULL;
59
60 /*
61 * Skip over the whitespace after the tag name.
62 */
63 for (p = tline; !WHITESP(*p) && *p != '\0'; p++)
64 continue;
65 while (WHITESP(*p))
66 p++;
67 if (*p == '\0')
68 /* File name is missing! */
69 continue;
70
71 /*
72 * Save the file name.
73 * Skip over the whitespace after the file name.
74 */
75 tagfile = p;
76 while (!WHITESP(*p) && *p != '\0')
77 p++;
78 *p++ = '\0';
79 while (WHITESP(*p))
80 p++;
81 if (*p == '\0')
82 /* Pattern is missing! */
83 continue;
84
85 /*
86 * Save the pattern.
87 * Skip to the end of the pattern.
88 * Delete the initial "^" and the final "$" from the pattern.
89 */
90 search_char = *p++;
91 if (*p == '^')
92 p++;
93 tagpattern = p;
94 while (*p != search_char && *p != '\0')
95 p++;
96 if (p[-1] == '$')
97 p--;
98 *p = '\0';
99
100 fclose(f);
101 return;
102 }
103 fclose(f);
104 error("No such tag in tags file", NULL_PARG);
105 tagfile = NULL;
106}
107
108/*
109 * Search for a tag.
110 * This is a stripped-down version of search().
111 * We don't use search() for several reasons:
112 * - We don't want to blow away any search string we may have saved.
113 * - The various regular-expression functions (from different systems:
114 * regcmp vs. re_comp) behave differently in the presence of
115 * parentheses (which are almost always found in a tag).
116 */
117 public int
118tagsearch()
119{
120 POSITION pos, linepos;
121 int linenum;
122 char *line;
123
124 pos = ch_zero();
125 linenum = find_linenum(pos);
126
127 for (;;)
128 {
129 /*
130 * Get lines until we find a matching one or
131 * until we hit end-of-file.
132 */
133 if (sigs)
134 return (1);
135
136 /*
137 * Read the next line, and save the
138 * starting position of that line in linepos.
139 */
140 linepos = pos;
141 pos = forw_raw_line(pos, &line);
142 if (linenum != 0)
143 linenum++;
144
145 if (pos == NULL_POSITION)
146 {
147 /*
148 * We hit EOF without a match.
149 */
150 error("Tag not found", NULL_PARG);
151 return (1);
152 }
153
154 /*
155 * If we're using line numbers, we might as well
156 * remember the information we have now (the position
157 * and line number of the current line).
158 */
159 if (linenums)
160 add_lnum(linenum, pos);
161
162 /*
163 * Test the line to see if we have a match.
164 * Use strncmp because the pattern may be
165 * truncated (in the tags file) if it is too long.
166 */
167 if (strncmp(tagpattern, line, strlen(tagpattern)) == 0)
168 break;
169 }
170
171 jump_loc(linepos, jump_sline);
172 return (0);
173}
174
175#endif