Mercurial > emacs
annotate lib-src/etags.c @ 4824:eaf67474339b
(Fminibuffer_complete_word): GCPRO1 `completion' during calls to
Ftry_completion.
(read_minibuf): Rewrite change of Sep 14. Save the return value on
the history list provided in the form that the value is returned, iff
the value is not equal to the front of the history list.
(Fread_no_blanks_input): Change DEFUN to allow 2nd arg to be optional.
The code was already written correctly.
author | Brian Fox <bfox@gnu.org> |
---|---|
date | Tue, 05 Oct 1993 01:46:45 +0000 |
parents | 810826b6e19a |
children | 7b1e944f583a |
rev | line source |
---|---|
240 | 1 /* Tags file maker to go with GNU Emacs |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
2 Copyright (C) 1984, 1987, 1988, 1989, 1993 Free Software Foundation, Inc. and Ken Arnold |
240 | 3 |
2932
b68f975d505a
Change permission notice (not "part of Emacs").
Richard M. Stallman <rms@gnu.org>
parents:
2911
diff
changeset
|
4 This file is not considered part of GNU Emacs. |
240 | 5 |
2932
b68f975d505a
Change permission notice (not "part of Emacs").
Richard M. Stallman <rms@gnu.org>
parents:
2911
diff
changeset
|
6 This program is free software; you can redistribute it and/or modify |
240 | 7 it under the terms of the GNU General Public License as published by |
2932
b68f975d505a
Change permission notice (not "part of Emacs").
Richard M. Stallman <rms@gnu.org>
parents:
2911
diff
changeset
|
8 the Free Software Foundation; either version 2 of the License, or |
b68f975d505a
Change permission notice (not "part of Emacs").
Richard M. Stallman <rms@gnu.org>
parents:
2911
diff
changeset
|
9 (at your option) any later version. |
240 | 10 |
2932
b68f975d505a
Change permission notice (not "part of Emacs").
Richard M. Stallman <rms@gnu.org>
parents:
2911
diff
changeset
|
11 This program is distributed in the hope that it will be useful, |
240 | 12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
2932
b68f975d505a
Change permission notice (not "part of Emacs").
Richard M. Stallman <rms@gnu.org>
parents:
2911
diff
changeset
|
17 along with this program; if not, write to the Free Software |
b68f975d505a
Change permission notice (not "part of Emacs").
Richard M. Stallman <rms@gnu.org>
parents:
2911
diff
changeset
|
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
240 | 19 |
20 /* | |
21 * Authors: | |
22 * Ctags originally by Ken Arnold. | |
23 * FORTRAN added by Jim Kleckner. | |
24 * Ed Pelegri-Llopart added C typedefs. | |
25 * Gnu Emacs TAGS format and modifications by RMS? | |
26 * Sam Kendall added C++. | |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
27 * |
4804
810826b6e19a
* etags.c (process_file): dead code removed.
Francesco Potortì <pot@gnu.org>
parents:
4750
diff
changeset
|
28 * Francesco Potorti` (pot@cnuce.cnr.it) is the current maintainer. 9.4 |
240 | 29 */ |
30 | |
4052
9535e8ffb209
* etags.c (alloca): removed all references to it.
Jim Blandy <jimb@redhat.com>
parents:
4051
diff
changeset
|
31 #ifdef HAVE_CONFIG_H |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4663
diff
changeset
|
32 #include <../src/config.h> |
3208
daf2762a353c
* etags.c: Replace the CPP tangle for alloca with the one from the
Jim Blandy <jimb@redhat.com>
parents:
3099
diff
changeset
|
33 #endif |
401 | 34 |
3921
e5e5b3634dd0
* etags.c: #include "config.h" and the alloca CPP tangle before
Jim Blandy <jimb@redhat.com>
parents:
3838
diff
changeset
|
35 #include <stdio.h> |
e5e5b3634dd0
* etags.c: #include "config.h" and the alloca CPP tangle before
Jim Blandy <jimb@redhat.com>
parents:
3838
diff
changeset
|
36 #include <ctype.h> |
e5e5b3634dd0
* etags.c: #include "config.h" and the alloca CPP tangle before
Jim Blandy <jimb@redhat.com>
parents:
3838
diff
changeset
|
37 #include <sys/types.h> |
e5e5b3634dd0
* etags.c: #include "config.h" and the alloca CPP tangle before
Jim Blandy <jimb@redhat.com>
parents:
3838
diff
changeset
|
38 #include <sys/stat.h> |
e5e5b3634dd0
* etags.c: #include "config.h" and the alloca CPP tangle before
Jim Blandy <jimb@redhat.com>
parents:
3838
diff
changeset
|
39 |
4804
810826b6e19a
* etags.c (process_file): dead code removed.
Francesco Potortì <pot@gnu.org>
parents:
4750
diff
changeset
|
40 #if !defined (S_ISREG) && defined (S_IFREG) |
810826b6e19a
* etags.c (process_file): dead code removed.
Francesco Potortì <pot@gnu.org>
parents:
4750
diff
changeset
|
41 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) |
810826b6e19a
* etags.c (process_file): dead code removed.
Francesco Potortì <pot@gnu.org>
parents:
4750
diff
changeset
|
42 #endif |
810826b6e19a
* etags.c (process_file): dead code removed.
Francesco Potortì <pot@gnu.org>
parents:
4750
diff
changeset
|
43 |
3921
e5e5b3634dd0
* etags.c: #include "config.h" and the alloca CPP tangle before
Jim Blandy <jimb@redhat.com>
parents:
3838
diff
changeset
|
44 #include "getopt.h" |
e5e5b3634dd0
* etags.c: #include "config.h" and the alloca CPP tangle before
Jim Blandy <jimb@redhat.com>
parents:
3838
diff
changeset
|
45 |
240 | 46 extern char *malloc (), *realloc (); |
47 extern char *getenv (); | |
48 extern char *strcpy (), *strncpy (); | |
49 extern int strcmp (); | |
50 | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
51 char *etags_index (), *etags_rindex (); |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
52 char *savenstr (); |
240 | 53 |
54 /* Define the symbol ETAGS to make the program "etags", | |
55 which makes emacs-style tag tables by default. | |
56 Define CTAGS to make the program "ctags" compatible with the usual one. | |
57 Define neither one to get behavior that depends | |
58 on the name with which the program is invoked | |
59 (but we don't normally compile it that way). */ | |
60 | |
61 #if !defined(ETAGS) && !defined(CTAGS) | |
62 /* If neither is defined, program can be run as either. */ | |
63 #define ETAGS | |
64 #define CTAGS | |
65 #endif | |
66 | |
67 /* On VMS, CTAGS is not useful, so always do ETAGS. */ | |
68 #ifdef VMS | |
69 #ifndef ETAGS | |
70 #define ETAGS | |
71 #endif | |
72 #endif | |
73 | |
74 /* Exit codes for success and failure. */ | |
75 #ifdef VMS | |
76 #define GOOD (1) | |
77 #define BAD (0) | |
78 #else | |
79 #define GOOD (0) | |
80 #define BAD (1) | |
81 #endif | |
82 | |
83 /* | |
84 * The FILEPOS abstract type, which represents a position in a file, | |
85 * plus the following accessor functions: | |
86 * | |
87 * long GET_CHARNO (pos) | |
88 * returns absolute char number. | |
89 * void SET_FILEPOS (pos, fp, charno) | |
90 * FILE *fp; long charno; | |
91 * sets `pos' from the current file | |
92 * position of `fp' and from `charno', | |
93 * which must be the absolute character | |
94 * number corresponding to the current | |
95 * position of `fp'. | |
96 * | |
97 * The `pos' parameter is an lvalue expression of type FILEPOS. | |
98 * Parameters to the accessor functions are evaluated 0 or more times, | |
99 * and so must have no side effects. | |
100 * | |
101 * FILEPOS objects can also be assigned and passed to and from | |
102 * functions in the normal C manner. | |
103 * | |
104 * Implementation notes: the `+ 0' is to enforce rvalue-ness. | |
105 */ | |
106 | |
107 #ifndef DEBUG | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
108 /* real implementation */ |
240 | 109 typedef long FILEPOS; |
110 #define GET_CHARNO(pos) ((pos) + 0) | |
111 #define SET_FILEPOS(pos, fp, cno) ((void) ((pos) = (cno))) | |
112 #else | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
113 /* debugging implementation */ |
240 | 114 typedef struct |
115 { | |
116 long charno; | |
117 } FILEPOS; | |
118 | |
119 #define GET_CHARNO(pos) ((pos).charno + 0) | |
120 #define SET_FILEPOS(pos, fp, cno) \ | |
121 ((void) ((pos).charno = (cno), \ | |
122 (cno) != ftell (fp) ? (error ("SET_FILEPOS inconsistency"), 0) \ | |
123 : 0)) | |
124 #endif | |
125 | |
126 #define streq(s, t) (strcmp (s, t) == 0) | |
127 #define strneq(s, t, n) (strncmp (s, t, n) == 0) | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
128 #define logical int |
240 | 129 |
130 #define TRUE 1 | |
131 #define FALSE 0 | |
132 | |
133 #define iswhite(arg) (_wht[arg]) /* T if char is white */ | |
134 #define begtoken(arg) (_btk[arg]) /* T if char can start token */ | |
135 #define intoken(arg) (_itk[arg]) /* T if char can be in token */ | |
136 #define endtoken(arg) (_etk[arg]) /* T if char ends tokens */ | |
137 | |
138 #define max(I1,I2) ((I1) > (I2) ? (I1) : (I2)) | |
139 | |
140 struct nd_st | |
141 { /* sorting structure */ | |
142 char *name; /* function or type name */ | |
143 char *file; /* file name */ | |
144 logical is_func; /* use pattern or line no */ | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
145 logical named; /* list name separately */ |
240 | 146 logical been_warned; /* set if noticed dup */ |
147 int lno; /* line number tag is on */ | |
148 long cno; /* character number line starts on */ | |
149 char *pat; /* search pattern */ | |
150 struct nd_st *left, *right; /* left and right sons */ | |
151 }; | |
152 | |
153 long ftell (); | |
154 typedef struct nd_st NODE; | |
155 | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
156 logical header_file; /* TRUE if .h file, FALSE o.w. */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
157 /* boolean "functions" (see init) */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
158 logical _wht[0177], _etk[0177], _itk[0177], _btk[0177]; |
240 | 159 |
160 | |
161 char *concat (); | |
162 char *savenstr (); | |
163 char *savestr (); | |
164 char *xmalloc (); | |
165 char *xrealloc (); | |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
166 int L_isdef (), L_isquote (); |
240 | 167 int PF_funcs (); |
168 int total_size_of_entries (); | |
169 logical consider_token (); | |
170 logical tail (); | |
171 long readline (); | |
172 void Asm_funcs (); | |
173 void C_entries (); | |
174 void L_funcs (); | |
175 void L_getit (); | |
176 void PAS_funcs (); | |
177 void Scheme_funcs (); | |
178 void TEX_funcs (); | |
179 void add_node (); | |
180 void error (); | |
181 void fatal (); | |
182 void find_entries (); | |
183 void free_tree (); | |
184 void getit (); | |
185 void getline (); | |
186 void init (); | |
187 void initbuffer (); | |
188 void initbuffer (); | |
189 void pfnote (); | |
190 void process_file (); | |
191 void put_entries (); | |
192 void takeprec (); | |
193 | |
194 /* | |
195 * MACRO | |
196 * xnew -- allocate storage | |
197 * | |
198 * SYNOPSIS | |
199 * Type *xnew (int n, Type); | |
200 */ | |
201 #define xnew(n, Type) ((Type *) xmalloc ((n) * sizeof (Type))) | |
202 | |
203 | |
204 | |
205 /* | |
206 * Symbol table stuff. | |
207 * | |
208 * Should probably be implemented with hash table; linked list for now. | |
209 */ | |
210 | |
211 enum sym_type | |
212 { | |
213 st_none, st_C_struct, st_C_enum, st_C_define, st_C_typedef, st_C_typespec | |
214 }; | |
215 | |
216 struct stab_entry | |
217 { | |
218 char *sym; | |
219 int symlen; | |
220 enum sym_type type; | |
221 struct stab_entry *next; | |
222 }; | |
223 | |
224 typedef struct stab_entry Stab_entry; | |
225 typedef Stab_entry *Stab; | |
226 | |
227 /* | |
228 * NAME | |
229 * Stab, Stab_entry, stab_create, stab_search, stab_find -- symbol table | |
230 * | |
231 * SYNOPSIS | |
232 * Types: Stab, Stab_entry, enum sym_type | |
233 * | |
234 * Stab * stab_create () | |
235 * | |
236 * Stab_entry * stab_find (stab, sym) | |
237 * Stab *stab; | |
238 * char *sym; | |
239 * | |
240 * Stab_entry * stab_search (stab, sym) | |
241 * Stab *stab; | |
242 * char *sym; | |
243 * | |
244 * DESCRIPTION | |
245 * stab_create creates a Stab, a symbol table object, and returns a | |
246 * pointer to it. stab_find finds a symbol in a Stab; it returns a | |
247 * pointer to the Stab_entry if found, otherwise NULL. stab_search | |
248 * is like stab_find, except that it creates a new Stab_entry, | |
249 * initialized with type = st_none, if one did not exist already | |
250 * (it never returns NULL). | |
251 * | |
252 * A Stab_entry is a structure that contains at least the following | |
253 * members: | |
254 * | |
255 * char *name; // must not be modified | |
256 * enum sym_type type; // should be set | |
257 * | |
258 * The type field is initially set to st_none; it should be set to | |
259 * something else by the caller of stab_search. Other possible values | |
260 * of an enum sym_type can be added. | |
261 */ | |
262 | |
263 Stab * | |
264 stab_create () | |
265 { | |
266 Stab *sp; | |
267 sp = xnew (1, Stab); | |
268 *sp = NULL; /* a Stab starts out as a null Stab_entry* */ | |
269 return sp; | |
270 } | |
271 | |
272 Stab_entry * | |
273 stab_find (stab, sym, symlen) | |
274 Stab *stab; | |
275 register char *sym; | |
276 register int symlen; | |
277 { | |
278 register Stab_entry *se; | |
279 for (se = *stab; se != NULL; se = se->next) | |
280 { | |
281 if (se->symlen == symlen && strneq (se->sym, sym, symlen)) | |
282 return se; | |
283 } | |
284 | |
285 return NULL; | |
286 } | |
287 | |
288 Stab_entry * | |
289 stab_search (stab, sym, symlen) | |
290 register Stab *stab; | |
291 char *sym; | |
292 int symlen; | |
293 { | |
294 register Stab_entry *se; | |
295 se = stab_find (stab, sym, symlen); | |
296 | |
297 if (se == NULL) | |
298 { | |
299 /* make a new one */ | |
300 se = xnew (1, Stab_entry); | |
301 se->sym = savenstr (sym, symlen); | |
302 se->symlen = symlen; | |
303 se->type = st_none; | |
304 se->next = *stab; | |
305 *stab = se; | |
306 } | |
307 | |
308 return se; | |
309 } | |
310 | |
311 /* | |
312 * NAME | |
313 * stab_type -- type of a symbol table entry | |
314 * | |
315 * SYNOPSIS | |
316 * enum sym_type stab_type (Stab_entry *se); | |
317 * | |
318 * WARNING | |
319 * May evaluate its argument more than once. | |
320 */ | |
321 | |
322 #define stab_type(se) ((se)==NULL ? st_none : (se)->type) | |
323 | |
324 | |
325 | |
326 typedef int LINENO; | |
327 | |
328 typedef struct | |
329 { | |
330 char *p; | |
331 int len; | |
332 LINENO lineno; | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
333 logical named; |
240 | 334 } TOKEN; |
335 | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
336 /* C extensions. |
240 | 337 */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
338 #define C_PLPL 0x00001 /* C++ */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
339 #define C_STAR 0x00003 /* C* */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
340 #define YACC 0x10000 /* yacc file */ |
240 | 341 |
342 char searchar = '/'; /* use /.../ searches */ | |
343 | |
344 LINENO lineno; /* line number of current line */ | |
345 long charno; /* current character number */ | |
346 | |
347 long linecharno; /* charno of start of line; not used by C, but | |
348 * by every other language. | |
349 */ | |
350 | |
351 char *curfile, /* current input file name */ | |
352 *outfile, /* output file */ | |
353 *white = " \f\t\n", /* white chars */ | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
354 *endtk = " \t\n\"'#()[]{}=-+%*/&|^~!<>;,.:?", /* token ending chars */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
355 /* token starting chars */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
356 *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$", |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
357 /* valid in-token chars */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
358 *intk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789"; |
240 | 359 |
360 int append_to_tagfile; /* -a: append to tags */ | |
361 int emacs_tags_format; /* emacs style output (no -e option any more) */ | |
362 /* The following three default to 1 for etags, but to 0 for ctags. */ | |
363 int typedefs; /* -t: create tags for typedefs */ | |
364 int typedefs_and_cplusplus; /* -T: create tags for typedefs, level */ | |
365 /* 0 struct/enum/union decls, and C++ */ | |
366 /* member functions */ | |
367 int constantypedefs; /* -d: create tags for C #define and enum */ | |
368 /* constants. Default under etags. Enum */ | |
369 /* constants not implemented. */ | |
370 /* -D: opposite of -d. Default under ctags. */ | |
371 int update; /* -u: update tags */ | |
372 int vgrind_style; /* -v: create vgrind style index output */ | |
373 int no_warnings; /* -w: suppress warnings */ | |
374 int cxref_style; /* -x: create cxref style output */ | |
375 int cplusplus; /* .[hc] means C++, not C */ | |
376 int noindentypedefs; /* -S: ignore indentation in C */ | |
377 | |
378 /* Name this program was invoked with. */ | |
379 char *progname; | |
380 | |
621 | 381 struct option longopts[] = { |
382 { "append", no_argument, NULL, 'a' }, | |
383 { "backward-search", no_argument, NULL, 'B' }, | |
384 { "c++", no_argument, NULL, 'C' }, | |
385 { "cxref", no_argument, NULL, 'x' }, | |
386 { "defines", no_argument, NULL, 'd' }, | |
387 { "forward-search", no_argument, NULL, 'F' }, | |
388 { "help", no_argument, NULL, 'H' }, | |
389 { "ignore-indentation", no_argument, NULL, 'S' }, | |
390 { "include", required_argument, NULL, 'i' }, | |
391 { "no-defines", no_argument, NULL, 'D' }, | |
392 { "no-warn", no_argument, NULL, 'w' }, | |
393 { "output", required_argument, NULL, 'o' }, | |
394 { "typedefs", no_argument, NULL, 't' }, | |
395 { "typedefs-and-c++", no_argument, NULL, 'T' }, | |
396 { "update", no_argument, NULL, 'u' }, | |
397 { "version", no_argument, NULL, 'V' }, | |
398 { "vgrind", no_argument, NULL, 'v' }, | |
399 { 0 } | |
400 }; | |
401 | |
240 | 402 FILE *inf, /* ioptr for current input file */ |
403 *outf; /* ioptr for tags file */ | |
404 | |
405 NODE *head; /* the head of the binary tree of tags */ | |
406 | |
407 int permit_duplicates = 1; /* Nonzero means allow duplicate tags. */ | |
408 | |
409 /* A `struct linebuffer' is a structure which holds a line of text. | |
410 `readline' reads a line from a stream into a linebuffer | |
411 and works regardless of the length of the line. */ | |
412 | |
413 struct linebuffer | |
414 { | |
415 long size; | |
416 char *buffer; | |
417 }; | |
418 | |
419 struct linebuffer lb; /* the current line */ | |
420 struct linebuffer filename_lb; /* used to read in filenames */ | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
421 struct |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
422 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
423 FILEPOS linepos; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
424 struct linebuffer lb; /* used by C_entries instead of lb */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
425 } lbs[2]; |
240 | 426 |
427 void | |
621 | 428 print_version () |
429 { | |
430 #ifdef CTAGS | |
431 printf ("CTAGS "); | |
432 #ifdef ETAGS | |
433 printf ("and "); | |
434 #endif | |
435 #endif | |
436 #ifdef ETAGS | |
437 printf ("ETAGS "); | |
438 #endif | |
439 printf ("for Emacs version 19.0.\n"); | |
440 | |
441 exit (0); | |
442 } | |
443 | |
444 void | |
445 print_help () | |
446 { | |
447 printf ("These are the options accepted by %s. You may use unambiguous\n\ | |
448 abbreviations for the long option names.\n\n", progname); | |
449 | |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
450 puts ("-a, --append\n\ |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
451 Append tag entries to existing tags file."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
452 puts ("-C, --c++\n\ |
621 | 453 Treat files with `.c' and `.h' extensions as C++ code, not C\n\ |
454 code. Files with `.C', `.H', `.cxx', `.hxx', or `.cc'\n\ | |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
455 extensions are always assumed to be C++ code."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
456 fputs ("-d, --defines\n\ |
621 | 457 Create tag entries for #defines, too.", stdout); |
458 | |
459 #ifdef ETAGS | |
460 fputs (" This is the default\n\ | |
461 behavior.", stdout); | |
462 #endif | |
463 | |
464 fputs ("\n\ | |
465 -D, --no-defines\n\ | |
466 Don't create tag entries for #defines.", stdout); | |
467 | |
468 #ifdef CTAGS | |
469 fputs (" This is the default\n\ | |
470 behavior.", stdout); | |
471 #endif | |
472 | |
473 puts ("\n\ | |
474 -o FILE, --output=FILE\n\ | |
475 Write the tags to FILE.\n\ | |
476 -S, --ignore-indentation\n\ | |
477 Don't rely on indentation quite as much as normal. Currently,\n\ | |
478 this means not to assume that a closing brace in the first\n\ | |
479 column is the final brace of a function or structure\n\ | |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
480 definition."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
481 puts ("-t, --typedefs\n\ |
621 | 482 Generate tag entries for typedefs. This is the default\n\ |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
483 behavior."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
484 puts ("-T, --typedefs-and-c++\n\ |
621 | 485 Generate tag entries for typedefs, struct/enum/union tags, and\n\ |
486 C++ member functions."); | |
487 | |
488 #ifdef ETAGS | |
489 puts ("-i FILE, --include=FILE\n\ | |
490 Include a note in tag file indicating that, when searching for\n\ | |
491 a tag, one should also consult the tags file FILE after\n\ | |
492 checking the current file."); | |
493 #endif | |
494 | |
495 #ifdef CTAGS | |
496 puts ("-B, --backward-search\n\ | |
497 Write the search commands for the tag entries using '?', the\n\ | |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
498 backward-search command."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
499 puts ("-F, --forward-search\n\ |
621 | 500 Write the search commands for the tag entries using '/', the\n\ |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
501 forward-search command."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
502 puts ("-u, --update\n\ |
621 | 503 Update the tag entries for the given files, leaving tag\n\ |
504 entries for other files in place. Currently, this is\n\ | |
505 implemented by deleting the existing entries for the given\n\ | |
506 files and then rewriting the new entries at the end of the\n\ | |
507 tags file. It is often faster to simply rebuild the entire\n\ | |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
508 tag file than to use this."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
509 puts ("-v, --vgrind\n\ |
621 | 510 Generates an index of items intended for human consumption,\n\ |
511 similar to the output of vgrind. The index is sorted, and\n\ | |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
512 gives the page number of each item."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
513 puts ("-x, --cxref\n\ |
621 | 514 Like --vgrind, but in the style of cxref, rather than vgrind.\n\ |
515 The output uses line numbers instead of page numbers, but\n\ | |
516 beyond that the differences are cosmetic; try both to see\n\ | |
4126
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
517 which you like."); |
9a906e5f9b28
* etags.c (print_help): Break up the very long strings containing
Jim Blandy <jimb@redhat.com>
parents:
4052
diff
changeset
|
518 puts ("-w, --no-warn\n\ |
621 | 519 Suppress warning messages about entries defined in multiple\n\ |
520 files."); | |
521 #endif | |
522 | |
523 puts ("-V, --version\n\ | |
524 Print the version of the program.\n\ | |
525 -H, --help\n\ | |
526 Print this help message."); | |
527 | |
528 exit (0); | |
529 } | |
530 | |
531 | |
532 void | |
240 | 533 main (argc, argv) |
534 int argc; | |
535 char *argv[]; | |
536 { | |
537 char cmd[100]; | |
538 int i; | |
401 | 539 unsigned int nincluded_files = 0; |
4052
9535e8ffb209
* etags.c (alloca): removed all references to it.
Jim Blandy <jimb@redhat.com>
parents:
4051
diff
changeset
|
540 char **included_files = xnew (argc, char *); |
240 | 541 char *this_file; |
542 #ifdef VMS | |
543 char got_err; | |
544 | |
545 extern char *gfnames (); | |
546 extern char *massage_name (); | |
547 #endif | |
548 | |
549 progname = argv[0]; | |
550 | |
551 #ifndef CTAGS | |
552 emacs_tags_format = 1; | |
553 #else | |
554 emacs_tags_format = 0; | |
555 #endif | |
556 | |
557 /* | |
558 * If etags, always find typedefs and structure tags. Why not? | |
559 * Also default is to find macro constants. | |
560 */ | |
561 if (emacs_tags_format) | |
562 typedefs = typedefs_and_cplusplus = constantypedefs = 1; | |
563 | |
621 | 564 for (;;) |
240 | 565 { |
621 | 566 int opt; |
3662
edba0072c7ef
Reinstate old -f option as an alias for -o for installed base uses.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
567 opt = getopt_long (argc, argv, "aCdDo:f:StTi:BFuvxwVH", longopts, 0); |
621 | 568 |
569 if (opt == EOF) | |
570 break; | |
571 | |
572 switch (opt) | |
240 | 573 { |
621 | 574 case '\0': |
575 /* If getopt returns '\0', then it has already processed a | |
576 long-named option. We should do nothing. */ | |
577 break; | |
240 | 578 |
621 | 579 /* Common options. */ |
580 case 'a': | |
581 append_to_tagfile++; | |
582 break; | |
583 case 'C': | |
584 cplusplus = 1; | |
585 break; | |
586 case 'd': | |
587 constantypedefs = 1; | |
588 break; | |
589 case 'D': | |
590 constantypedefs = 0; | |
591 break; | |
3662
edba0072c7ef
Reinstate old -f option as an alias for -o for installed base uses.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
592 case 'f': |
621 | 593 case 'o': |
594 if (outfile) | |
595 { | |
596 fprintf (stderr, | |
3662
edba0072c7ef
Reinstate old -f option as an alias for -o for installed base uses.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
597 "%s: -%c flag may only be given once\n", progname, opt); |
240 | 598 goto usage; |
599 } | |
621 | 600 outfile = optarg; |
601 break; | |
602 case 'S': | |
603 noindentypedefs++; | |
604 break; | |
605 case 't': | |
606 typedefs++; | |
607 break; | |
608 case 'T': | |
609 typedefs++; | |
610 typedefs_and_cplusplus++; | |
611 break; | |
612 case 'V': | |
613 print_version (); | |
614 break; | |
615 case 'H': | |
616 print_help (); | |
617 break; | |
618 | |
619 /* Etags options */ | |
620 case 'i': | |
621 if (!emacs_tags_format) | |
622 goto usage; | |
623 included_files[nincluded_files++] = optarg; | |
624 break; | |
625 | |
626 /* Ctags options. */ | |
627 case 'B': | |
628 searchar = '?'; | |
629 if (emacs_tags_format) | |
630 goto usage; | |
631 break; | |
632 case 'F': | |
633 searchar = '/'; | |
634 if (emacs_tags_format) | |
635 goto usage; | |
636 break; | |
637 case 'u': | |
638 update++; | |
639 if (emacs_tags_format) | |
640 goto usage; | |
641 break; | |
642 case 'v': | |
643 vgrind_style++; | |
644 /*FALLTHRU*/ | |
645 case 'x': | |
646 cxref_style++; | |
647 if (emacs_tags_format) | |
648 goto usage; | |
649 break; | |
650 case 'w': | |
651 no_warnings++; | |
652 if (emacs_tags_format) | |
653 goto usage; | |
654 break; | |
655 | |
656 default: | |
657 goto usage; | |
240 | 658 } |
659 } | |
660 | |
2759
1c7b7ed1a12a
(main): Don't require that there be input files if -i switches were given.
Roland McGrath <roland@gnu.org>
parents:
2323
diff
changeset
|
661 if (optind == argc && nincluded_files == 0) |
240 | 662 { |
621 | 663 fprintf (stderr, "%s: No input files specified.\n", progname); |
664 | |
240 | 665 usage: |
2759
1c7b7ed1a12a
(main): Don't require that there be input files if -i switches were given.
Roland McGrath <roland@gnu.org>
parents:
2323
diff
changeset
|
666 fprintf (stderr, "%s: Try `%s --help' for a complete list of options.\n", |
621 | 667 progname, progname); |
240 | 668 exit (BAD); |
669 } | |
670 | |
671 if (outfile == 0) | |
672 { | |
673 outfile = emacs_tags_format ? "TAGS" : "tags"; | |
674 } | |
675 | |
676 init (); /* set up boolean "functions" */ | |
677 | |
678 initbuffer (&lb); | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
679 initbuffer (&lbs[0].lb); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
680 initbuffer (&lbs[1].lb); |
240 | 681 initbuffer (&filename_lb); |
682 /* | |
683 * loop through files finding functions | |
684 */ | |
685 if (emacs_tags_format) | |
686 { | |
687 if (streq (outfile, "-")) | |
688 outf = stdout; | |
689 else | |
690 outf = fopen (outfile, append_to_tagfile ? "a" : "w"); | |
691 if (!outf) | |
692 { | |
693 perror (outfile); | |
694 exit (1); | |
695 } | |
696 } | |
697 | |
698 #ifdef VMS | |
621 | 699 argc -= optind; |
700 argv += optind; | |
701 while (gfnames (&argc, &argv, &got_err) != NULL) | |
240 | 702 { |
703 if (got_err) | |
704 { | |
705 error ("Can't find file %s\n", this_file); | |
706 argc--, argv++; | |
707 } | |
708 else | |
709 { | |
710 this_file = massage_name (this_file); | |
711 #if 0 | |
712 } | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
713 } /* solely to balance out the ifdef'd parens above */ |
240 | 714 #endif |
715 #else | |
621 | 716 for (; optind < argc; optind++) |
240 | 717 { |
621 | 718 this_file = argv[optind]; |
240 | 719 if (1) |
720 { | |
721 #endif | |
722 /* Input file named "-" means read file names from stdin | |
723 and use them. */ | |
724 if (streq (this_file, "-")) | |
725 { | |
726 while (!feof (stdin)) | |
727 { | |
728 (void) readline (&filename_lb, stdin); | |
729 if (strlen (filename_lb.buffer) > 0) | |
730 process_file (filename_lb.buffer); | |
731 } | |
732 } | |
733 else | |
734 process_file (this_file); | |
735 } | |
736 } | |
737 | |
738 if (emacs_tags_format) | |
739 { | |
401 | 740 while (nincluded_files-- > 0) |
741 fprintf (outf, "\f\n%s,include\n", *included_files++); | |
742 | |
240 | 743 (void) fclose (outf); |
744 exit (0); | |
745 } | |
746 | |
747 if (cxref_style) | |
748 { | |
749 put_entries (head); | |
750 exit (GOOD); | |
751 } | |
621 | 752 if (update) |
240 | 753 { |
621 | 754 /* update cannot be set under VMS, so we may assume that argc |
755 and argv have not been munged. */ | |
756 for (i = optind; i < argc; i++) | |
240 | 757 { |
758 sprintf (cmd, | |
759 "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS", | |
760 outfile, argv[i], outfile); | |
761 (void) system (cmd); | |
762 } | |
763 append_to_tagfile++; | |
764 } | |
765 outf = fopen (outfile, append_to_tagfile ? "a" : "w"); | |
766 if (outf == NULL) | |
767 { | |
768 perror (outfile); | |
769 exit (GOOD); | |
770 } | |
771 put_entries (head); | |
772 (void) fclose (outf); | |
773 if (update) | |
774 { | |
775 sprintf (cmd, "sort %s -o %s", outfile, outfile); | |
776 (void) system (cmd); | |
777 } | |
778 exit (GOOD); | |
779 } | |
780 | |
781 | |
782 /* | |
783 * This routine is called on each file argument. | |
784 */ | |
785 void | |
786 process_file (file) | |
787 char *file; | |
788 { | |
789 struct stat stat_buf; | |
790 | |
4804
810826b6e19a
* etags.c (process_file): dead code removed.
Francesco Potortì <pot@gnu.org>
parents:
4750
diff
changeset
|
791 if (stat (file, &stat_buf) || !S_ISREG (stat_buf.st_mode)) |
240 | 792 { |
793 fprintf (stderr, "Skipping %s: it is not a regular file.\n", file); | |
794 return; | |
795 } | |
796 | |
797 if (streq (file, outfile) && !streq (outfile, "-")) | |
798 { | |
799 fprintf (stderr, "Skipping inclusion of %s in self.\n", file); | |
800 return; | |
801 } | |
802 find_entries (file); | |
803 if (emacs_tags_format) | |
804 { | |
4804
810826b6e19a
* etags.c (process_file): dead code removed.
Francesco Potortì <pot@gnu.org>
parents:
4750
diff
changeset
|
805 fprintf (outf, "\f\n%s,%d\n", file, total_size_of_entries (head)); |
240 | 806 put_entries (head); |
807 free_tree (head); | |
808 head = NULL; | |
809 } | |
810 } | |
811 | |
812 /* | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3569
diff
changeset
|
813 * This routine sets up the boolean pseudo-functions which work |
2004
6469a137fea6
(C_entries): New local variable quotednl. Used for
Richard M. Stallman <rms@gnu.org>
parents:
1938
diff
changeset
|
814 * by setting boolean flags dependent upon the corresponding character |
240 | 815 * Every char which is NOT in that string is not a white char. Therefore, |
816 * all of the array "_wht" is set to FALSE, and then the elements | |
817 * subscripted by the chars in "white" are set to TRUE. Thus "_wht" | |
818 * of a char is TRUE if it is the string "white", else FALSE. | |
819 */ | |
820 void | |
821 init () | |
822 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
823 register char *sp; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
824 register int i; |
240 | 825 |
826 for (i = 0; i < 0177; i++) | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
827 _wht[i] = _etk[i] = _itk[i] = _btk[i] = FALSE; |
240 | 828 for (sp = white; *sp; sp++) |
829 _wht[*sp] = TRUE; | |
830 for (sp = endtk; *sp; sp++) | |
831 _etk[*sp] = TRUE; | |
832 for (sp = intk; *sp; sp++) | |
833 _itk[*sp] = TRUE; | |
834 for (sp = begtk; *sp; sp++) | |
835 _btk[*sp] = TRUE; | |
836 _wht[0] = _wht['\n']; | |
837 _etk[0] = _etk['\n']; | |
838 _btk[0] = _btk['\n']; | |
839 _itk[0] = _itk['\n']; | |
840 } | |
841 | |
842 /* | |
843 * This routine opens the specified file and calls the function | |
844 * which finds the function and type definitions. | |
845 */ | |
846 void | |
847 find_entries (file) | |
848 char *file; | |
849 { | |
850 char *cp; | |
851 void prolog_funcs (); | |
852 | |
853 inf = fopen (file, "r"); | |
854 if (inf == NULL) | |
855 { | |
856 perror (file); | |
857 return; | |
858 } | |
859 curfile = savestr (file); | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
860 cp = etags_rindex (file, '.'); |
240 | 861 |
862 header_file = (cp && (streq (cp + 1, "h"))); | |
863 | |
864 /* .tex, .aux or .bbl implies LaTeX source code */ | |
865 if (cp && (streq (cp + 1, "tex") || streq (cp + 1, "aux") | |
866 || streq (cp + 1, "bbl"))) | |
867 { | |
868 TEX_funcs (inf); | |
869 goto close_and_return; | |
870 } | |
871 /* .l or .el or .lisp (or .cl or .clisp or ...) implies lisp source code */ | |
872 if (cp && (streq (cp + 1, "l") | |
873 || streq (cp + 1, "el") | |
874 || streq (cp + 1, "lsp") | |
875 || streq (cp + 1, "lisp") | |
876 || streq (cp + 1, "cl") | |
877 || streq (cp + 1, "clisp"))) | |
878 { | |
879 L_funcs (inf); | |
880 goto close_and_return; | |
881 } | |
882 /* .scm or .sm or .scheme or ... implies scheme source code */ | |
883 if (cp && (streq (cp + 1, "sm") | |
884 || streq (cp + 1, "scm") | |
885 || streq (cp + 1, "scheme") | |
886 || streq (cp + 1, "t") | |
887 || streq (cp + 1, "sch") | |
888 || streq (cp + 1, "SM") | |
889 || streq (cp + 1, "SCM") | |
890 /* The `SCM' or `scm' prefix with a version number */ | |
891 || (cp[-1] == 'm' && cp[-2] == 'c' && cp[-3] == 's' | |
892 && string_numeric_p (cp + 1)) | |
893 || (cp[-1] == 'M' && cp[-2] == 'C' && cp[-3] == 'S' | |
894 && string_numeric_p (cp + 1)))) | |
895 { | |
896 Scheme_funcs (inf); | |
897 fclose (inf); | |
898 return; | |
899 } | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
900 /* Assume that ".s" or ".a" is assembly code. -wolfgang. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
901 Or even ".sa". */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
902 if (cp && (streq (cp + 1, "s") |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
903 || streq (cp + 1, "a") |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
904 || streq (cp + 1, "sa"))) |
240 | 905 { |
906 Asm_funcs (inf); | |
907 fclose (inf); | |
908 return; | |
909 } | |
910 /* .C or .H or .cxx or .hxx or .cc: a C++ file */ | |
911 if (cp && (streq (cp + 1, "C") | |
912 || streq (cp + 1, "H") | |
913 || streq (cp + 1, "cxx") | |
914 || streq (cp + 1, "hxx") | |
915 || streq (cp + 1, "cc"))) | |
916 { | |
917 C_entries (C_PLPL); /* C++ */ | |
918 goto close_and_return; | |
919 } | |
920 /* .cs or .hs: a C* file */ | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
921 if (cp && (streq (cp + 1, "cs") |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
922 || streq (cp + 1, "hs"))) |
240 | 923 { |
924 C_entries (C_STAR); | |
925 goto close_and_return; | |
926 } | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
927 /* .y: a yacc file */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
928 if (cp && (streq (cp + 1, "y"))) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
929 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
930 C_entries (YACC); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
931 goto close_and_return; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
932 } |
240 | 933 /* .pl implies prolog source code */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
934 if (cp && streq (cp + 1, "pl")) |
240 | 935 { |
936 prolog_funcs (inf); | |
937 goto close_and_return; | |
938 } | |
939 /* .p or .pas: a Pascal file */ | |
940 if (cp && (streq (cp + 1, "p") | |
941 || streq (cp + 1, "pas"))) | |
942 { | |
943 PAS_funcs (inf); | |
944 goto close_and_return; | |
945 } | |
1796
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
946 /* If .f or .for, assume it is fortran or nothing. */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
947 if (cp && (streq (cp + 1, "f") |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
948 || streq (cp + 1, "for"))) |
1796
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
949 { |
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
950 PF_funcs (inf); |
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
951 goto close_and_return; |
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
952 } |
240 | 953 /* if not a .c or .h or .y file, try fortran */ |
1796
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
954 if (cp && ((cp[1] != 'c' |
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
955 && cp[1] != 'h' |
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
956 && cp[1] != 'y') |
00beac79bcc7
(find_entries): If filename ends in .f or .for, don't try anything but Fortran.
Richard M. Stallman <rms@gnu.org>
parents:
1040
diff
changeset
|
957 || (cp[1] != 0 && cp[2] != 0))) |
240 | 958 { |
959 if (PF_funcs (inf) != 0) | |
960 goto close_and_return; | |
961 rewind (inf); /* no fortran tags found, try C */ | |
962 } | |
963 C_entries (cplusplus ? C_PLPL : 0); | |
964 | |
965 close_and_return: | |
966 (void) fclose (inf); | |
967 } | |
968 | |
969 /* Nonzero if string STR is composed of digits. */ | |
970 | |
971 int | |
972 string_numeric_p (str) | |
973 char *str; | |
974 { | |
975 while (*str) | |
976 { | |
977 if (*str < '0' || *str > '9') | |
978 return 0; | |
979 } | |
980 return 1; | |
981 } | |
982 | |
983 /* Record a tag. */ | |
984 /* Should take a TOKEN* instead!! */ | |
985 void | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
986 pfnote (name, is_func, named, linestart, linelen, lno, cno) |
240 | 987 char *name; /* tag name */ |
988 logical is_func; /* function or type name? */ | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
989 logical named; /* tag different from text of definition? */ |
240 | 990 char *linestart; |
991 int linelen; | |
992 int lno; | |
993 long cno; | |
994 { | |
995 register char *fp; | |
996 register NODE *np; | |
997 char tem[51]; | |
998 char c; | |
999 | |
1000 np = (NODE *) malloc (sizeof (NODE)); | |
1001 if (np == NULL) | |
1002 { | |
1003 if (!emacs_tags_format) | |
1004 { | |
1005 /* It's okay to output early in etags -- it only disrupts the | |
1006 * character count of the tag entries, which is no longer used | |
1007 * by tags.el anyway. | |
1008 */ | |
1009 error ("too many entries to sort"); | |
1010 } | |
1011 put_entries (head); | |
1012 free_tree (head); | |
1013 head = NULL; | |
1014 np = xnew (1, NODE); | |
1015 } | |
1016 /* If ctags mode, change name "main" to M<thisfilename>. */ | |
1017 if (!emacs_tags_format && !cxref_style && streq (name, "main")) | |
1018 { | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
1019 fp = etags_rindex (curfile, '/'); |
240 | 1020 name = concat ("M", fp == 0 ? curfile : fp + 1, ""); |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
1021 fp = etags_rindex (name, '.'); |
240 | 1022 if (fp && fp[1] != '\0' && fp[2] == '\0') |
1023 *fp = 0; | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1024 named = TRUE; |
240 | 1025 } |
1026 np->name = savestr (name); | |
1027 np->file = curfile; | |
1028 np->is_func = is_func; | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1029 np->named = named; |
240 | 1030 np->lno = lno; |
1031 /* UNCOMMENT THE +1 HERE: */ | |
1032 np->cno = cno /* + 1 */ ; /* our char numbers are 0-base; emacs's are 1-base */ | |
1033 np->left = np->right = 0; | |
1034 if (emacs_tags_format) | |
1035 { | |
1036 c = linestart[linelen]; | |
1037 linestart[linelen] = 0; | |
1038 } | |
1039 else if (cxref_style == 0) | |
1040 { | |
1041 sprintf (tem, strlen (linestart) < 50 ? "%s$" : "%.50s", linestart); | |
1042 linestart = tem; | |
1043 } | |
1044 np->pat = savestr (linestart); | |
1045 if (emacs_tags_format) | |
1046 { | |
1047 linestart[linelen] = c; | |
1048 } | |
1049 | |
1050 add_node (np, &head); | |
1051 } | |
1052 | |
1053 /* | |
1054 * free_tree () | |
1055 * recurse on left children, iterate on right children. | |
1056 */ | |
1057 void | |
1058 free_tree (node) | |
1059 register NODE *node; | |
1060 { | |
1061 while (node) | |
1062 { | |
1063 register NODE *node_right = node->right; | |
1064 free_tree (node->left); | |
1065 free (node->name); | |
1066 free (node->pat); | |
1067 free ((char *) node); | |
1068 node = node_right; | |
1069 } | |
1070 } | |
1071 | |
1072 /* | |
1073 * add_node () | |
1074 * Adds a node to the tree of nodes. In etags mode, we don't keep | |
1075 * it sorted; we just keep a linear list. In ctags mode, maintain | |
1076 * an ordered tree, with no attempt at balancing. | |
1077 * | |
1078 * add_node is the only function allowed to add nodes, so it can | |
1079 * maintain state. | |
1080 */ | |
3838
6d8422d99000
(add_node): Move var last_node to file scope.
Richard M. Stallman <rms@gnu.org>
parents:
3662
diff
changeset
|
1081 /* Must avoid static vars within functions since some systems |
6d8422d99000
(add_node): Move var last_node to file scope.
Richard M. Stallman <rms@gnu.org>
parents:
3662
diff
changeset
|
1082 #define static as nothing. */ |
6d8422d99000
(add_node): Move var last_node to file scope.
Richard M. Stallman <rms@gnu.org>
parents:
3662
diff
changeset
|
1083 static NODE *last_node = NULL; |
6d8422d99000
(add_node): Move var last_node to file scope.
Richard M. Stallman <rms@gnu.org>
parents:
3662
diff
changeset
|
1084 |
240 | 1085 void |
1086 add_node (node, cur_node_p) | |
1087 NODE *node, **cur_node_p; | |
1088 { | |
1089 register int dif; | |
1090 register NODE *cur_node = *cur_node_p; | |
1091 | |
1092 if (cur_node == NULL) | |
1093 { | |
1094 *cur_node_p = node; | |
1095 last_node = node; | |
1096 return; | |
1097 } | |
1098 | |
1099 if (emacs_tags_format) | |
1100 { | |
1101 /* Etags Mode */ | |
1102 if (!last_node) | |
1103 fatal ("internal error in add_node"); | |
1104 last_node->right = node; | |
1105 last_node = node; | |
1106 } | |
1107 else | |
1108 { | |
1109 /* Ctags Mode */ | |
1110 dif = strcmp (node->name, cur_node->name); | |
1111 | |
1112 /* | |
1113 * If this tag name matches an existing one, then | |
1114 * do not add the node, but maybe print a warning. | |
1115 */ | |
1116 if (!dif) | |
1117 { | |
1118 if (node->file == cur_node->file) | |
1119 { | |
1120 if (!no_warnings) | |
1121 { | |
1122 fprintf (stderr, "Duplicate entry in file %s, line %d: %s\n", | |
1123 node->file, lineno, node->name); | |
1124 fprintf (stderr, "Second entry ignored\n"); | |
1125 } | |
1126 return; | |
1127 } | |
1128 if (!cur_node->been_warned && !no_warnings) | |
1129 { | |
1130 fprintf (stderr, | |
1131 "Duplicate entry in files %s and %s: %s (Warning only)\n", | |
1132 node->file, cur_node->file, node->name); | |
1133 } | |
1134 cur_node->been_warned = TRUE; | |
1135 return; | |
1136 } | |
1137 | |
1138 /* Maybe refuse to add duplicate nodes. */ | |
1139 if (!permit_duplicates) | |
1140 { | |
1141 if (!strcmp (node->name, cur_node->name) | |
1142 && !strcmp (node->file, cur_node->file)) | |
1143 return; | |
1144 } | |
1145 | |
1146 /* Actually add the node */ | |
1147 add_node (node, dif < 0 ? &cur_node->left : &cur_node->right); | |
1148 } | |
1149 } | |
1150 | |
1151 void | |
1152 put_entries (node) | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1153 register NODE *node; |
240 | 1154 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1155 register char *sp; |
240 | 1156 |
1157 if (node == NULL) | |
1158 return; | |
1159 | |
1160 /* Output subentries that precede this one */ | |
1161 put_entries (node->left); | |
1162 | |
1163 /* Output this entry */ | |
1164 | |
1165 if (emacs_tags_format) | |
1166 { | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1167 if (node->named) |
240 | 1168 { |
1169 fprintf (outf, "%s\177%s\001%d,%d\n", | |
4406
ad13aac8bb60
(put_entries): For NODE->rewritten, put pattern before \177 and name after,
Roland McGrath <roland@gnu.org>
parents:
4126
diff
changeset
|
1170 node->pat, node->name, |
ad13aac8bb60
(put_entries): For NODE->rewritten, put pattern before \177 and name after,
Roland McGrath <roland@gnu.org>
parents:
4126
diff
changeset
|
1171 node->lno, node->cno); |
240 | 1172 } |
1173 else | |
1174 { | |
1175 fprintf (outf, "%s\177%d,%d\n", | |
4406
ad13aac8bb60
(put_entries): For NODE->rewritten, put pattern before \177 and name after,
Roland McGrath <roland@gnu.org>
parents:
4126
diff
changeset
|
1176 node->pat, |
ad13aac8bb60
(put_entries): For NODE->rewritten, put pattern before \177 and name after,
Roland McGrath <roland@gnu.org>
parents:
4126
diff
changeset
|
1177 node->lno, node->cno); |
240 | 1178 } |
1179 } | |
1180 else if (!cxref_style) | |
1181 { | |
1182 fprintf (outf, "%s\t%s\t", | |
1183 node->name, node->file); | |
1184 | |
1185 if (node->is_func) | |
1186 { /* a function */ | |
1187 putc (searchar, outf); | |
1188 putc ('^', outf); | |
1189 | |
1190 for (sp = node->pat; *sp; sp++) | |
1191 { | |
1192 if (*sp == '\\' || *sp == searchar) | |
1193 putc ('\\', outf); | |
1194 putc (*sp, outf); | |
1195 } | |
1196 putc (searchar, outf); | |
1197 } | |
1198 else | |
1199 { /* a typedef; text pattern inadequate */ | |
1200 fprintf (outf, "%d", node->lno); | |
1201 } | |
1202 putc ('\n', outf); | |
1203 } | |
1204 else if (vgrind_style) | |
1205 fprintf (stdout, "%s %s %d\n", | |
1206 node->name, node->file, (node->lno + 63) / 64); | |
1207 else | |
727 | 1208 fprintf (stdout, "%-16s %3d %-16s %s\n", |
240 | 1209 node->name, node->lno, node->file, node->pat); |
1210 | |
1211 /* Output subentries that follow this one */ | |
1212 put_entries (node->right); | |
1213 } | |
1214 | |
1215 /* Length of a number's decimal representation. */ | |
1216 int | |
1217 number_len (num) | |
1218 long num; | |
1219 { | |
1220 int len = 0; | |
1221 if (!num) | |
1222 return 1; | |
1223 for (; num; num /= 10) | |
1224 ++len; | |
1225 return len; | |
1226 } | |
1227 | |
1228 /* | |
1229 * Return total number of characters that put_entries will output for | |
1230 * the nodes in the subtree of the specified node. Works only if emacs_tags_format | |
1231 * is set, but called only in that case. This count is irrelevant with | |
1232 * the new tags.el, but is still supplied for backward compatibility. | |
1233 */ | |
1234 int | |
1235 total_size_of_entries (node) | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1236 register NODE *node; |
240 | 1237 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1238 register int total; |
240 | 1239 |
1240 if (node == NULL) | |
1241 return 0; | |
1242 | |
1243 total = 0; | |
1244 for (; node; node = node->right) | |
1245 { | |
1246 /* Count left subentries. */ | |
1247 total += total_size_of_entries (node->left); | |
1248 | |
1249 /* Count this entry */ | |
1250 total += strlen (node->pat) + 1; | |
1251 total += number_len ((long) node->lno) + 1 + number_len (node->cno) + 1; | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1252 if (node->named) |
240 | 1253 total += 1 + strlen (node->name); /* \001name */ |
1254 } | |
1255 | |
1256 return total; | |
1257 } | |
1258 | |
1259 /* | |
1260 * The C symbol tables. | |
1261 */ | |
1262 | |
1263 Stab *C_stab, *C_PLPL_stab, *C_STAR_stab; | |
1264 | |
1265 /* | |
1266 * SYNOPSIS | |
1267 * Stab *get_C_stab (int c_ext); | |
1268 */ | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1269 #define get_C_stab(c_ext) ((c_ext & C_STAR) ? C_STAR_stab : \ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1270 (c_ext & C_PLPL) ? C_PLPL_stab : \ |
240 | 1271 C_stab) |
1272 | |
1273 void | |
1274 add_keyword (stab, sym, type) | |
1275 Stab *stab; | |
1276 char *sym; | |
1277 enum sym_type type; | |
1278 { | |
1279 stab_search (stab, sym, strlen (sym))->type = type; | |
1280 } | |
1281 | |
1282 Stab * | |
1283 C_create_stab (c_ext) | |
1284 int c_ext; | |
1285 { | |
1286 Stab *stab; | |
1287 | |
1288 stab = stab_create (); | |
1289 | |
1290 /* C, C++ and C* */ | |
1291 if (c_ext & C_PLPL) | |
1292 add_keyword (stab, "class", st_C_struct); | |
1293 if (c_ext & C_STAR) | |
1294 add_keyword (stab, "domain", st_C_struct); | |
1295 add_keyword (stab, "union", st_C_struct); | |
1296 add_keyword (stab, "struct", st_C_struct); | |
1297 add_keyword (stab, "enum", st_C_enum); | |
1298 add_keyword (stab, "typedef", st_C_typedef); | |
1299 add_keyword (stab, "define", st_C_define); | |
1300 add_keyword (stab, "long", st_C_typespec); | |
1301 add_keyword (stab, "short", st_C_typespec); | |
1302 add_keyword (stab, "int", st_C_typespec); | |
1303 add_keyword (stab, "char", st_C_typespec); | |
1304 add_keyword (stab, "float", st_C_typespec); | |
1305 add_keyword (stab, "double", st_C_typespec); | |
1306 add_keyword (stab, "signed", st_C_typespec); | |
1307 add_keyword (stab, "unsigned", st_C_typespec); | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1308 add_keyword (stab, "auto", st_C_typespec); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1309 add_keyword (stab, "void", st_C_typespec); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1310 add_keyword (stab, "extern", st_C_typespec); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1311 add_keyword (stab, "static", st_C_typespec); |
240 | 1312 add_keyword (stab, "const", st_C_typespec); |
1313 add_keyword (stab, "volatile", st_C_typespec); | |
1314 | |
1315 return stab; | |
1316 } | |
1317 | |
1318 void | |
1319 C_create_stabs () | |
1320 { | |
1321 C_stab = C_create_stab (0); | |
1322 C_PLPL_stab = C_create_stab (C_PLPL); | |
1323 C_STAR_stab = C_create_stab (C_STAR | C_PLPL); | |
1324 } | |
1325 | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1326 /* |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1327 * C functions are recognized using a simple finite automaton. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1328 * funcdef is its state variable. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1329 */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1330 typedef enum |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1331 { |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1332 fnone, /* nothing seen */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1333 ftagseen, /* function-like tag seen */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1334 finlist, /* in parameter list */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1335 flistseen, /* after parameter list */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1336 fignore, /* before open brace */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1337 } FUNCST; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1338 FUNCST funcdef; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1339 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1340 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1341 /* typedefs are recognized using a simple finite automaton. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1342 * typeddef is its state variable. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1343 */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1344 typedef enum |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1345 { |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1346 tnone, /* nothing seen */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1347 ttypedseen, /* typedef keyword seen */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1348 tinbody, /* inside typedef body */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1349 tend, /* just before typedef tag */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1350 } TYPEDST; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1351 TYPEDST typdef; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1352 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1353 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1354 /* struct tags for C++ are recognized using another simple |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1355 * finite automaton. `structdef' is its state variable. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1356 * This machinery is only invoked for C++; otherwise structdef |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1357 * should remain snone. However, this machinery can easily be |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1358 * adapted to find structure tags in normal C code. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1359 */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1360 typedef enum |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1361 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1362 snone, /* nothing seen yet */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1363 skeyseen, /* struct-like keyword seen */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1364 stagseen, /* struct-like tag seen */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1365 scolonseen, /* colon seen after struct-like tag */ |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1366 sinbody, /* in struct body: recognize member func defs*/ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1367 } STRUCTST; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1368 STRUCTST structdef; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1369 /* |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1370 * When structdef is stagseen, scolonseen, or sinbody, structtag is the |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1371 * struct tag, and structkey is the preceding struct-like keyword. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1372 */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1373 char structtag[BUFSIZ]; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1374 Stab_entry *structkey; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1375 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1376 /* |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1377 * Yet another little state machine to deal with preprocessor lines. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1378 */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1379 typedef enum |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1380 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1381 dnone, /* nothing seen */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1382 dsharpseen, /* '#' seen as first char on line */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1383 ddefineseen, /* '#' and 'define' seen */ |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1384 dignorerest, /* ignore rest of line */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1385 } DEFINEST; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1386 DEFINEST definedef; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1387 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1388 /* |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1389 * Set this to TRUE, and the next token considered is called a function. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1390 * Used only for GNUmacs's function-defining macros. |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1391 */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1392 logical next_token_is_func; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1393 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1394 /* |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1395 * TRUE in the rules part of a yacc file, FALSE outside (parse as C). |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1396 */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1397 logical yacc_rules; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1398 |
240 | 1399 /* |
1400 * C_entries () | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1401 * This routine finds functions, typedefs, #define's and |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1402 * struct/union/enum definitions in C syntax and adds them |
240 | 1403 * to the list. |
1404 */ | |
1405 | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1406 #define curlb (lbs[curndx].lb) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1407 #define othlb (lbs[1-curndx].lb) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1408 #define newlb (lbs[newndx].lb) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1409 #define curlinepos (lbs[curndx].linepos) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1410 #define othlinepos (lbs[1-curndx].linepos) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1411 #define newlinepos (lbs[newndx].linepos) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1412 |
240 | 1413 #define CNL_SAVE_DEFINEDEF \ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1414 do { \ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1415 SET_FILEPOS (curlinepos, inf, charno); \ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1416 lineno++; \ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1417 charno += readline (&curlb, inf); \ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1418 lp = curlb.buffer; \ |
2004
6469a137fea6
(C_entries): New local variable quotednl. Used for
Richard M. Stallman <rms@gnu.org>
parents:
1938
diff
changeset
|
1419 quotednl = FALSE; \ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1420 newndx = curndx; \ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1421 } while (FALSE) |
240 | 1422 |
1423 #define CNL \ | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1424 do { \ |
240 | 1425 CNL_SAVE_DEFINEDEF; \ |
1426 definedef = dnone; \ | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1427 } while (FALSE) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1428 |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1429 #define MAKE_TAG_FROM_NEW_LB(isfun) pfnote (nameb, isfun, tok.named, \ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1430 newlb.buffer, tokoff + toklen + 1, tok.lineno, GET_CHARNO (newlinepos)) |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1431 #define MAKE_TAG_FROM_OTH_LB(isfun) pfnote (nameb, isfun, tok.named, \ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1432 othlb.buffer, tokoff + toklen + 1, tok.lineno, GET_CHARNO (othlinepos)) |
240 | 1433 |
1434 void | |
1435 C_entries (c_ext) | |
1436 int c_ext; /* extension of C? */ | |
1437 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1438 register char c; /* latest char read; '\0' for end of line */ |
240 | 1439 register char *lp; /* pointer one beyond the character `c' */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1440 int curndx, newndx; /* indices for current and new lb */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1441 TOKEN tok; /* latest token read for funcdef & structdef */ |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1442 char nameb[BUFSIZ]; /* latest token name for funcdef & structdef */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1443 register int tokoff; /* offset in line of start of latest token */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1444 register int toklen; /* length of latest token */ |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1445 int cblev; /* current curly brace level */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1446 logical incomm, inquote, inchar, quotednl, midtoken; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1447 logical cplpl; |
240 | 1448 |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1449 curndx = newndx = 0; |
240 | 1450 lineno = 0; |
1451 charno = 0; | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1452 lp = curlb.buffer; |
240 | 1453 *lp = 0; |
1454 | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1455 definedef = dnone; funcdef = fnone; typdef= tnone; structdef= snone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1456 next_token_is_func = yacc_rules = FALSE; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1457 midtoken = inquote = inchar = incomm = quotednl = FALSE; |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1458 cblev = 0; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1459 cplpl = c_ext & C_PLPL; |
240 | 1460 |
1461 C_create_stabs (); | |
1462 | |
1463 while (!feof (inf)) | |
1464 { | |
1465 c = *lp++; | |
1466 if (c == '\\') | |
1467 { | |
621 | 1468 /* If we're at the end of the line, the next character is a |
1469 '\0'; don't skip it, because it's the thing that tells us | |
1470 to read the next line. */ | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1471 if (*lp == '\0') |
2004
6469a137fea6
(C_entries): New local variable quotednl. Used for
Richard M. Stallman <rms@gnu.org>
parents:
1938
diff
changeset
|
1472 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1473 quotednl = TRUE; |
2004
6469a137fea6
(C_entries): New local variable quotednl. Used for
Richard M. Stallman <rms@gnu.org>
parents:
1938
diff
changeset
|
1474 continue; |
6469a137fea6
(C_entries): New local variable quotednl. Used for
Richard M. Stallman <rms@gnu.org>
parents:
1938
diff
changeset
|
1475 } |
401 | 1476 lp++; |
240 | 1477 c = ' '; |
1478 } | |
1479 else if (incomm) | |
1480 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1481 switch (c) |
240 | 1482 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1483 case '*': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1484 if (*lp == '/') |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1485 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1486 c = *lp++; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1487 incomm = FALSE; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1488 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1489 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1490 case '\0': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1491 /* Newlines inside comments do not end macro definitions in |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1492 traditional cpp. */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1493 CNL_SAVE_DEFINEDEF; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1494 break; |
240 | 1495 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1496 continue; |
240 | 1497 } |
1498 else if (inquote) | |
1499 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1500 switch (c) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1501 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1502 case '"': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1503 inquote = FALSE; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1504 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1505 case '\0': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1506 /* Newlines inside strings, do not end macro definitions |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1507 in traditional cpp, even though compilers don't |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1508 usually accept them. */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1509 CNL_SAVE_DEFINEDEF; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1510 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1511 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1512 continue; |
240 | 1513 } |
1514 else if (inchar) | |
1515 { | |
1516 if (c == '\'') | |
1517 inchar = FALSE; | |
1518 continue; | |
1519 } | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1520 else |
240 | 1521 switch (c) |
1522 { | |
1523 case '"': | |
1524 inquote = TRUE; | |
1525 continue; | |
1526 case '\'': | |
1527 inchar = TRUE; | |
1528 continue; | |
1529 case '/': | |
1530 if (*lp == '*') | |
1531 { | |
1532 lp++; | |
1533 incomm = TRUE; | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1534 continue; |
240 | 1535 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1536 else if (cplpl && *lp == '/') |
240 | 1537 { |
727 | 1538 c = 0; |
1539 break; | |
240 | 1540 } |
1541 continue; | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1542 case '%': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1543 if ((c_ext & YACC) && *lp == '%') |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1544 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1545 /* entering or exiting rules section in yacc file */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1546 lp++; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1547 definedef = dnone; funcdef = fnone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1548 typdef= tnone; structdef= snone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1549 next_token_is_func = FALSE; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1550 midtoken = inquote = inchar = incomm = quotednl = FALSE; |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1551 cblev = 0; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1552 yacc_rules = !yacc_rules; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1553 continue; |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1554 } |
240 | 1555 case '#': |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1556 if (lp == newlb.buffer + 1 && definedef == dnone) |
240 | 1557 definedef = dsharpseen; |
1558 continue; | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1559 } /* switch (c) */ |
240 | 1560 |
1561 | |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1562 /* Consider token only if some complicated conditions are satisfied. */ |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1563 if (((cblev == 0 && structdef != scolonseen) |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1564 || (cblev == 1 && cplpl && structdef == sinbody)) |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1565 && definedef != dignorerest |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1566 && funcdef != finlist) |
240 | 1567 { |
1568 if (midtoken) | |
1569 { | |
1570 if (endtoken (c)) | |
1571 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1572 if (cplpl && c == ':' && *lp == ':' && intoken (*(lp + 1))) |
240 | 1573 { |
1574 /* | |
1575 * This handles :: in the middle, but not at beginning | |
1576 * of an identifier. | |
1577 */ | |
1578 lp += 2; | |
1579 toklen += 3; | |
1580 } | |
1581 else | |
1582 { | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1583 logical is_func = FALSE; |
240 | 1584 |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1585 tok.lineno = lineno; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1586 tok.p = newlb.buffer + tokoff; |
240 | 1587 tok.len = toklen; |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1588 tok.named = FALSE; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1589 if (yacc_rules |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1590 || consider_token (c, lp, &tok, |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1591 c_ext, cblev, &is_func)) |
240 | 1592 { |
2004
6469a137fea6
(C_entries): New local variable quotednl. Used for
Richard M. Stallman <rms@gnu.org>
parents:
1938
diff
changeset
|
1593 if (structdef == sinbody |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1594 && definedef == dnone |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1595 && is_func) |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1596 /* function defined in C++ class body */ |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1597 { |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1598 tok.named = TRUE; |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1599 sprintf (nameb, "%s::%.*s", |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1600 ((structtag[0] == '\0') |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1601 ? "_anonymous_" : structtag), |
240 | 1602 tok.len, tok.p); |
1603 } | |
1604 else | |
1605 { | |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1606 sprintf (nameb, "%.*s", tok.len, tok.p); |
240 | 1607 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1608 |
4750
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1609 if (structdef == stagseen |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1610 || typdef == tend) |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1611 tok.named = TRUE; |
cdefe4f21650
Mon Sep 20 18:06:12 1993 Francesco Potorti` (pot at fly)
Francesco Potortì <pot@gnu.org>
parents:
4696
diff
changeset
|
1612 |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1613 if (funcdef == ftagseen |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1614 || structdef == stagseen |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1615 || typdef == tend) |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1616 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1617 if (newndx == curndx) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1618 curndx = 1 - curndx; /* switch line buffers */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1619 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1620 else |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1621 MAKE_TAG_FROM_NEW_LB (is_func); |
240 | 1622 } |
1623 midtoken = FALSE; | |
1624 } | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1625 } /* if (endtoken (c)) */ |
240 | 1626 else if (intoken (c)) |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1627 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1628 toklen++; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1629 continue; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1630 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1631 } /* if (midtoken) */ |
240 | 1632 else if (begtoken (c)) |
1633 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1634 switch (funcdef) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1635 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1636 case flistseen: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1637 MAKE_TAG_FROM_OTH_LB (TRUE); |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1638 funcdef = fignore; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1639 break; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1640 case ftagseen: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1641 funcdef = fnone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1642 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1643 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1644 if (structdef == stagseen) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1645 structdef = snone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1646 if (!yacc_rules || lp == newlb.buffer + 1) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1647 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1648 tokoff = lp - 1 - newlb.buffer; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1649 toklen = 1; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1650 midtoken = TRUE; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1651 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1652 continue; |
240 | 1653 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1654 } /* if must look at token */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1655 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1656 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1657 /* Detect end of line, colon, comma, semicolon and various braces |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1658 after having handled the last token on the line.*/ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1659 switch (c) |
401 | 1660 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1661 case ':': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1662 if (structdef == stagseen) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1663 structdef = scolonseen; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1664 else if (yacc_rules && funcdef == ftagseen) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1665 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1666 MAKE_TAG_FROM_OTH_LB (FALSE); |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1667 funcdef = fignore; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1668 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1669 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1670 case ';': |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1671 if (cblev == 0 && typdef == tend) |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1672 { |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1673 typdef = tnone; |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1674 MAKE_TAG_FROM_OTH_LB (FALSE); |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1675 } |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1676 if (funcdef != fignore) |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1677 funcdef = fnone; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1678 /* FALLTHRU */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1679 case ',': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1680 /* FALLTHRU */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1681 case '[': |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1682 if (funcdef != finlist && funcdef != fignore) |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1683 funcdef = fnone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1684 if (structdef == stagseen) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1685 structdef = snone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1686 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1687 case '(': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1688 switch (funcdef) |
1938
1045deef809f
(C_entries): Don't reset definedef when a newline inside a comment is met.
Richard M. Stallman <rms@gnu.org>
parents:
1796
diff
changeset
|
1689 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1690 case ftagseen: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1691 funcdef = finlist; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1692 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1693 case finlist: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1694 case flistseen: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1695 funcdef = fnone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1696 break; |
1938
1045deef809f
(C_entries): Don't reset definedef when a newline inside a comment is met.
Richard M. Stallman <rms@gnu.org>
parents:
1796
diff
changeset
|
1697 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1698 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1699 case ')': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1700 if (funcdef == finlist) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1701 funcdef = flistseen; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1702 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1703 case '{': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1704 if (typdef == ttypedseen) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1705 typdef = tinbody; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1706 switch (structdef) |
1938
1045deef809f
(C_entries): Don't reset definedef when a newline inside a comment is met.
Richard M. Stallman <rms@gnu.org>
parents:
1796
diff
changeset
|
1707 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1708 case skeyseen: /* unnamed struct */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1709 structtag[0] = '\0'; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1710 structdef = sinbody; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1711 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1712 case stagseen: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1713 case scolonseen: /* named struct */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1714 structdef = sinbody; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1715 MAKE_TAG_FROM_OTH_LB (FALSE); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1716 break; |
1938
1045deef809f
(C_entries): Don't reset definedef when a newline inside a comment is met.
Richard M. Stallman <rms@gnu.org>
parents:
1796
diff
changeset
|
1717 } |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1718 switch (funcdef) |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1719 { |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1720 case flistseen: |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1721 MAKE_TAG_FROM_OTH_LB (TRUE); |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1722 /* FALLTHRU */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1723 case fignore: |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1724 funcdef = fnone; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1725 } |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1726 cblev++; |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1727 break; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1728 case '*': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1729 if (funcdef == flistseen) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1730 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1731 MAKE_TAG_FROM_OTH_LB (TRUE); |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1732 funcdef = fignore; |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1733 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1734 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1735 case '}': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1736 if (!noindentypedefs && lp == newlb.buffer + 1) |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1737 cblev = 0; /* reset curly brace level if first column */ |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1738 else if (cblev > 0) |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1739 cblev--; |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1740 if (cblev == 0) |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1741 { |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1742 if (typdef == tinbody) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1743 typdef = tend; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1744 structdef = snone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1745 (void) strcpy (structtag, "<error 2>"); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1746 } |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1747 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1748 case '\0': |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1749 /* If a macro spans multiple lines don't reset its state. */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1750 if (quotednl) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1751 CNL_SAVE_DEFINEDEF; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1752 else |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1753 CNL; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1754 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1755 } /* switch (c) */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1756 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1757 } /* while not eof */ |
240 | 1758 } |
1759 | |
1760 /* | |
1761 * consider_token () | |
1762 * checks to see if the current token is at the start of a | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1763 * function, or corresponds to a typedef, or is a struct/union/enum |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1764 * tag. |
240 | 1765 * |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1766 * *IS_FUNC gets TRUE iff the token is a function or macro with args. |
240 | 1767 * C_EXT is which language we are looking at. |
1768 * | |
1769 * In the future we will need some way to adjust where the end of | |
1770 * the token is; for instance, implementing the C++ keyword | |
1771 * `operator' properly will adjust the end of the token to be after | |
1772 * whatever follows `operator'. | |
1773 * | |
1774 * Globals | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1775 * funcdef IN OUT |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1776 * structdef IN OUT |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1777 * definedef IN OUT |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1778 * typdef IN OUT |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1779 * next_token_is_func IN OUT |
240 | 1780 */ |
1781 | |
1782 logical | |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1783 consider_token (c, lp, tokp, c_ext, cblev, is_func) |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1784 register char c; /* IN: first char after the token */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1785 register char *lp; /* IN: lp points to 2nd char after the token */ |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1786 register TOKEN *tokp; /* IN: token pointer */ |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1787 int c_ext; /* IN: C extensions mask */ |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1788 int cblev; /* IN: curly brace level */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1789 logical *is_func; /* OUT */ |
240 | 1790 { |
1791 logical firsttok; /* TRUE if have seen first token in ()'s */ | |
1792 Stab_entry *tokse = stab_find (get_C_stab (c_ext), tokp->p, tokp->len); | |
1793 enum sym_type toktype = stab_type (tokse); | |
1794 | |
1795 /* | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1796 * Advance the definedef state machine. |
240 | 1797 */ |
1798 switch (definedef) | |
1799 { | |
1800 case dnone: | |
1801 /* We're not on a preprocessor line. */ | |
1802 break; | |
1803 case dsharpseen: | |
1804 if (toktype == st_C_define) | |
1805 { | |
1806 definedef = ddefineseen; | |
1807 } | |
1808 else | |
1809 { | |
1810 definedef = dignorerest; | |
1811 } | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1812 return (FALSE); |
240 | 1813 case ddefineseen: |
1814 /* | |
1815 * Make a tag for any macro. | |
1816 */ | |
1817 definedef = dignorerest; | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1818 *is_func = (c == '('); |
240 | 1819 if (!*is_func && !constantypedefs) |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1820 return (FALSE); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1821 else |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1822 return (TRUE); |
240 | 1823 case dignorerest: |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1824 return (FALSE); |
240 | 1825 default: |
1826 error ("internal error: definedef value"); | |
1827 } | |
1828 | |
1829 /* | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1830 * Now typedefs |
240 | 1831 */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1832 switch (typdef) |
240 | 1833 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1834 case tnone: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1835 if (toktype == st_C_typedef) |
240 | 1836 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1837 if (typedefs) |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1838 typdef = ttypedseen; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1839 return (FALSE); |
240 | 1840 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1841 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1842 case ttypedseen: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1843 switch (toktype) |
240 | 1844 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1845 case st_none: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1846 case st_C_typespec: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1847 typdef = tend; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1848 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1849 case st_C_struct: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1850 case st_C_enum: |
401 | 1851 break; |
240 | 1852 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1853 /* Do not return here, so the structdef stuff has a chance. */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1854 break; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1855 case tend: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1856 switch (toktype) |
240 | 1857 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1858 case st_C_typespec: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1859 case st_C_struct: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1860 case st_C_enum: |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1861 return (FALSE); |
240 | 1862 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1863 return (TRUE); |
240 | 1864 } |
1865 | |
1866 /* | |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1867 * This structdef business is currently only invoked when cblev==0. |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1868 * It should be recursively invoked whatever the curly brace level, |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1869 * and a stack of states kept, to allow for definitions of structs |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1870 * within structs. |
240 | 1871 * |
1872 * This structdef business is NOT invoked when we are ctags and the | |
1873 * file is plain C. This is because a struct tag may have the same | |
1874 * name as another tag, and this loses with ctags. | |
1875 * | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1876 * This if statement deals with the typdef state machine as |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1877 * follows: if typdef==ttypedseen and token is struct/union/class/enum, |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1878 * return (FALSE). All the other code here is for the structdef |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1879 * state machine. |
240 | 1880 */ |
1881 switch (toktype) | |
1882 { | |
1883 case st_C_struct: | |
1884 case st_C_enum: | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1885 if (typdef == ttypedseen |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1886 || (typedefs_and_cplusplus && cblev == 0 && structdef == snone)) |
240 | 1887 { |
1888 structdef = skeyseen; | |
1889 structkey = tokse; | |
1890 } | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1891 return (FALSE); |
240 | 1892 } |
1893 if (structdef == skeyseen) | |
1894 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1895 if (stab_type (structkey) == st_C_struct) |
240 | 1896 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1897 (void) strncpy (structtag, tokp->p, tokp->len); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1898 structtag[tokp->len] = '\0'; /* for struct/union/class */ |
240 | 1899 } |
1900 else | |
1901 { | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1902 structtag[0] = '\0'; /* for enum (why is it treated differently?) */ |
240 | 1903 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1904 structdef = stagseen; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1905 return (TRUE); |
240 | 1906 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1907 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1908 /* Avoid entering funcdef stuff if typdef is going on. */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1909 if (typdef != tnone) |
240 | 1910 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1911 definedef = dnone; |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1912 return (FALSE); |
240 | 1913 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1914 |
240 | 1915 /* Detect GNUmacs's function-defining macros. */ |
621 | 1916 if (definedef == dnone) |
240 | 1917 { |
727 | 1918 if (strneq (tokp->p, "DEF", 3) |
1919 || strneq (tokp->p, "ENTRY", 5) | |
1920 || strneq (tokp->p, "SYSCALL", 7) | |
1921 || strneq (tokp->p, "PSEUDO", 6)) | |
621 | 1922 { |
1923 next_token_is_func = TRUE; | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1924 return (FALSE); |
621 | 1925 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1926 if (strneq (tokp->p, "EXFUN", 5)) |
621 | 1927 { |
1928 next_token_is_func = FALSE; | |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1929 return (FALSE); |
621 | 1930 } |
240 | 1931 } |
1932 if (next_token_is_func) | |
1933 { | |
1934 next_token_is_func = FALSE; | |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1935 funcdef = fnone; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1936 *is_func = TRUE; /* to force search string in ctags */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1937 return (TRUE); |
240 | 1938 } |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1939 |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1940 /* A function? */ |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1941 switch (toktype) |
240 | 1942 { |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1943 case st_C_typespec: |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
1944 funcdef = fnone; /* should be useless */ |
2323
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1945 return (FALSE); |
626d9ac52bc9
(YACC): flag added to c_ext.
Richard M. Stallman <rms@gnu.org>
parents:
2004
diff
changeset
|
1946 default: |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1947 if (funcdef == fnone) |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1948 { |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1949 funcdef = ftagseen; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1950 *is_func = TRUE; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1951 return (TRUE); |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1952 } |
240 | 1953 } |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1954 |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
1955 return (FALSE); |
240 | 1956 } |
1957 | |
1958 /* Fortran parsing */ | |
1959 | |
1960 char *dbp; | |
1961 int pfcnt; | |
1962 | |
1963 int | |
1964 PF_funcs (fi) | |
1965 FILE *fi; | |
1966 { | |
1967 lineno = 0; | |
1968 charno = 0; | |
1969 pfcnt = 0; | |
1970 | |
1971 while (!feof (fi)) | |
1972 { | |
1973 lineno++; | |
1974 linecharno = charno; | |
1975 charno += readline (&lb, fi); | |
1976 dbp = lb.buffer; | |
1977 if (*dbp == '%') | |
1978 dbp++; /* Ratfor escape to fortran */ | |
1979 while (isspace (*dbp)) | |
1980 dbp++; | |
1981 if (*dbp == 0) | |
1982 continue; | |
1983 switch (*dbp | ' ') | |
1984 { | |
1985 case 'i': | |
1986 if (tail ("integer")) | |
1987 takeprec (); | |
1988 break; | |
1989 case 'r': | |
1990 if (tail ("real")) | |
1991 takeprec (); | |
1992 break; | |
1993 case 'l': | |
1994 if (tail ("logical")) | |
1995 takeprec (); | |
1996 break; | |
1997 case 'c': | |
1998 if (tail ("complex") || tail ("character")) | |
1999 takeprec (); | |
2000 break; | |
2001 case 'd': | |
2002 if (tail ("double")) | |
2003 { | |
2004 while (isspace (*dbp)) | |
2005 dbp++; | |
2006 if (*dbp == 0) | |
2007 continue; | |
2008 if (tail ("precision")) | |
2009 break; | |
2010 continue; | |
2011 } | |
2012 break; | |
2013 } | |
2014 while (isspace (*dbp)) | |
2015 dbp++; | |
2016 if (*dbp == 0) | |
2017 continue; | |
2018 switch (*dbp | ' ') | |
2019 { | |
2020 case 'f': | |
2021 if (tail ("function")) | |
2022 getit (); | |
2023 continue; | |
2024 case 's': | |
2025 if (tail ("subroutine")) | |
2026 getit (); | |
2027 continue; | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2028 case 'e': |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2029 if (tail ("entry")) |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2030 getit (); |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2031 continue; |
240 | 2032 case 'p': |
2033 if (tail ("program")) | |
2034 { | |
2035 getit (); | |
2036 continue; | |
2037 } | |
2038 if (tail ("procedure")) | |
2039 getit (); | |
2040 continue; | |
2041 } | |
2042 } | |
2043 return (pfcnt); | |
2044 } | |
2045 | |
2046 logical | |
2047 tail (cp) | |
2048 char *cp; | |
2049 { | |
2050 register int len = 0; | |
2051 | |
2052 while (*cp && (*cp & ~' ') == ((*(dbp + len)) & ~' ')) | |
2053 cp++, len++; | |
2054 if (*cp == 0) | |
2055 { | |
2056 dbp += len; | |
2057 return (1); | |
2058 } | |
2059 return (0); | |
2060 } | |
2061 | |
2062 void | |
2063 takeprec () | |
2064 { | |
2065 while (isspace (*dbp)) | |
2066 dbp++; | |
2067 if (*dbp != '*') | |
2068 return; | |
2069 dbp++; | |
2070 while (isspace (*dbp)) | |
2071 dbp++; | |
2072 if (!isdigit (*dbp)) | |
2073 { | |
2074 --dbp; /* force failure */ | |
2075 return; | |
2076 } | |
2077 do | |
2078 dbp++; | |
2079 while (isdigit (*dbp)); | |
2080 } | |
2081 | |
2082 void | |
2083 getit () | |
2084 { | |
2085 register char *cp; | |
2086 char c; | |
2087 char nambuf[BUFSIZ]; | |
2088 | |
2089 while (isspace (*dbp)) | |
2090 dbp++; | |
727 | 2091 if (*dbp == 0 |
2092 || (!isalpha (*dbp) | |
2093 && *dbp != '_' | |
2094 && *dbp != '$')) | |
240 | 2095 return; |
2096 for (cp = dbp + 1; *cp && (isalpha (*cp) || isdigit (*cp) | |
2097 || (*cp == '_') || (*cp == '$')); cp++) | |
2098 continue; | |
2099 c = cp[0]; | |
2100 cp[0] = 0; | |
2101 (void) strcpy (nambuf, dbp); | |
2102 cp[0] = c; | |
2103 pfnote (nambuf, TRUE, FALSE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno); | |
2104 pfcnt++; | |
2105 } | |
2106 | |
2107 /* Handle a file of assembler code. */ | |
2108 | |
2109 void | |
2110 Asm_funcs (fi) | |
2111 FILE *fi; | |
2112 { | |
2113 int i; | |
2114 register char c; | |
2115 | |
2116 lineno = 0; | |
2117 charno = 0; | |
2118 pfcnt = 0; | |
2119 | |
2120 while (!feof (fi)) | |
2121 { | |
2122 lineno++; | |
2123 linecharno = charno; | |
2124 charno += readline (&lb, fi); | |
2125 dbp = lb.buffer; | |
2126 | |
2127 for (i = 0; ((c = dbp[i]) && !isspace (c)) && (c != ':'); i++) | |
2128 ; | |
2129 | |
2130 if ((i > 0) && (c == ':')) | |
2131 getit (); | |
2132 } | |
2133 } | |
2134 | |
2135 /* Added by Mosur Mohan, 4/22/88 */ | |
2136 /* Pascal parsing */ | |
2137 | |
2138 #define GET_NEW_LINE \ | |
2139 { \ | |
2140 linecharno = charno; lineno++; \ | |
2141 charno += 1 + readline (&lb, inf); \ | |
2142 dbp = lb.buffer; \ | |
2143 } | |
2144 | |
2145 /* Locates tags for procedures & functions. | |
2146 * Doesn't do any type- or var-definitions. | |
2147 * It does look for the keyword "extern" or "forward" | |
2148 * immediately following the procedure statement; | |
2149 * if found, the tag is skipped. | |
2150 */ | |
2151 | |
2152 void | |
2153 PAS_funcs (fi) | |
2154 FILE *fi; | |
2155 { | |
2156 struct linebuffer tline; /* mostly copied from C_entries */ | |
2157 long save_lcno; | |
2158 int save_lineno; | |
2159 char c, *cp; | |
2160 char nambuf[BUFSIZ]; | |
2161 | |
2162 logical /* each of these flags is TRUE iff: */ | |
2163 incomm1, /* point is inside {..} comment */ | |
2164 incomm2, /* point is inside (*..*) comment */ | |
2165 inquote, /* point is inside '..' string */ | |
2166 get_tagname, /* point is after PROCEDURE/FUNCTION */ | |
2167 /* keyword, so next item = potential tag */ | |
2168 found_tag, /* point is after a potential tag */ | |
2169 inparms, /* point is within parameter-list */ | |
2170 verify_tag; /* point has passed the parm-list, so the */ | |
2171 /* next token will determine whether */ | |
2172 /* this is a FORWARD/EXTERN to be */ | |
2173 /* ignored, or whether it is a real tag */ | |
2174 | |
2175 lineno = 0; | |
2176 charno = 0; | |
2177 dbp = lb.buffer; | |
2178 *dbp = 0; | |
2179 initbuffer (&tline); | |
2180 | |
2181 incomm1 = incomm2 = inquote = FALSE; | |
2182 found_tag = FALSE; /* have a proc name; check if extern */ | |
2183 get_tagname = FALSE; /* have found "procedure" keyword */ | |
2184 inparms = FALSE; /* found '(' after "proc" */ | |
2185 verify_tag = FALSE; /* check if "extern" is ahead */ | |
2186 | |
2187 /* long main loop to get next char */ | |
2188 while (!feof (fi)) | |
2189 { | |
2190 c = *dbp++; | |
2191 if (c == 0) /* if end of line */ | |
2192 { | |
2193 GET_NEW_LINE; | |
2194 if (*dbp == 0) | |
2195 continue; | |
2196 if (!((found_tag && verify_tag) || | |
2197 get_tagname)) | |
2198 c = *dbp++; /* only if don't need *dbp pointing */ | |
2199 /* to the beginning of the name of */ | |
2200 /* the procedure or function */ | |
2201 } | |
2202 if (incomm1) /* within { - } comments */ | |
2203 { | |
2204 if (c == '}') | |
2205 incomm1 = FALSE; | |
2206 continue; | |
2207 } | |
2208 else if (incomm2) /* within (* - *) comments */ | |
2209 { | |
2210 if (c == '*') | |
2211 { | |
2212 while ((c = *dbp++) == '*') | |
2213 continue; | |
2214 if (c == 0) | |
2215 GET_NEW_LINE; | |
2216 if (c == ')') | |
2217 incomm2 = FALSE; | |
2218 } | |
2219 continue; | |
2220 } | |
2221 else if (inquote) | |
2222 { | |
2223 if (c == '\'') | |
2224 inquote = FALSE; | |
2225 continue; | |
2226 } | |
2227 else | |
2228 switch (c) | |
2229 { | |
2230 case '\'': | |
2231 inquote = TRUE; /* found first quote */ | |
2232 continue; | |
2233 case '{': /* found open-{-comment */ | |
2234 incomm1 = TRUE; | |
2235 continue; | |
2236 case '(': | |
2237 if (*dbp == '*') /* found open-(*-comment */ | |
2238 { | |
2239 incomm2 = TRUE; | |
2240 dbp++; | |
2241 } | |
2242 else if (found_tag) /* found '(' after tag, i.e., parm-list */ | |
2243 inparms = TRUE; | |
2244 continue; | |
2245 case ')': /* end of parms list */ | |
2246 if (inparms) | |
2247 inparms = FALSE; | |
2248 continue; | |
2249 case ';': | |
2250 if ((found_tag) && (!inparms)) /* end of proc or fn stmt */ | |
2251 { | |
2252 verify_tag = TRUE; | |
2253 break; | |
2254 } | |
2255 continue; | |
2256 } | |
2257 if ((found_tag) && (verify_tag) && (*dbp != ' ')) | |
2258 { | |
2259 /* check if this is an "extern" declaration */ | |
2260 if (*dbp == 0) | |
2261 continue; | |
2262 if ((*dbp == 'e') || (*dbp == 'E')) | |
2263 { | |
2264 if (tail ("extern")) /* superfluous, really! */ | |
2265 { | |
2266 found_tag = FALSE; | |
2267 verify_tag = FALSE; | |
2268 } | |
2269 } | |
2270 else if ((*dbp == 'f') || (*dbp == 'F')) | |
2271 { | |
2272 if (tail ("forward")) /* check for forward reference */ | |
2273 { | |
2274 found_tag = FALSE; | |
2275 verify_tag = FALSE; | |
2276 } | |
2277 } | |
2278 if ((found_tag) && (verify_tag)) /* not external proc, so make tag */ | |
2279 { | |
2280 found_tag = FALSE; | |
2281 verify_tag = FALSE; | |
2282 pfnote (nambuf, TRUE, FALSE, | |
2283 tline.buffer, cp - tline.buffer + 1, | |
2284 save_lineno, save_lcno); | |
2285 continue; | |
2286 } | |
2287 } | |
2288 if (get_tagname) /* grab name of proc or fn */ | |
2289 { | |
2290 if (*dbp == 0) | |
2291 continue; | |
2292 | |
2293 /* save all values for later tagging */ | |
2294 tline.size = lb.size; | |
2295 strcpy (tline.buffer, lb.buffer); | |
2296 save_lineno = lineno; | |
2297 save_lcno = linecharno; | |
2298 | |
2299 /* grab block name */ | |
2300 for (cp = dbp + 1; *cp && (!endtoken (*cp)); cp++) | |
2301 continue; | |
2302 c = cp[0]; | |
2303 cp[0] = 0; | |
2304 strcpy (nambuf, dbp); | |
2305 cp[0] = c; | |
2306 dbp = cp; /* restore dbp to e-o-token */ | |
2307 get_tagname = FALSE; | |
2308 found_tag = TRUE; | |
2309 continue; | |
2310 | |
2311 /* and proceed to check for "extern" */ | |
2312 } | |
2313 if ((!incomm1) && (!incomm2) && (!inquote) && | |
2314 (!found_tag) && (!get_tagname)) | |
2315 { | |
2316 /* check for proc/fn keywords */ | |
2317 switch (c | ' ') | |
2318 { | |
2319 case 'p': | |
2320 if (tail ("rocedure")) /* c = 'p', dbp has advanced */ | |
2321 get_tagname = TRUE; | |
2322 continue; | |
2323 case 'f': | |
2324 if (tail ("unction")) | |
2325 get_tagname = TRUE; | |
2326 continue; | |
2327 } | |
2328 } | |
2329 } /* while not e-o-f */ | |
2330 } | |
2331 | |
2332 /* | |
2333 * lisp tag functions | |
2334 * just look for (def or (DEF | |
2335 */ | |
2336 | |
2337 void | |
2338 L_funcs (fi) | |
2339 FILE *fi; | |
2340 { | |
2341 lineno = 0; | |
2342 charno = 0; | |
2343 pfcnt = 0; | |
2344 | |
2345 while (!feof (fi)) | |
2346 { | |
2347 lineno++; | |
2348 linecharno = charno; | |
2349 charno += readline (&lb, fi); | |
2350 dbp = lb.buffer; | |
2351 if (dbp[0] == '(') | |
2352 { | |
2353 if (L_isdef (dbp)) | |
2354 { | |
2355 while (!isspace (*dbp)) | |
2356 dbp++; | |
2357 while (isspace (*dbp)) | |
2358 dbp++; | |
2359 L_getit (); | |
2360 } | |
2361 else | |
2362 { | |
2363 /* Check for (foo::defmumble name-defined ... */ | |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2364 do |
240 | 2365 dbp++; |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2366 while (*dbp && !isspace (*dbp) |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2367 && *dbp != ':' && *dbp != '(' && *dbp != ')'); |
240 | 2368 if (*dbp == ':') |
2369 { | |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2370 do |
240 | 2371 dbp++; |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2372 while (*dbp == ':'); |
240 | 2373 |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2374 if (L_isdef (dbp - 1)) |
240 | 2375 { |
2376 while (!isspace (*dbp)) | |
2377 dbp++; | |
2378 while (isspace (*dbp)) | |
2379 dbp++; | |
2380 L_getit (); | |
2381 } | |
2382 } | |
2383 } | |
2384 } | |
2385 } | |
2386 } | |
2387 | |
2388 int | |
2389 L_isdef (dbp) | |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2390 register char *dbp; |
240 | 2391 { |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2392 return ((dbp[1] == 'd' || dbp[1] == 'D') |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2393 && (dbp[2] == 'e' || dbp[2] == 'E') |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2394 && (dbp[3] == 'f' || dbp[3] == 'F')); |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2395 } |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2396 |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2397 int |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2398 L_isquote (dbp) |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2399 register char *dbp; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2400 { |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2401 return ((*(++dbp) == 'q' || *dbp == 'Q') |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2402 && (*(++dbp) == 'u' || *dbp == 'U') |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2403 && (*(++dbp) == 'o' || *dbp == 'O') |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2404 && (*(++dbp) == 't' || *dbp == 'T') |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2405 && (*(++dbp) == 'e' || *dbp == 'E') |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2406 && isspace(*(++dbp))); |
240 | 2407 } |
2408 | |
2409 void | |
2410 L_getit () | |
2411 { | |
2412 register char *cp; | |
2413 char c; | |
2414 char nambuf[BUFSIZ]; | |
2415 | |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2416 if (*dbp == '\'') /* Skip prefix quote */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2417 dbp++; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2418 else if (*dbp == '(' && L_isquote (dbp)) /* Skip "(quote " */ |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2419 { |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2420 dbp += 7; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2421 while (isspace(*dbp)) |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2422 dbp++; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2423 } |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2424 for (cp = dbp /*+1*/; *cp && *cp != '(' && *cp != ' ' && *cp != ')'; cp++) |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2425 continue; |
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2426 if (cp == dbp) |
240 | 2427 return; |
4663
5f0ff5c890a8
* etags.c (L_isdef, L_isquote, L_getit): small optimisations.
Francesco Potortì <pot@gnu.org>
parents:
4406
diff
changeset
|
2428 |
240 | 2429 c = cp[0]; |
2430 cp[0] = 0; | |
2431 (void) strcpy (nambuf, dbp); | |
2432 cp[0] = c; | |
4051
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
2433 pfnote (nambuf, TRUE, FALSE, lb.buffer, |
73aa16fc728d
(consider_token): was `==', now is `='.
Richard M. Stallman <rms@gnu.org>
parents:
3921
diff
changeset
|
2434 cp - lb.buffer + 1, lineno, linecharno); |
240 | 2435 pfcnt++; |
2436 } | |
2437 | |
2438 /* | |
2439 * Scheme tag functions | |
2440 * look for (def... xyzzy | |
2441 * look for (def... (xyzzy | |
2442 * look for (def ... ((...(xyzzy .... | |
2443 * look for (set! xyzzy | |
2444 */ | |
2445 | |
2446 static void get_scheme (); | |
2447 | |
2448 void | |
2449 Scheme_funcs (fi) | |
2450 FILE *fi; | |
2451 { | |
2452 lineno = 0; | |
2453 charno = 0; | |
2454 pfcnt = 0; | |
2455 | |
2456 while (!feof (fi)) | |
2457 { | |
2458 lineno++; | |
2459 linecharno = charno; | |
2460 charno += readline (&lb, fi); | |
2461 dbp = lb.buffer; | |
2462 if (dbp[0] == '(' && | |
2463 (dbp[1] == 'D' || dbp[1] == 'd') && | |
2464 (dbp[2] == 'E' || dbp[2] == 'e') && | |
2465 (dbp[3] == 'F' || dbp[3] == 'f')) | |
2466 { | |
2467 while (!isspace (*dbp)) | |
2468 dbp++; | |
2469 /* Skip over open parens and white space */ | |
2470 while (*dbp && (isspace (*dbp) || *dbp == '(')) | |
2471 dbp++; | |
2472 get_scheme (); | |
2473 } | |
2474 if (dbp[0] == '(' && | |
2475 (dbp[1] == 'S' || dbp[1] == 's') && | |
2476 (dbp[2] == 'E' || dbp[2] == 'e') && | |
2477 (dbp[3] == 'T' || dbp[3] == 't') && | |
2478 (dbp[4] == '!' || dbp[4] == '!') && | |
2479 (isspace (dbp[5]))) | |
2480 { | |
2481 while (!isspace (*dbp)) | |
2482 dbp++; | |
2483 /* Skip over white space */ | |
2484 while (isspace (*dbp)) | |
2485 dbp++; | |
2486 get_scheme (); | |
2487 } | |
2488 } | |
2489 } | |
2490 | |
2491 static void | |
2492 get_scheme () | |
2493 { | |
2494 register char *cp; | |
2495 char c; | |
2496 char nambuf[BUFSIZ]; | |
2497 | |
2498 if (*dbp == 0) | |
2499 return; | |
2500 /* Go till you get to white space or a syntactic break */ | |
2501 for (cp = dbp + 1; *cp && *cp != '(' && *cp != ')' && !isspace (*cp); cp++) | |
2502 continue; | |
2503 /* Null terminate the string there. */ | |
2504 c = cp[0]; | |
2505 cp[0] = 0; | |
2506 /* Copy the string */ | |
2507 strcpy (nambuf, dbp); | |
2508 /* Unterminate the string */ | |
2509 cp[0] = c; | |
2510 /* Announce the change */ | |
2511 pfnote (nambuf, TRUE, FALSE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno); | |
2512 pfcnt++; | |
2513 } | |
2514 | |
2515 /* Find tags in TeX and LaTeX input files. */ | |
2516 | |
2517 /* TEX_toktab is a table of TeX control sequences that define tags. | |
2518 Each TEX_tabent records one such control sequence. | |
2519 CONVERT THIS TO USE THE Stab TYPE!! */ | |
2520 | |
2521 struct TEX_tabent | |
2522 { | |
2523 char *name; | |
2524 int len; | |
2525 }; | |
2526 | |
2527 struct TEX_tabent *TEX_toktab = NULL; /* Table with tag tokens */ | |
2528 | |
2529 /* Default set of control sequences to put into TEX_toktab. | |
2530 The value of environment var TEXTAGS is prepended to this. */ | |
2531 | |
2532 static char *TEX_defenv = | |
2533 ":chapter:section:subsection:subsubsection:eqno:label:ref:cite:bibitem:typeout"; | |
2534 | |
2535 void TEX_mode (); | |
2536 struct TEX_tabent *TEX_decode_env (); | |
2537 void TEX_getit (); | |
2538 int TEX_Token (); | |
2539 | |
2540 static char TEX_esc = '\\'; | |
2541 static char TEX_opgrp = '{'; | |
2542 static char TEX_clgrp = '}'; | |
2543 | |
2544 /* | |
2545 * TeX/LaTeX scanning loop. | |
2546 */ | |
2547 | |
2548 void | |
2549 TEX_funcs (fi) | |
2550 FILE *fi; | |
2551 { | |
2552 char *lasthit; | |
2553 | |
2554 lineno = 0; | |
2555 charno = 0; | |
2556 pfcnt = 0; | |
2557 | |
2558 /* Select either \ or ! as escape character. */ | |
2559 TEX_mode (fi); | |
2560 | |
2561 /* Initialize token table once from environment. */ | |
2562 if (!TEX_toktab) | |
2563 TEX_toktab = TEX_decode_env ("TEXTAGS", TEX_defenv); | |
2564 | |
2565 while (!feof (fi)) | |
1040 | 2566 { /* Scan each line in file */ |
240 | 2567 lineno++; |
2568 linecharno = charno; | |
2569 charno += readline (&lb, fi); | |
2570 dbp = lb.buffer; | |
2571 lasthit = dbp; | |
1040 | 2572 while (dbp = etags_index (dbp, TEX_esc)) /* Look at each escape in line */ |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2573 { |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2574 register int i; |
240 | 2575 |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2576 if (!*(++dbp)) |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2577 break; |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2578 linecharno += dbp - lasthit; |
240 | 2579 lasthit = dbp; |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2580 i = TEX_Token (lasthit); |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2581 if (0 <= i) |
240 | 2582 { |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2583 TEX_getit (lasthit, TEX_toktab[i].len); |
1040 | 2584 break; /* We only save a line once */ |
240 | 2585 } |
2586 } | |
2587 } | |
2588 } | |
2589 | |
2590 #define TEX_LESC '\\' | |
2591 #define TEX_SESC '!' | |
2592 #define TEX_cmt '%' | |
2593 | |
2594 /* Figure out whether TeX's escapechar is '\\' or '!' and set grouping */ | |
2595 /* chars accordingly. */ | |
2596 | |
2597 void | |
2598 TEX_mode (f) | |
2599 FILE *f; | |
2600 { | |
2601 int c; | |
2602 | |
2603 while ((c = getc (f)) != EOF) | |
2604 { | |
2605 /* Skip to next line if we hit the TeX comment char. */ | |
2606 if (c == TEX_cmt) | |
2607 while (c != '\n') | |
2608 c = getc (f); | |
2609 else if (c == TEX_LESC || c == TEX_SESC ) | |
2610 break; | |
2611 } | |
2612 | |
2613 if (c == TEX_LESC) | |
2614 { | |
2615 TEX_esc = TEX_LESC; | |
2616 TEX_opgrp = '{'; | |
2617 TEX_clgrp = '}'; | |
2618 } | |
2619 else | |
2620 { | |
2621 TEX_esc = TEX_SESC; | |
2622 TEX_opgrp = '<'; | |
2623 TEX_clgrp = '>'; | |
2624 } | |
2625 rewind (f); | |
2626 } | |
2627 | |
2628 /* Read environment and prepend it to the default string. */ | |
2629 /* Build token table. */ | |
2630 | |
2631 struct TEX_tabent * | |
2632 TEX_decode_env (evarname, defenv) | |
2633 char *evarname; | |
2634 char *defenv; | |
2635 { | |
2636 register char *env, *p; | |
2637 | |
2638 struct TEX_tabent *tab; | |
2639 int size, i; | |
2640 | |
2641 /* Append default string to environment. */ | |
2642 env = getenv (evarname); | |
2643 if (!env) | |
2644 env = defenv; | |
2645 else | |
2646 env = concat (env, defenv, ""); | |
2647 | |
2648 /* Allocate a token table */ | |
2649 for (size = 1, p = env; p;) | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2650 if ((p = etags_index (p, ':')) && *(++p)) |
240 | 2651 size++; |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2652 /* Add 1 to leave room for null terminator. */ |
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2653 tab = xnew (size + 1, struct TEX_tabent); |
240 | 2654 |
2655 /* Unpack environment string into token table. Be careful about */ | |
2656 /* zero-length strings (leading ':', "::" and trailing ':') */ | |
2657 for (i = 0; *env;) | |
2658 { | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2659 p = etags_index (env, ':'); |
240 | 2660 if (!p) /* End of environment string. */ |
2661 p = env + strlen (env); | |
2662 if (p - env > 0) | |
2663 { /* Only non-zero strings. */ | |
2664 tab[i].name = savenstr (env, p - env); | |
2665 tab[i].len = strlen (tab[i].name); | |
2666 i++; | |
2667 } | |
2668 if (*p) | |
2669 env = p + 1; | |
2670 else | |
2671 { | |
2672 tab[i].name = NULL; /* Mark end of table. */ | |
2673 tab[i].len = 0; | |
2674 break; | |
2675 } | |
2676 } | |
2677 return tab; | |
2678 } | |
2679 | |
2680 /* Record a tag defined by a TeX command of length LEN and starting at NAME. | |
2681 The name being defined actually starts at (NAME + LEN + 1). | |
2682 But we seem to include the TeX command in the tag name. */ | |
2683 | |
2684 void | |
2685 TEX_getit (name, len) | |
2686 char *name; | |
2687 int len; | |
2688 { | |
2689 char *p = name + len; | |
2690 char nambuf[BUFSIZ]; | |
2691 | |
2692 if (*name == 0) | |
2693 return; | |
2694 | |
2695 /* Let tag name extend to next group close (or end of line) */ | |
2696 while (*p && *p != TEX_clgrp) | |
2697 p++; | |
2698 (void) strncpy (nambuf, name, p - name); | |
2699 nambuf[p - name] = 0; | |
2700 | |
2701 pfnote (nambuf, TRUE, FALSE, lb.buffer, strlen (lb.buffer), lineno, linecharno); | |
2702 pfcnt++; | |
2703 } | |
2704 | |
2705 /* If the text at CP matches one of the tag-defining TeX command names, | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2706 return the etags_index of that command in TEX_toktab. |
240 | 2707 Otherwise return -1. */ |
2708 | |
2709 /* Keep the capital `T' in `Token' for dumb truncating compilers | |
2710 (this distinguishes it from `TEX_toktab' */ | |
2711 int | |
2712 TEX_Token (cp) | |
2713 char *cp; | |
2714 { | |
2715 int i; | |
2716 | |
2717 for (i = 0; TEX_toktab[i].len > 0; i++) | |
2718 if (strncmp (TEX_toktab[i].name, cp, TEX_toktab[i].len) == 0) | |
2719 return i; | |
2720 return -1; | |
2721 } | |
2722 | |
2723 /* Support for Prolog. */ | |
2724 | |
2725 /* whole head (not only functor, but also arguments) | |
2726 is gotten in compound term. */ | |
2727 | |
2728 void | |
2729 prolog_getit (s, lineno, linecharno) | |
2730 char *s; | |
2731 int lineno; | |
2732 long linecharno; | |
2733 { | |
2734 char nambuf[BUFSIZ], *save_s, tmpc; | |
2735 int insquote, npar; | |
2736 | |
2737 save_s = s; | |
2738 insquote = FALSE; | |
2739 npar = 0; | |
2740 while (1) | |
2741 { | |
2742 if (*s == '\0') /* syntax error. */ | |
2743 return; | |
2744 else if (insquote && *s == '\'' && *(s + 1) == '\'') | |
2745 s += 2; | |
2746 else if (*s == '\'') | |
2747 { | |
2748 insquote = !insquote; | |
2749 s++; | |
2750 } | |
2751 else if (!insquote && *s == '(') | |
2752 { | |
2753 npar++; | |
2754 s++; | |
2755 } | |
2756 else if (!insquote && *s == ')') | |
2757 { | |
2758 npar--; | |
2759 s++; | |
2760 if (npar == 0) | |
2761 break; | |
2762 else if (npar < 0) /* syntax error. */ | |
2763 return; | |
2764 } | |
2765 else if (!insquote && *s == '.' && (isspace (*(s + 1)) || *(s + 1) == '\0')) | |
2766 { /* fullstop. */ | |
2767 if (npar != 0) /* syntax error. */ | |
2768 return; | |
2769 s++; | |
2770 break; | |
2771 } | |
2772 else | |
2773 s++; | |
2774 } | |
2775 tmpc = *s; | |
2776 *s = '\0'; | |
2777 strcpy (nambuf, save_s); | |
2778 *s = tmpc; | |
2779 pfnote (nambuf, TRUE, save_s, strlen (nambuf), lineno, linecharno); | |
2780 } | |
2781 | |
2782 /* It is assumed that prolog predicate starts from column 0. */ | |
2783 | |
2784 void | |
2785 prolog_funcs (fi) | |
2786 FILE *fi; | |
2787 { | |
2788 void skip_comment (), prolog_getit (); | |
2789 | |
2790 lineno = linecharno = charno = 0; | |
2791 while (!feof (fi)) | |
2792 { | |
2793 lineno++; | |
2794 linecharno += charno; | |
2795 charno = readline (&lb, fi) + 1; /* 1 for newline. */ | |
2796 dbp = lb.buffer; | |
2797 if (isspace (dbp[0])) /* not predicate header. */ | |
2798 continue; | |
2799 else if (dbp[0] == '%') /* comment. */ | |
2800 continue; | |
2801 else if (dbp[0] == '/' && dbp[1] == '*') /* comment. */ | |
2802 skip_comment (&lb, fi, &lineno, &linecharno); | |
2803 else /* found. */ | |
2804 prolog_getit (dbp, lineno, linecharno); | |
2805 } | |
2806 } | |
2807 | |
2808 void | |
2809 skip_comment (plb, fi, plineno, plinecharno) | |
2810 struct linebuffer *plb; | |
2811 FILE *fi; | |
2812 int *plineno; /* result */ | |
2813 long *plinecharno; /* result */ | |
2814 { | |
2815 while (!substr ("*/", plb->buffer)) | |
2816 { | |
2817 (*plineno)++; | |
2818 *plinecharno += readline (plb, fi) + 1; | |
2819 } /* 1 for newline. */ | |
2820 } | |
2821 | |
2822 /* Return TRUE if 'sub' exists somewhere in 's'. */ | |
2823 | |
2824 int | |
2825 substr (sub, s) | |
2826 char *sub; | |
2827 char *s; | |
2828 { | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2829 while (*s && (s = etags_index (s, *sub))) |
240 | 2830 if (prestr (sub, s)) |
2831 return (TRUE); | |
2832 else | |
2833 s++; | |
2834 return (FALSE); | |
2835 } | |
2836 | |
2837 /* Return TRUE if 'pre' is prefix of string 's'. */ | |
2838 | |
2839 int | |
2840 prestr (pre, s) | |
2841 char *pre; | |
2842 char *s; | |
2843 { | |
2844 if (*pre == '\0') | |
2845 return (TRUE); | |
2846 else if (*pre == *s) | |
2847 return (prestr (pre + 1, s + 1)); | |
2848 else | |
2849 return (FALSE); | |
2850 } | |
2851 | |
2852 /* Initialize a linebuffer for use */ | |
2853 | |
2854 void | |
2855 initbuffer (linebuffer) | |
2856 struct linebuffer *linebuffer; | |
2857 { | |
2858 linebuffer->size = 200; | |
2859 linebuffer->buffer = xnew (200, char); | |
2860 } | |
2861 | |
2862 /* | |
2863 * Read a line of text from `stream' into `linebuffer'. | |
2864 * Return the number of characters read from `stream', | |
2865 * which is the length of the line including the newline, if any. | |
2866 */ | |
2867 long | |
2868 readline (linebuffer, stream) | |
2869 struct linebuffer *linebuffer; | |
2870 register FILE *stream; | |
2871 { | |
2872 char *buffer = linebuffer->buffer; | |
2873 register char *p = linebuffer->buffer; | |
2874 register char *pend; | |
2875 int newline; /* 1 if ended with newline, 0 if ended with EOF */ | |
2876 | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3569
diff
changeset
|
2877 pend = p + linebuffer->size; /* Separate to avoid 386/IX compiler bug. */ |
240 | 2878 |
2879 while (1) | |
2880 { | |
2881 register int c = getc (stream); | |
2882 if (p == pend) | |
2883 { | |
2884 linebuffer->size *= 2; | |
2885 buffer = (char *) xrealloc (buffer, linebuffer->size); | |
2886 p += buffer - linebuffer->buffer; | |
2887 pend = buffer + linebuffer->size; | |
2888 linebuffer->buffer = buffer; | |
2889 } | |
2890 if (c < 0 || c == '\n') | |
2891 { | |
2892 *p = 0; | |
2893 newline = (c == '\n' ? 1 : 0); | |
2894 break; | |
2895 } | |
2896 *p++ = c; | |
2897 } | |
2898 | |
2899 return p - buffer + newline; | |
2900 } | |
2901 | |
2902 char * | |
2903 savestr (cp) | |
2904 char *cp; | |
2905 { | |
2906 return savenstr (cp, strlen (cp)); | |
2907 } | |
2908 | |
2909 char * | |
2910 savenstr (cp, len) | |
2911 char *cp; | |
2912 int len; | |
2913 { | |
2914 register char *dp; | |
2915 | |
2916 dp = xnew (len + 1, char); | |
2917 (void) strncpy (dp, cp, len); | |
2918 dp[len] = '\0'; | |
2919 return dp; | |
2920 } | |
2921 | |
2922 /* | |
2923 * Return the ptr in sp at which the character c last | |
2924 * appears; NULL if not found | |
2925 * | |
2926 * Identical to v7 rindex, included for portability. | |
2927 */ | |
2928 | |
2929 char * | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2930 etags_rindex (sp, c) |
240 | 2931 register char *sp, c; |
2932 { | |
2933 register char *r; | |
2934 | |
2935 r = NULL; | |
2936 do | |
2937 { | |
2938 if (*sp == c) | |
2939 r = sp; | |
2940 } while (*sp++); | |
2941 return (r); | |
2942 } | |
2943 | |
774 | 2944 |
240 | 2945 /* |
2946 * Return the ptr in sp at which the character c first | |
2947 * appears; NULL if not found | |
2948 * | |
2949 * Identical to v7 index, included for portability. | |
2950 */ | |
2951 | |
2952 char * | |
1026
cc96e2df9b71
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
774
diff
changeset
|
2953 etags_index (sp, c) |
240 | 2954 register char *sp, c; |
2955 { | |
2956 do | |
2957 { | |
2958 if (*sp == c) | |
2959 return (sp); | |
2960 } while (*sp++); | |
2961 return (NULL); | |
2962 } | |
2963 | |
2964 /* Print error message and exit. */ | |
2965 | |
2966 /* VARARGS1 */ | |
2967 void | |
2968 fatal (s1, s2) | |
2969 char *s1, *s2; | |
2970 { | |
2971 error (s1, s2); | |
2972 exit (1); | |
2973 } | |
2974 | |
2975 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | |
2976 | |
2977 /* VARARGS1 */ | |
2978 void | |
2979 error (s1, s2) | |
2980 char *s1, *s2; | |
2981 { | |
2982 fprintf (stderr, "%s: ", progname); | |
2983 fprintf (stderr, s1, s2); | |
2984 fprintf (stderr, "\n"); | |
2985 } | |
2986 | |
2987 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */ | |
2988 | |
2989 char * | |
2990 concat (s1, s2, s3) | |
2991 char *s1, *s2, *s3; | |
2992 { | |
2993 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3); | |
2994 char *result = xnew (len1 + len2 + len3 + 1, char); | |
2995 | |
2996 (void) strcpy (result, s1); | |
2997 (void) strcpy (result + len1, s2); | |
2998 (void) strcpy (result + len1 + len2, s3); | |
2999 *(result + len1 + len2 + len3) = 0; | |
3000 | |
3001 return result; | |
3002 } | |
3003 | |
3004 /* Like malloc but get fatal error if memory is exhausted. */ | |
3005 | |
3006 char * | |
3007 xmalloc (size) | |
3008 int size; | |
3009 { | |
3010 char *result = malloc (size); | |
3011 if (!result) | |
3012 fatal ("virtual memory exhausted", 0); | |
3013 return result; | |
3014 } | |
3015 | |
3016 char * | |
3017 xrealloc (ptr, size) | |
3018 char *ptr; | |
3019 int size; | |
3020 { | |
3021 char *result = realloc (ptr, size); | |
3022 if (!result) | |
3023 fatal ("virtual memory exhausted"); | |
3024 return result; | |
3025 } |