annotate lib-src/etags.c @ 2951:b694dfd2f40e

[xemacs-hg @ 2005-09-26 08:13:00 by ben] Compile Windows with gmp, ldap, postgresql, db, etc. README: Major rewrite. Document how to compile various optional libs. config.inc.samp: Update to recent versions of optional libs. Add support for gmp, db, postgresql, ldap. Turn on optimization when not debug. minitar.c: Include config.h. xemacs.mak: Figure out VC++ version and use it to set debug and browser flags appropriately. Add support for building gmp, db, postgresql, ldap. Rewrite handling of optional stuff so it is all added to single variables OPT_* rather than to various FOO_* variables. Pass -I$(SRC) to minitar.c so it compiles. Pass module sources, not objects, to make-docfile. Delete more stuff in `make clean'.
author ben
date Mon, 26 Sep 2005 08:13:00 +0000
parents 94f848eb8e4b
children 95be8ad778e3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1 /* Tags file maker to go with GNU Emacs -*- coding: latin-1 -*-
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
2 Copyright (C) 1984, 1987-1989, 1993-1995, 1998-2004
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Free Software Foundation, Inc. and Ken Arnold
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5 This file is not considered part of GNU Emacs.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
7 This program is free software; you can redistribute it and/or modify
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
8 it under the terms of the GNU General Public License as published by
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
9 the Free Software Foundation; either version 2 of the License, or
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
10 (at your option) any later version.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
11
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
12 This program is distributed in the hope that it will be useful,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
15 GNU General Public License for more details.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
16
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
17 You should have received a copy of the GNU General Public License
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
18 along with this program; if not, write to the Free Software Foundation,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
19 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 * Authors:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 * Ctags originally by Ken Arnold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 * Fortran added by Jim Kleckner.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 * Ed Pelegri-Llopart added C typedefs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 * Gnu Emacs TAGS format and modifications by RMS?
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
27 * 1989 Sam Kendall added C++.
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
28 * 1992 Joseph B. Wells improved C and C++ parsing.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
29 * 1993 Francesco Potort́ reorganised C and C++.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
30 * 1994 Line-by-line regexp tags by Tom Tromey.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
31 * 2001 Nested classes by Francesco Potort́ (concept by Mykola Dzyuba).
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
32 * 2002 #line directives by Francesco Potort́.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
34 * Francesco Potort́ <pot@gnu.org> has maintained and improved it since 1993.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
37 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
38 * If you want to add support for a new language, start by looking at the LUA
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
39 * language, which is the simplest. Alternatively, consider shipping a
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
40 * configuration file containing regexp definitions for etags.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
41 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
42
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
43 char pot_etags_version[] = "@(#) pot revision number is 17.11";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 #define TRUE 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #define FALSE 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
48 #ifdef DEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
49 # undef DEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
50 # define DEBUG TRUE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
51 #else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
52 # define DEBUG FALSE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
53 # define NDEBUG /* disable assert */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 #ifdef HAVE_CONFIG_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 # include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 /* On some systems, Emacs defines static as nothing for the sake
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 of unexec. We don't want that here since we don't use unexec. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 # undef static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 # define ETAGS_REGEXPS /* use the regexp features */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 # define LONG_OPTIONS /* accept long options */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
63 # ifndef PTR /* for XEmacs */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
64 # define PTR void *
715
add5a821a048 [xemacs-hg @ 2001-12-24 07:44:55 by yoshiki]
yoshiki
parents: 709
diff changeset
65 # endif
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
66 # ifndef __P /* for XEmacs */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
67 # define __P(args) args
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
68 # endif
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
69 #else /* no config.h */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
70 # if defined(__STDC__) && (__STDC__ || defined(__SUNPRO_C))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
71 # define __P(args) args /* use prototypes */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
72 # define PTR void * /* for generic pointers */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
73 # else /* not standard C */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
74 # define __P(args) () /* no prototypes */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
75 # define const /* remove const for old compilers' sake */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
76 # define PTR long * /* don't use void* */
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
77 # endif
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
78 #endif /* !HAVE_CONFIG_H */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79
432
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
80 #ifndef _GNU_SOURCE
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
81 # define _GNU_SOURCE 1 /* enables some compiler checks on GNU */
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
82 #endif
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
83
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
84 #ifdef LONG_OPTIONS
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
85 # undef LONG_OPTIONS
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
86 # define LONG_OPTIONS TRUE
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
87 #else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
88 # define LONG_OPTIONS FALSE
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
89 #endif
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
90
920
47ca978d6c75 [xemacs-hg @ 2002-07-14 14:23:43 by adrian]
adrian
parents: 771
diff changeset
91 /* WIN32_NATIVE is for XEmacs.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
92 MSDOS, WINDOWSNT, DOS_NT are for Emacs. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
93 #ifdef WIN32_NATIVE
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
94 # undef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
95 # undef WINDOWSNT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
96 # define WINDOWSNT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
97 #endif /* WIN32_NATIVE */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
98
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
99 #ifdef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
100 # undef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
101 # define MSDOS TRUE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
102 # include <fcntl.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
103 # include <sys/param.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
104 # include <io.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
105 # ifndef HAVE_CONFIG_H
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
106 # define DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
107 # include <sys/config.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
108 # endif
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
109 #else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
110 # define MSDOS FALSE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
111 #endif /* MSDOS */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
112
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
113 #ifdef WINDOWSNT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 # include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 # include <fcntl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 # include <string.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
117 # include <direct.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 # include <io.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 # define MAXPATHLEN _MAX_PATH
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
120 # undef HAVE_NTGUI
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
121 # undef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
122 # define DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 # ifndef HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 # define HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 # endif /* undef HAVE_GETCWD */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
126 #else /* not WINDOWSNT */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
127 # ifdef STDC_HEADERS
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
128 # include <stdlib.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
129 # include <string.h>
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
130 # else /* no standard C headers */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
131 extern char *getenv ();
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
132 # ifdef VMS
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
133 # define EXIT_SUCCESS 1
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
134 # define EXIT_FAILURE 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
135 # else /* no VMS */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
136 # define EXIT_SUCCESS 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
137 # define EXIT_FAILURE 1
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
138 # endif
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
139 # endif
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
140 #endif /* !WINDOWSNT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 #ifdef HAVE_UNISTD_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 # include <unistd.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 #else
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
145 # if defined (HAVE_GETCWD) && !defined (WINDOWSNT)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
146 extern char *getcwd (char *buf, size_t size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 #endif /* HAVE_UNISTD_H */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 #include <ctype.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 #include <errno.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
153 #ifndef errno
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
154 extern int errno;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
155 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 #include <sys/stat.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
159 #include <assert.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
160 #ifdef NDEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
161 # undef assert /* some systems have a buggy assert.h */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
162 # define assert(x) ((void) 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
163 #endif
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
164
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 #if !defined (S_ISREG) && defined (S_IFREG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
169 #if LONG_OPTIONS
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 # include <getopt.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 # define getopt_long(argc,argv,optstr,lopts,lind) getopt (argc, argv, optstr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 extern char *optarg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 extern int optind, opterr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 #endif /* LONG_OPTIONS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 #ifdef ETAGS_REGEXPS
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
178 # ifndef HAVE_CONFIG_H /* this is a standalone compilation */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
179 # ifdef __CYGWIN__ /* compiling on Cygwin */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
180 !!! NOTICE !!!
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
181 the regex.h distributed with Cygwin is not compatible with etags, alas!
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
182 If you want regular expression support, you should delete this notice and
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
183 arrange to use the GNU regex.h and regex.c.
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
184 # endif
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
185 # endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 # include <regex.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 #endif /* ETAGS_REGEXPS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 /* Define CTAGS to make the program "ctags" compatible with the usual one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 Leave it undefined to make the program "etags", which makes emacs-style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 tag tables and tags typedefs, #defines and struct/union/enum by default. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 #ifdef CTAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 # undef CTAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 # define CTAGS TRUE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 # define CTAGS FALSE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
199 #define streq(s,t) (assert((s)!=NULL || (t)!=NULL), !strcmp (s, t))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
200 #define strcaseeq(s,t) (assert((s)!=NULL && (t)!=NULL), !etags_strcasecmp (s, t))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
201 #define strneq(s,t,n) (assert((s)!=NULL || (t)!=NULL), !strncmp (s, t, n))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
202 #define strncaseeq(s,t,n) (assert((s)!=NULL && (t)!=NULL), !etags_strncasecmp (s, t, n))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 #define CHARS 256 /* 2^sizeof(char) */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
205 #define CHAR(x) ((unsigned int)(x) & (CHARS - 1))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
206 #define iswhite(c) (_wht[CHAR(c)]) /* c is white (see white) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
207 #define notinname(c) (_nin[CHAR(c)]) /* c is not in a name (see nonam) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
208 #define begtoken(c) (_btk[CHAR(c)]) /* c can start token (see begtk) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
209 #define intoken(c) (_itk[CHAR(c)]) /* c can be in token (see midtk) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
210 #define endtoken(c) (_etk[CHAR(c)]) /* c ends tokens (see endtk) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
212 #define ISALNUM(c) isalnum (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
213 #define ISALPHA(c) isalpha (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
214 #define ISDIGIT(c) isdigit (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
215 #define ISLOWER(c) islower (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
216
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
217 #define lowcase(c) tolower (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
218 #define upcase(c) toupper (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
219
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 * xnew, xrnew -- allocate, reallocate storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 * SYNOPSIS: Type *xnew (int n, Type);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
225 * void xrnew (OldPointer, int n, Type);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
227 #if DEBUG
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 # include "chkmalloc.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 # define xnew(n,Type) ((Type *) trace_malloc (__FILE__, __LINE__, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (n) * sizeof (Type)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
231 # define xrnew(op,n,Type) ((op) = (Type *) trace_realloc (__FILE__, __LINE__, \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
232 (char *) (op), (n) * sizeof (Type)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 # define xnew(n,Type) ((Type *) xmalloc ((n) * sizeof (Type)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
235 # define xrnew(op,n,Type) ((op) = (Type *) xrealloc ( \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
236 (char *) (op), (n) * sizeof (Type)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
239 #define bool int
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
240
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
241 typedef void Lang_function __P((FILE *));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
245 char *suffix; /* file name suffix for this compressor */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
246 char *command; /* takes one arg and decompresses to stdout */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 } compressor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
251 char *name; /* language name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
252 char *help; /* detailed help for the language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
253 Lang_function *function; /* parse function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
254 char **suffixes; /* name suffixes of this language's files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
255 char **filenames; /* names of this language's files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
256 char **interpreters; /* interpreters for this language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
257 bool metasource; /* source used to generate other sources */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 } language;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
260 typedef struct fdesc
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
261 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
262 struct fdesc *next; /* for the linked list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
263 char *infname; /* uncompressed input file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
264 char *infabsname; /* absolute uncompressed input file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
265 char *infabsdir; /* absolute dir of input file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
266 char *taggedfname; /* file name to write in tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
267 language *lang; /* language of file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
268 char *prop; /* file properties to write in tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
269 bool usecharno; /* etags tags shall contain char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
270 bool written; /* entry written in the tags file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
271 } fdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
272
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 typedef struct node_st
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
274 { /* sorting structure */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
275 struct node_st *left, *right; /* left and right sons */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
276 fdesc *fdp; /* description of file to whom tag belongs */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
277 char *name; /* tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
278 char *regex; /* search regexp */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
279 bool valid; /* write this tag on the tag file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
280 bool is_func; /* function tag: use regexp in CTAGS mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
281 bool been_warned; /* warning already given for duplicated tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
282 int lno; /* line number tag is on */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 long cno; /* character number line starts on */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 } node;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 * A `linebuffer' is a structure which holds a line of text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 * `readline_internal' reads a line from a stream into a linebuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 * and works regardless of the length of the line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 * SIZE is the size of BUFFER, LEN is the length of the string in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 * BUFFER after readline reads it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 long size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 char *buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 } linebuffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
300 /* Used to support mixing of --lang and file names. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
301 typedef struct
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
302 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
303 enum {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
304 at_language, /* a language specification */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
305 at_regexp, /* a regular expression */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
306 at_filename, /* a file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
307 at_stdin, /* read from stdin here */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
308 at_end /* stop parsing the list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
309 } arg_type; /* argument type */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
310 language *lang; /* language associated with the argument */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
311 char *what; /* the argument itself */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
312 } argument;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
313
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
314 #ifdef ETAGS_REGEXPS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
315 /* Structure defining a regular expression. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
316 typedef struct regexp
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
317 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
318 struct regexp *p_next; /* pointer to next in list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
319 language *lang; /* if set, use only for this language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
320 char *pattern; /* the regexp pattern */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
321 char *name; /* tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
322 struct re_pattern_buffer *pat; /* the compiled pattern */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
323 struct re_registers regs; /* re registers */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
324 bool error_signaled; /* already signaled for this regexp */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
325 bool force_explicit_name; /* do not allow implict tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
326 bool ignore_case; /* ignore case when matching */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
327 bool multi_line; /* do a multi-line match on the whole file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
328 } regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
329 #endif /* ETAGS_REGEXPS */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
330
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
331
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 /* Many compilers barf on this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 Lang_function Ada_funcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 so let's write it this way */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
335 static void Ada_funcs __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
336 static void Asm_labels __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
337 static void C_entries __P((int c_ext, FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
338 static void default_C_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
339 static void plain_C_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
340 static void Cjava_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
341 static void Cobol_paragraphs __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
342 static void Cplusplus_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
343 static void Cstar_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
344 static void Erlang_functions __P((FILE *));
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
345 static void Forth_words __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
346 static void Fortran_functions __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
347 static void HTML_labels __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
348 static void Lisp_functions __P((FILE *));
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
349 static void Lua_functions __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
350 static void Makefile_targets __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
351 static void Pascal_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
352 static void Perl_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
353 static void PHP_functions __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
354 static void PS_functions __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
355 static void Prolog_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
356 static void Python_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
357 static void Scheme_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
358 static void TeX_commands __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
359 static void Texinfo_nodes __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
360 static void Yacc_entries __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
361 static void just_read_file __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
362
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
363 static void print_language_names __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
364 static void print_version __P((void));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
365 static void print_help __P((argument *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
366 int main __P((int, char **));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
367
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
368 static compressor *get_compressor_from_suffix __P((char *, char **));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
369 static language *get_language_from_langname __P((const char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
370 static language *get_language_from_interpreter __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
371 static language *get_language_from_filename __P((char *, bool));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
372 static void readline __P((linebuffer *, FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
373 static long readline_internal __P((linebuffer *, FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
374 static bool nocase_tail __P((char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
375 static void get_tag __P((char *, char **));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
378 static void analyse_regex __P((char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
379 static void free_regexps __P((void));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
380 static void regex_tag_multiline __P((void));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 #endif /* ETAGS_REGEXPS */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
382 static void error __P((const char *, const char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
383 static void suggest_asking_for_help __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
384 void fatal __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
385 static void pfatal __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
386 static void add_node __P((node *, node **));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
387
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
388 static void init __P((void));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
389 static void process_file_name __P((char *, language *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
390 static void process_file __P((FILE *, char *, language *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
391 static void find_entries __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
392 static void free_tree __P((node *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
393 static void free_fdesc __P((fdesc *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
394 static void pfnote __P((char *, bool, char *, int, int, long));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
395 static void make_tag __P((char *, int, bool, char *, int, int, long));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
396 static void invalidate_nodes __P((fdesc *, node **));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
397 static void put_entries __P((node *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
398
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
399 static char *concat __P((char *, char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
400 static char *skip_spaces __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
401 static char *skip_non_spaces __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
402 static char *savenstr __P((char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
403 static char *savestr __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
404 static char *etags_strchr __P((const char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
405 static char *etags_strrchr __P((const char *, int));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
406 static int etags_strcasecmp __P((const char *, const char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
407 static int etags_strncasecmp __P((const char *, const char *, int));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
408 static char *etags_getcwd __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
409 static char *relative_filename __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
410 static char *absolute_filename __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
411 static char *absolute_dirname __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
412 static bool filename_is_absolute __P((char *f));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
413 static void canonicalize_filename __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
414 static void linebuffer_init __P((linebuffer *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
415 static void linebuffer_setlen __P((linebuffer *, int));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
416 static PTR xmalloc __P((unsigned int));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
417 static PTR xrealloc __P((char *, unsigned int));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
420 static char searchar = '/'; /* use /.../ searches */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
421
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
422 static char *tagfile; /* output file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
423 static char *progname; /* name this program was invoked with */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
424 static char *cwd; /* current working directory */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
425 static char *tagfiledir; /* directory of tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
426 static FILE *tagf; /* ioptr for tags file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
427
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
428 static fdesc *fdhead; /* head of file description list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
429 static fdesc *curfdp; /* current file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
430 static int lineno; /* line number of current line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
431 static long charno; /* current character number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
432 static long linecharno; /* charno of start of current line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
433 static char *dbp; /* pointer to start of current tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
434
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
435 static const int invalidcharno = -1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
436
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
437 static node *nodehead; /* the head of the binary tree of tags */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
438 static node *last_node; /* the last node created */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
439
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
440 static linebuffer lb; /* the current line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
441 static linebuffer filebuf; /* a buffer containing the whole file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
442 static linebuffer token_name; /* a buffer containing a tag name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 /* boolean "functions" (see init) */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
445 static bool _wht[CHARS], _nin[CHARS], _itk[CHARS], _btk[CHARS], _etk[CHARS];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
446 static char
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 /* white chars */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
448 *white = " \f\t\n\r\v",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 /* not in a name */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
450 *nonam = " \f\t\n\r()=,;", /* look at make_tag before modifying! */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 /* token ending chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 *endtk = " \t\n\r\"'#()[]{}=-+%*/&|^~!<>;,.:?",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 /* token starting chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$~@",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 /* valid in-token chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 *midtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
458 static bool append_to_tagfile; /* -a: append to tags */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
459 /* The next four default to TRUE for etags, but to FALSE for ctags. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
460 static bool typedefs; /* -t: create tags for C and Ada typedefs */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
461 static bool typedefs_or_cplusplus; /* -T: create tags for C typedefs, level */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 /* 0 struct/enum/union decls, and C++ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 /* member functions. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
464 static bool constantypedefs; /* -d: create tags for C #define, enum */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 /* constants and variables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 /* -D: opposite of -d. Default under ctags. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
467 static bool globals; /* create tags for global variables */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
468 static bool declarations; /* --declarations: tag them and extern in C&Co*/
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
469 static bool members; /* create tags for C member variables */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
470 static bool no_line_directive; /* ignore #line directives (undocumented) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
471 static bool update; /* -u: update tags */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
472 static bool vgrind_style; /* -v: create vgrind style index output */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
473 static bool no_warnings; /* -w: suppress warnings */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
474 static bool cxref_style; /* -x: create cxref style output */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
475 static bool cplusplus; /* .[hc] means C++, not C */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
476 static bool ignoreindent; /* -I: ignore indentation in C */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
477 static bool packages_only; /* --packages-only: in Ada, only tag packages*/
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
478
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
479 #define STDIN 0x1001 /* returned by getopt_long on --parse-stdin */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
480 static bool parsing_stdin; /* --parse-stdin used */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
481
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
482 #ifdef ETAGS_REGEXPS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
483 static regexp *p_head; /* list of all regexps */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
484 static bool need_filebuf; /* some regexes are multi-line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
485 #else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
486 # define need_filebuf FALSE
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
487 #endif /* ETAGS_REGEXPS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
489 #if LONG_OPTIONS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
490 static struct option longopts[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
492 { "packages-only", no_argument, &packages_only, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
493 { "c++", no_argument, NULL, 'C' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
494 { "declarations", no_argument, &declarations, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
495 { "no-line-directive", no_argument, &no_line_directive, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
496 { "help", no_argument, NULL, 'h' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
497 { "help", no_argument, NULL, 'H' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
498 { "ignore-indentation", no_argument, NULL, 'I' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
499 { "language", required_argument, NULL, 'l' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
500 { "members", no_argument, &members, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
501 { "no-members", no_argument, &members, FALSE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
502 { "output", required_argument, NULL, 'o' },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
504 { "regex", required_argument, NULL, 'r' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
505 { "no-regex", no_argument, NULL, 'R' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
506 { "ignore-case-regex", required_argument, NULL, 'c' },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 #endif /* ETAGS_REGEXPS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
508 { "parse-stdin", required_argument, NULL, STDIN },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
509 { "version", no_argument, NULL, 'V' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
510
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
511 #if CTAGS /* Etags options */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
512 { "backward-search", no_argument, NULL, 'B' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
513 { "cxref", no_argument, NULL, 'x' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
514 { "defines", no_argument, NULL, 'd' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
515 { "globals", no_argument, &globals, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
516 { "typedefs", no_argument, NULL, 't' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
517 { "typedefs-and-c++", no_argument, NULL, 'T' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
518 { "update", no_argument, NULL, 'u' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
519 { "vgrind", no_argument, NULL, 'v' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
520 { "no-warn", no_argument, NULL, 'w' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
521
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
522 #else /* Ctags options */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
523 { "append", no_argument, NULL, 'a' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
524 { "no-defines", no_argument, NULL, 'D' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
525 { "no-globals", no_argument, &globals, FALSE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
526 { "include", required_argument, NULL, 'i' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
527 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 { NULL }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 #endif /* LONG_OPTIONS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
532 static compressor compressors[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 { "z", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 { "Z", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 { "gz", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 { "GZ", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 { "bz2", "bzip2 -d -c" },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 { NULL }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 * Language stuff.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 /* Ada code */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
547 static char *Ada_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 { "ads", "adb", "ada", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
549 static char Ada_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
550 "In Ada code, functions, procedures, packages, tasks and types are\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
551 tags. Use the `--packages-only' option to create tags for\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
552 packages only.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
553 Ada tag names have suffixes indicating the type of entity:\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
554 Entity type: Qualifier:\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
555 ------------ ----------\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
556 function /f\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
557 procedure /p\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
558 package spec /s\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
559 package body /b\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
560 type /t\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
561 task /k\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
562 Thus, `M-x find-tag <RET> bidule/b <RET>' will go directly to the\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
563 body of the package `bidule', while `M-x find-tag <RET> bidule <RET>'\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
564 will just search for any tag `bidule'.";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 /* Assembly code */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
567 static char *Asm_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
568 { "a", /* Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
569 "asm", /* Microcontroller assembly */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
570 "def", /* BSO/Tasking definition includes */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
571 "inc", /* Microcontroller include files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
572 "ins", /* Microcontroller include files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
573 "s", "sa", /* Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
574 "S", /* cpp-processed Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
575 "src", /* BSO/Tasking C compiler output */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
576 NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
577 };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
578 static char Asm_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
579 "In assembler code, labels appearing at the beginning of a line,\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
580 followed by a colon, are tags.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
581
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 /* Note that .c and .h can be considered C++, if the --c++ flag was
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
584 given, or if the `class' or `template' keyowrds are met inside the file.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
585 That is why default_C_entries is called for these. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
586 static char *default_C_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 { "c", "h", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
588 static char default_C_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
589 "In C code, any C function or typedef is a tag, and so are\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
590 definitions of `struct', `union' and `enum'. `#define' macro\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
591 definitions and `enum' constants are tags unless you specify\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
592 `--no-defines'. Global variables are tags unless you specify\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
593 `--no-globals'. Use of `--no-globals' and `--no-defines'\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
594 can make the tags table file much smaller.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
595 You can tag function declarations and external variables by\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
596 using `--declarations', and struct members by using `--members'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
597
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
598 static char *Cplusplus_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
599 { "C", "c++", "cc", "cpp", "cxx", "H", "h++", "hh", "hpp", "hxx",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 "M", /* Objective C++ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 "pdb", /* Postscript with C syntax */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
603 static char Cplusplus_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
604 "In C++ code, all the tag constructs of C code are tagged. (Use\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
605 --help --lang=c --lang=c++ for full help.)\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
606 In addition to C tags, member functions are also recognized, and\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
607 optionally member variables if you use the `--members' option.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
608 Tags for variables and functions in classes are named `CLASS::VARIABLE'\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
609 and `CLASS::FUNCTION'. `operator' definitions have tag names like\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
610 `operator+'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
611
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
612 static char *Cjava_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 { "java", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
614 static char Cjava_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
615 "In Java code, all the tags constructs of C and C++ code are\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
616 tagged. (Use --help --lang=c --lang=c++ --lang=java for full help.)";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
617
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
618
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
619 static char *Cobol_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 { "COB", "cob", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
621 static char Cobol_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
622 "In Cobol code, tags are paragraph names; that is, any word\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
623 starting in column 8 and followed by a period.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
624
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
625 static char *Cstar_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 { "cs", "hs", NULL };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
628 static char *Erlang_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 { "erl", "hrl", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
630 static char Erlang_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
631 "In Erlang code, the tags are the functions, records and macros\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
632 defined in the file.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
633
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
634 char *Forth_suffixes [] =
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
635 { "fth", "tok", NULL };
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
636 static char Forth_help [] =
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
637 "In Forth code, tags are words defined by `:',\n\
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
638 constant, code, create, defer, value, variable, buffer:, field.";
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
639
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
640 static char *Fortran_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 { "F", "f", "f90", "for", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
642 static char Fortran_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
643 "In Fortran code, functions, subroutines and block data are tags.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
644
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
645 static char *HTML_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
646 { "htm", "html", "shtml", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
647 static char HTML_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
648 "In HTML input files, the tags are the `title' and the `h1', `h2',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
649 `h3' headers. Also, tags are `name=' in anchors and all\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
650 occurrences of `id='.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
651
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
652 static char *Lisp_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
653 { "cl", "clisp", "el", "l", "lisp", "LSP", "lsp", "ml", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
654 static char Lisp_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
655 "In Lisp code, any function defined with `defun', any variable\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
656 defined with `defvar' or `defconst', and in general the first\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
657 argument of any expression that starts with `(def' in column zero\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
658 is a tag.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
659
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
660 static char *Lua_suffixes [] =
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
661 { "lua", "LUA", NULL };
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
662 static char Lua_help [] =
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
663 "In Lua scripts, all functions are tags.";
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
664
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
665 static char *Makefile_filenames [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
666 { "Makefile", "makefile", "GNUMakefile", "Makefile.in", "Makefile.am", NULL};
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
667 static char Makefile_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
668 "In makefiles, targets are tags; additionally, variables are tags\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
669 unless you specify `--no-globals'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
670
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
671 static char *Objc_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
672 { "lm", /* Objective lex file */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 "m", /* Objective C file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
675 static char Objc_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
676 "In Objective C code, tags include Objective C definitions for classes,\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
677 class categories, methods and protocols. Tags for variables and\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
678 functions in classes are named `CLASS::VARIABLE' and `CLASS::FUNCTION'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
679
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
680 static char *Pascal_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
681 { "p", "pas", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
682 static char Pascal_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
683 "In Pascal code, the tags are the functions and procedures defined\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
684 in the file.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
685
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
686 static char *Perl_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
687 { "pl", "pm", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
688 static char *Perl_interpreters [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
689 { "perl", "@PERL@", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
690 static char Perl_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
691 "In Perl code, the tags are the packages, subroutines and variables\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
692 defined by the `package', `sub', `my' and `local' keywords. Use\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
693 `--globals' if you want to tag global variables. Tags for\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
694 subroutines are named `PACKAGE::SUB'. The name for subroutines\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
695 defined in the default package is `main::SUB'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
696
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
697 static char *PHP_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
698 { "php", "php3", "php4", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
699 static char PHP_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
700 "In PHP code, tags are functions, classes and defines. When using\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
701 the `--members' option, vars are tags too.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
702
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
703 static char *plain_C_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
704 { "pc", /* Pro*C file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
705 NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
706
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
707 static char *PS_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 { "ps", "psw", NULL }; /* .psw is for PSWrap */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
709 static char PS_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
710 "In PostScript code, the tags are the functions.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
711
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
712 static char *Prolog_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 { "prolog", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
714 static char Prolog_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
715 "In Prolog code, tags are predicates and rules at the beginning of\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
716 line.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
717
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
718 static char *Python_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 { "py", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
720 static char Python_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
721 "In Python code, `def' or `class' at the beginning of a line\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
722 generate a tag.";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 /* Can't do the `SCM' or `scm' prefix with a version number. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
725 static char *Scheme_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
726 { "oak", "sch", "scheme", "SCM", "scm", "SM", "sm", "ss", "t", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
727 static char Scheme_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
728 "In Scheme code, tags include anything defined with `def' or with a\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
729 construct whose name starts with `def'. They also include\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
730 variables set with `set!' at top level in the file.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
731
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
732 static char *TeX_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
733 { "bib", "clo", "cls", "ltx", "sty", "TeX", "tex", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
734 static char TeX_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
735 "In LaTeX text, the argument of any of the commands `\\chapter',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
736 `\\section', `\\subsection', `\\subsubsection', `\\eqno', `\\label',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
737 `\\ref', `\\cite', `\\bibitem', `\\part', `\\appendix', `\\entry',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
738 `\\index', `\\def', `\\newcommand', `\\renewcommand',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
739 `\\newenvironment' or `\\renewenvironment' is a tag.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
740 \n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
741 Other commands can be specified by setting the environment variable\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
742 `TEXTAGS' to a colon-separated list like, for example,\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
743 TEXTAGS=\"mycommand:myothercommand\".";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
744
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
745
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
746 static char *Texinfo_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
747 { "texi", "texinfo", "txi", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
748 static char Texinfo_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
749 "for texinfo files, lines starting with @node are tagged.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
750
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
751 static char *Yacc_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
752 { "y", "y++", "ym", "yxx", "yy", NULL }; /* .ym is Objective yacc file */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
753 static char Yacc_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
754 "In Bison or Yacc input files, each rule defines as a tag the\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
755 nonterminal it constructs. The portions of the file that contain\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
756 C code are parsed as C code (use --help --lang=c --lang=yacc\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
757 for full help).";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
758
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
759 static char auto_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
760 "`auto' is not a real language, it indicates to use\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
761 a default language for files base on file name suffix and file contents.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
762
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
763 static char none_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
764 "`none' is not a real language, it indicates to only do\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
765 regexp processing on files.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
766
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
767 static char no_lang_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
768 "No detailed help available for this language.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
769
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 * Table of languages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 * It is ok for a given function to be listed under more than one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 * name. I just didn't.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
778 static language lang_names [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
780 { "ada", Ada_help, Ada_funcs, Ada_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
781 { "asm", Asm_help, Asm_labels, Asm_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
782 { "c", default_C_help, default_C_entries, default_C_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
783 { "c++", Cplusplus_help, Cplusplus_entries, Cplusplus_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
784 { "c*", no_lang_help, Cstar_entries, Cstar_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
785 { "cobol", Cobol_help, Cobol_paragraphs, Cobol_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
786 { "erlang", Erlang_help, Erlang_functions, Erlang_suffixes },
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
787 { "forth", Forth_help, Forth_words, Forth_suffixes },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
788 { "fortran", Fortran_help, Fortran_functions, Fortran_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
789 { "html", HTML_help, HTML_labels, HTML_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
790 { "java", Cjava_help, Cjava_entries, Cjava_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
791 { "lisp", Lisp_help, Lisp_functions, Lisp_suffixes },
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
792 { "lua", Lua_help, Lua_functions, Lua_suffixes },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
793 { "makefile", Makefile_help,Makefile_targets,NULL,Makefile_filenames},
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
794 { "objc", Objc_help, plain_C_entries, Objc_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
795 { "pascal", Pascal_help, Pascal_functions, Pascal_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
796 { "perl",Perl_help,Perl_functions,Perl_suffixes,NULL,Perl_interpreters},
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
797 { "php", PHP_help, PHP_functions, PHP_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
798 { "postscript",PS_help, PS_functions, PS_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
799 { "proc", no_lang_help, plain_C_entries, plain_C_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
800 { "prolog", Prolog_help, Prolog_functions, Prolog_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
801 { "python", Python_help, Python_functions, Python_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
802 { "scheme", Scheme_help, Scheme_functions, Scheme_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
803 { "tex", TeX_help, TeX_commands, TeX_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
804 { "texinfo", Texinfo_help, Texinfo_nodes, Texinfo_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
805 { "yacc", Yacc_help,Yacc_entries,Yacc_suffixes,NULL,NULL,TRUE},
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
806 { "auto", auto_help }, /* default guessing scheme */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
807 { "none", none_help, just_read_file }, /* regexp matching only */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
808 { NULL } /* end of list */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 };
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
810
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 print_language_names ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 language *lang;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
816 char **name, **ext;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 puts ("\nThese are the currently supported languages, along with the\n\
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
819 default file names and dot suffixes:");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
822 printf (" %-*s", 10, lang->name);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
823 if (lang->filenames != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
824 for (name = lang->filenames; *name != NULL; name++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
825 printf (" %s", *name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 if (lang->suffixes != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 for (ext = lang->suffixes; *ext != NULL; ext++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 printf (" .%s", *ext);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 puts ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
831 puts ("where `auto' means use default language for files based on file\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 name suffix, and `none' means only do regexp processing on files.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 If no language is specified and no matching suffix is found,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 the first line of the file is read for a sharp-bang (#!) sequence\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 followed by the name of an interpreter. If no such sequence is found,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 Fortran is tried first; if no tags are found, C is tried next.\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
837 When parsing any C file, a \"class\" or \"template\" keyword\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
838 switches to C++.");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
839 puts ("Compressed files are supported using gzip and bzip2.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
840 \n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
841 For detailed help on a given language use, for example,\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
842 etags --help --lang=ada.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
845 #ifndef EMACS_NAME
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
846 # define EMACS_NAME "standalone"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 #ifndef VERSION
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
849 # define VERSION "version"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 print_version ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
854 printf ("%s (%s %s)\n", (CTAGS) ? "ctags" : "etags", EMACS_NAME, VERSION);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
855 puts ("Copyright (C) 2002 Free Software Foundation, Inc. and Ken Arnold");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 puts ("This program is distributed under the same terms as Emacs");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
858 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
862 print_help (argbuffer)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
863 argument *argbuffer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
865 bool help_for_lang = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
866
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
867 for (; argbuffer->arg_type != at_end; argbuffer++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
868 if (argbuffer->arg_type == at_language)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
869 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
870 if (help_for_lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
871 puts ("");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
872 puts (argbuffer->lang->help);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
873 help_for_lang = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
874 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
875
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
876 if (help_for_lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
877 exit (EXIT_SUCCESS);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
878
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 printf ("Usage: %s [options] [[regex-option ...] file-name] ...\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 \n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 These are the options accepted by %s.\n", progname, progname);
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
882 if (LONG_OPTIONS)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
883 puts ("You may use unambiguous abbreviations for the long option names.");
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
884 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
885 puts ("Long option names do not work with this executable, as it is not\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 linked with GNU getopt.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
887 puts (" A - as file name means read names from stdin (one per line).\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
888 Absolute names are stored in the output file as they are.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
889 Relative ones are stored relative to the output file's directory.\n");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
890
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
892 puts ("-a, --append\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 Append tag entries to existing tags file.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 puts ("--packages-only\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
896 For Ada files, only generate tags for packages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 puts ("-B, --backward-search\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 Write the search commands for the tag entries using '?', the\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 backward-search command instead of '/', the forward-search command.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
903 /* This option is mostly obsolete, because etags can now automatically
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
904 detect C++. Retained for backward compatibility and for debugging and
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
905 experimentation. In principle, we could want to tag as C++ even
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
906 before any "class" or "template" keyword.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 puts ("-C, --c++\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 Treat files whose name suffix defaults to C language as C++ files.");
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
909 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 puts ("--declarations\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 In C and derived languages, create tags for function declarations,");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 puts ("\tand create tags for extern variables if --globals is used.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 puts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 ("\tand create tags for extern variables unless --no-globals is used.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 puts ("-d, --defines\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 Create tag entries for C #define constants and enum constants, too.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 puts ("-D, --no-defines\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 Don't create tag entries for C #define constants and enum constants.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 This makes the tags file smaller.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
928 puts ("-i FILE, --include=FILE\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 Include a note in tag file indicating that, when searching for\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 a tag, one should also consult the tags file FILE after\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 checking the current file.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
932
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
933 puts ("-l LANG, --language=LANG\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 Force the following files to be considered as written in the\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 named language up to the next --language=LANG option.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 puts ("--globals\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 Create tag entries for global variables in some languages.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 puts ("--no-globals\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 Do not create tag entries for global variables in some\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 languages. This makes the tags file smaller.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 puts ("--members\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
945 Create tag entries for members of structures in some languages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
948 puts ("-r REGEXP, --regex=REGEXP or --regex=@regexfile\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
949 Make a tag for each line matching a regular expression pattern\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
950 in the following files. {LANGUAGE}REGEXP uses REGEXP for LANGUAGE\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
951 files only. REGEXFILE is a file containing one REGEXP per line.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
952 REGEXP takes the form /TAGREGEXP/TAGNAME/MODS, where TAGNAME/ is\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
953 optional. The TAGREGEXP pattern is anchored (as if preceded by ^).");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
954 puts (" If TAGNAME/ is present, the tags created are named.\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 For example Tcl named tags can be created with:\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
956 --regex=\"/proc[ \\t]+\\([^ \\t]+\\)/\\1/.\".\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
957 MODS are optional one-letter modifiers: `i' means to ignore case,\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
958 `m' means to allow multi-line matches, `s' implies `m' and\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
959 causes dot to match any character, including newline.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 puts ("-R, --no-regex\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 Don't create tags from regexps for the following files.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 #endif /* ETAGS_REGEXPS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
963 puts ("-I, --ignore-indentation\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
964 In C and C++ do not assume that a closing brace in the first\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
965 column is the final brace of a function or structure definition.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 puts ("-o FILE, --output=FILE\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 Write the tags to FILE.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
968 puts ("--parse-stdin=NAME\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
969 Read from standard input and record tags as belonging to file NAME.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 puts ("-t, --typedefs\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 Generate tag entries for C and Ada typedefs.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 puts ("-T, --typedefs-and-c++\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 Generate tag entries for C typedefs, C struct/enum/union tags,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 and C++ member functions.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
978 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
979
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
980 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
981 puts ("-u, --update\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 Update the tag entries for the given files, leaving tag\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 entries for other files in place. Currently, this is\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 implemented by deleting the existing entries for the given\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 files and then rewriting the new entries at the end of the\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 tags file. It is often faster to simply rebuild the entire\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 tag file than to use this.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
988
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
989 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
990 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 puts ("-v, --vgrind\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 Generates an index of items intended for human consumption,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 similar to the output of vgrind. The index is sorted, and\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 gives the page number of each item.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 puts ("-w, --no-warn\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 Suppress warning messages about entries defined in multiple\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 files.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 puts ("-x, --cxref\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 Like --vgrind, but in the style of cxref, rather than vgrind.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 The output uses line numbers instead of page numbers, but\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 beyond that the differences are cosmetic; try both to see\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 which you like.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 puts ("-V, --version\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 Print the version of the program.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 -h, --help\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1008 Print this help message.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1009 Followed by one or more `--language' options prints detailed\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1010 help about tag generation for the specified languages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 print_language_names ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 puts ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 puts ("Report bugs to bug-gnu-emacs@gnu.org");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1017 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 #ifdef VMS /* VMS specific functions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 #define EOS '\0'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 /* This is a BUG! ANY arbitrary limit is a BUG!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 Won't someone please fix this? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 #define MAX_FILE_SPEC_LEN 255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 typedef struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 short curlen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 char body[MAX_FILE_SPEC_LEN + 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 } vspec;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 v1.05 nmm 26-Jun-86 fn_exp - expand specification of list of file names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 returning in each successive call the next file name matching the input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 spec. The function expects that each in_spec passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 to it will be processed to completion; in particular, up to and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 including the call following that in which the last matching name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 is returned, the function ignores the value of in_spec, and will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 only start processing a new spec with the following call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 If an error occurs, on return out_spec contains the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 of in_spec when the error occurred.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 With each successive file name returned in out_spec, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 function's return value is one. When there are no more matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 names the function returns zero. If on the first call no file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 matches in_spec, or there is any other error, -1 is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 #include <rmsdef.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 #include <descrip.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 #define OUTSIZE MAX_FILE_SPEC_LEN
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1053 static short
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 fn_exp (out, in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 vspec *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 char *in;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 static long context = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 static struct dsc$descriptor_s o;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 static struct dsc$descriptor_s i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 static bool pass1 = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 long status;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 short retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 if (pass1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 pass1 = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 o.dsc$a_pointer = (char *) out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 o.dsc$w_length = (short)OUTSIZE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 i.dsc$a_pointer = in;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 i.dsc$w_length = (short)strlen(in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 i.dsc$b_dtype = DSC$K_DTYPE_T;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 i.dsc$b_class = DSC$K_CLASS_S;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 o.dsc$b_dtype = DSC$K_DTYPE_VT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 o.dsc$b_class = DSC$K_CLASS_VS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 if ((status = lib$find_file(&i, &o, &context, 0, 0)) == RMS$_NORMAL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 out->body[out->curlen] = EOS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 else if (status == RMS$_NMF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 retval = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 strcpy(out->body, in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 retval = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 lib$find_file_end(&context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 pass1 = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 v1.01 nmm 19-Aug-85 gfnames - return in successive calls the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 name of each file specified by the provided arg expanding wildcards.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1098 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 gfnames (arg, p_error)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 char *arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 bool *p_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 static vspec filename = {MAX_FILE_SPEC_LEN, "\0"};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 switch (fn_exp (&filename, arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 case 1:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 *p_error = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 return filename.body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 case 0:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 *p_error = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 *p_error = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 return filename.body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 #ifndef OLD /* Newer versions of VMS do provide `system'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 system (cmd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 char *cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 error ("%s", "system() function not implemented under VMS");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 #define VERSION_DELIM ';'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 char *massage_name (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 char *start = s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 for ( ; *s; s++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 if (*s == VERSION_DELIM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 *s = EOS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 *s = lowcase (*s);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 return start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 #endif /* VMS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 main (argc, argv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 int argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 char *argv[];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 unsigned int nincluded_files;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 char **included_files;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 argument *argbuffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 int current_arg, file_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 linebuffer filename_lb;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1157 bool help_asked = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 bool got_err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 #endif
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1161 char *optstring;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1162 int opt;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1163
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1165 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 _fmode = O_BINARY; /* all of files are treated as binary files */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1167 #endif /* DOS_NT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 progname = argv[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 nincluded_files = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 included_files = xnew (argc, char *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 current_arg = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 file_count = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 /* Allocate enough no matter what happens. Overkill, but each one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 is small. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 argbuffer = xnew (argc, argument);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 * If etags, always find typedefs and structure tags. Why not?
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1181 * Also default to find macro constants, enum constants and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 * global variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 if (!CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1186 typedefs = typedefs_or_cplusplus = constantypedefs = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 globals = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1190 /* When the optstring begins with a '-' getopt_long does not rearrange the
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1191 non-options arguments to be at the end, but leaves them alone. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1192 optstring = "-";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1194 optstring = "-r:Rc:";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 #endif /* ETAGS_REGEXPS */
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1196 if (!LONG_OPTIONS)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1197 optstring += 1; /* remove the initial '-' */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1198 optstring = concat (optstring,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1199 "Cf:Il:o:SVhH",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1200 (CTAGS) ? "BxdtTuvw" : "aDi:");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1201
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1202 while ((opt = getopt_long (argc, argv, optstring, longopts, 0)) != EOF)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1203 switch (opt)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1204 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1205 case 0:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1206 /* If getopt returns 0, then it has already processed a
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1207 long-named option. We should do nothing. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1210 case 1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1211 /* This means that a file name has been seen. Record it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1212 argbuffer[current_arg].arg_type = at_filename;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1213 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1214 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1215 ++file_count;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1216 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1217
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1218 case STDIN:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1219 /* Parse standard input. Idea by Vivek <vivek@etla.org>. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1220 argbuffer[current_arg].arg_type = at_stdin;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1221 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1222 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1223 ++file_count;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1224 if (parsing_stdin)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1225 fatal ("cannot parse standard input more than once", (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1226 parsing_stdin = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1227 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1228
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1229 /* Common options. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1230 case 'C': cplusplus = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1231 case 'f': /* for compatibility with old makefiles */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1232 case 'o':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1233 if (tagfile)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1235 error ("-o option may only be given once.", (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1236 suggest_asking_for_help ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1237 /* NOTREACHED */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1239 tagfile = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1240 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1241 case 'I':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1242 case 'S': /* for backward compatibility */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1243 ignoreindent = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1244 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1245 case 'l':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1246 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1247 language *lang = get_language_from_langname (optarg);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1248 if (lang != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1249 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1250 argbuffer[current_arg].lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1251 argbuffer[current_arg].arg_type = at_language;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1252 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1253 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1255 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1256 case 'c':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1257 /* Backward compatibility: support obsolete --ignore-case-regexp. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1258 optarg = concat (optarg, "i", ""); /* memory leak here */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1259 /* FALLTHRU */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1260 case 'r':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1261 argbuffer[current_arg].arg_type = at_regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1262 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1263 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1264 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1265 case 'R':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1266 argbuffer[current_arg].arg_type = at_regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1267 argbuffer[current_arg].what = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1268 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1269 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1270 case 'V':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1271 print_version ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1272 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1273 case 'h':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1274 case 'H':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1275 help_asked = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1276 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1277
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1278 /* Etags options */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1279 case 'a': append_to_tagfile = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1280 case 'D': constantypedefs = FALSE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1281 case 'i': included_files[nincluded_files++] = optarg; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1282
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1283 /* Ctags options. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1284 case 'B': searchar = '?'; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1285 case 'd': constantypedefs = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1286 case 't': typedefs = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1287 case 'T': typedefs = typedefs_or_cplusplus = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1288 case 'u': update = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1289 case 'v': vgrind_style = TRUE; /*FALLTHRU*/
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1290 case 'x': cxref_style = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1291 case 'w': no_warnings = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1292 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1293 suggest_asking_for_help ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1294 /* NOTREACHED */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1295 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1296
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1297 /* No more options. Store the rest of arguments. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1298 for (; optind < argc; optind++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 argbuffer[current_arg].arg_type = at_filename;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 argbuffer[current_arg].what = argv[optind];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 ++current_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 ++file_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1306 argbuffer[current_arg].arg_type = at_end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1307
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1308 if (help_asked)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1309 print_help (argbuffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1310 /* NOTREACHED */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1311
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 if (nincluded_files == 0 && file_count == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 error ("no input files specified.", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 suggest_asking_for_help ();
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1316 /* NOTREACHED */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 if (tagfile == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 tagfile = CTAGS ? "tags" : "TAGS";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 cwd = etags_getcwd (); /* the current working directory */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 if (cwd[strlen (cwd) - 1] != '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 char *oldcwd = cwd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 cwd = concat (oldcwd, "/", "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 free (oldcwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
1328 /* Relative file names are made relative to the current directory. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
1329 if (streq (tagfile, "-")
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
1330 || strneq (tagfile, "/dev/", 5))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 tagfiledir = cwd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 tagfiledir = absolute_dirname (tagfile, cwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 init (); /* set up boolean "functions" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1337 linebuffer_init (&lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1338 linebuffer_init (&filename_lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1339 linebuffer_init (&filebuf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1340 linebuffer_init (&token_name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 if (!CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 if (streq (tagfile, "-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 tagf = stdout;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1347 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 /* Switch redirected `stdout' to binary mode (setting `_fmode'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 doesn't take effect until after `stdout' is already open). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 if (!isatty (fileno (stdout)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 setmode (fileno (stdout), O_BINARY);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1352 #endif /* DOS_NT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 if (tagf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 pfatal (tagfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 * Loop through files finding functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1363 for (i = 0; i < current_arg; i++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1365 static language *lang; /* non-NULL if language is forced */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1366 char *this_file;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1367
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 switch (argbuffer[i].arg_type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 case at_language:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1371 lang = argbuffer[i].lang;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 #ifdef ETAGS_REGEXPS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 case at_regexp:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1375 analyse_regex (argbuffer[i].what);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 case at_filename:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 while ((this_file = gfnames (argbuffer[i].what, &got_err)) != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 if (got_err)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 error ("can't find file %s\n", this_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 argc--, argv++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 this_file = massage_name (this_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 this_file = argbuffer[i].what;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 /* Input file named "-" means read file names from stdin
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 (one per line) and use them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 if (streq (this_file, "-"))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1397 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1398 if (parsing_stdin)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1399 fatal ("cannot parse standard input AND read file names from it",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1400 (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1401 while (readline_internal (&filename_lb, stdin) > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1402 process_file_name (filename_lb.buffer, lang);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1403 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1405 process_file_name (this_file, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 break;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1410 case at_stdin:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1411 this_file = argbuffer[i].what;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1412 process_file (stdin, this_file, lang);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1413 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1418 free_regexps ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 #endif /* ETAGS_REGEXPS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1420 free (lb.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1421 free (filebuf.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1422 free (token_name.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1423
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1424 if (!CTAGS || cxref_style)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1426 put_entries (nodehead); /* write the remainig tags (ETAGS) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1427 free_tree (nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1428 nodehead = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1429 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1430 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1431 fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1432
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1433 /* Output file entries that have no tags. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1434 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1435 if (!fdp->written)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1436 fprintf (tagf, "\f\n%s,0\n", fdp->taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1437
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1438 while (nincluded_files-- > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1439 fprintf (tagf, "\f\n%s,include\n", *included_files++);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1440 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1441
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1442 if (fclose (tagf) == EOF)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1443 pfatal (tagfile);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1444 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 if (update)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 char cmd[BUFSIZ];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 for (i = 0; i < current_arg; ++i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1452 switch (argbuffer[i].arg_type)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1453 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1454 case at_filename:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1455 case at_stdin:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1456 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1457 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1458 continue; /* the for loop */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1459 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 sprintf (cmd,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 tagfile, argbuffer[i].what, tagfile);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1463 if (system (cmd) != EXIT_SUCCESS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 fatal ("failed to execute shell command", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 append_to_tagfile = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 if (tagf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 pfatal (tagfile);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1472 put_entries (nodehead); /* write all the tags (CTAGS) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1473 free_tree (nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1474 nodehead = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1475 if (fclose (tagf) == EOF)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1476 pfatal (tagfile);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 if (update)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1480 char cmd[2*BUFSIZ+10];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1481 sprintf (cmd, "sort -o %.*s %.*s", BUFSIZ, tagfile, BUFSIZ, tagfile);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 exit (system (cmd));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1484 return EXIT_SUCCESS;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 * Return a compressor given the file name. If EXTPTR is non-zero,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 * return a pointer into FILE where the compressor-specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 * extension begins. If no compressor is found, NULL is returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 * and EXTPTR is not significant.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1493 * Idea by Vladimir Alexiev <vladimir@cs.ualberta.ca> (1998)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1495 static compressor *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 get_compressor_from_suffix (file, extptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 char *file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 char **extptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 compressor *compr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 char *slash, *suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 /* This relies on FN to be after canonicalize_filename,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1504 so we don't need to consider backslashes on DOS_NT. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 slash = etags_strrchr (file, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 suffix = etags_strrchr (file, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 if (suffix == NULL || suffix < slash)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 if (extptr != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 *extptr = suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 suffix += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 /* Let those poor souls who live with DOS 8+3 file name limits get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 some solace by treating foo.cgz as if it were foo.c.gz, etc.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1514 Only the first do loop is run if not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 for (compr = compressors; compr->suffix != NULL; compr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 if (streq (compr->suffix, suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 return compr;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1520 if (!MSDOS)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1521 break; /* do it only once: not really a loop */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 if (extptr != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 *extptr = ++suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 } while (*suffix != '\0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 * Return a language given the name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1533 static language *
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1534 get_language_from_langname (name)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
1535 const char *name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 if (name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 error ("empty language name", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 if (streq (name, lang->name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 error ("unknown language \"%s\"", name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 * Return a language given the interpreter name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1556 static language *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 get_language_from_interpreter (interpreter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 char *interpreter;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 char **iname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 if (interpreter == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 if (lang->interpreters != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 for (iname = lang->interpreters; *iname != NULL; iname++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 if (streq (*iname, interpreter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 * Return a language given the file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1579 static language *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1580 get_language_from_filename (file, case_sensitive)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 char *file;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1582 bool case_sensitive;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 language *lang;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1585 char **name, **ext, *suffix;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1586
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1587 /* Try whole file name first. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1588 for (lang = lang_names; lang->name != NULL; lang++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1589 if (lang->filenames != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1590 for (name = lang->filenames; *name != NULL; name++)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1591 if ((case_sensitive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1592 ? streq (*name, file)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1593 : strcaseeq (*name, file))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1594 return lang;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1595
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1596 /* If not found, try suffix after last dot. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 suffix = etags_strrchr (file, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 if (suffix == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 suffix += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 if (lang->suffixes != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 for (ext = lang->suffixes; *ext != NULL; ext++)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1604 if ((case_sensitive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1605 ? streq (*ext, suffix)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1606 : strcaseeq (*ext, suffix))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1611
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 * This routine is called on each file argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1615 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1616 process_file_name (file, lang)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 char *file;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1618 language *lang;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 struct stat stat_buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 FILE *inf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1622 fdesc *fdp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 compressor *compr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 char *compressed_name, *uncompressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 char *ext, *real_name;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1626 int retval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 canonicalize_filename (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 if (streq (file, tagfile) && !streq (tagfile, "-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 error ("skipping inclusion of %s in self.", file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 if ((compr = get_compressor_from_suffix (file, &ext)) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 compressed_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 real_name = uncompressed_name = savestr (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 real_name = compressed_name = savestr (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 uncompressed_name = savenstr (file, ext - file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1645 /* If the canonicalized uncompressed name
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1646 has already been dealt with, skip it silently. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1647 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1649 assert (fdp->infname != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1650 if (streq (uncompressed_name, fdp->infname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1651 goto cleanup;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1652 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 if (stat (real_name, &stat_buf) != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 /* Reset real_name and try with a different name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 real_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 if (compressed_name != NULL) /* try with the given suffix */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 if (stat (uncompressed_name, &stat_buf) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 real_name = uncompressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 else /* try all possible suffixes */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 for (compr = compressors; compr->suffix != NULL; compr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 compressed_name = concat (file, ".", compr->suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 if (stat (compressed_name, &stat_buf) != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1670 if (MSDOS)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1671 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1672 char *suf = compressed_name + strlen (file);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1673 size_t suflen = strlen (compr->suffix) + 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1674 for ( ; suf[1]; suf++, suflen--)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1675 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1676 memmove (suf, suf + 1, suflen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1677 if (stat (compressed_name, &stat_buf) == 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1678 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1679 real_name = compressed_name;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1680 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1681 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1682 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1683 if (real_name != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1684 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1685 } /* MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 free (compressed_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 compressed_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 real_name = compressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 if (real_name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 perror (file);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1699 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 } /* try with a different name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 if (!S_ISREG (stat_buf.st_mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 error ("skipping %s: it is not a regular file.", real_name);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1706 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 if (real_name == compressed_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 char *cmd = concat (compr->command, " ", real_name);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1711 inf = (FILE *) popen (cmd, "r");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 free (cmd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 inf = fopen (real_name, "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 if (inf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 perror (real_name);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1719 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1722 process_file (inf, uncompressed_name, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 if (real_name == compressed_name)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1725 retval = pclose (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1727 retval = fclose (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1728 if (retval < 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1729 pfatal (file);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1730
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1731 cleanup:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1732 if (compressed_name) free (compressed_name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1733 if (uncompressed_name) free (uncompressed_name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1734 last_node = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1735 curfdp = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1736 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1737 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1738
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1739 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1740 process_file (fh, fn, lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1741 FILE *fh;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1742 char *fn;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1743 language *lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1744 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1745 static const fdesc emptyfdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1746 fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1747
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1748 /* Create a new input file description entry. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1749 fdp = xnew (1, fdesc);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1750 *fdp = emptyfdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1751 fdp->next = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1752 fdp->infname = savestr (fn);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1753 fdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1754 fdp->infabsname = absolute_filename (fn, cwd);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1755 fdp->infabsdir = absolute_dirname (fn, cwd);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1756 if (filename_is_absolute (fn))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1758 /* An absolute file name. Canonicalize it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1759 fdp->taggedfname = absolute_filename (fn, NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1760 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1761 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1762 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1763 /* A file name relative to cwd. Make it relative
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1764 to the directory of the tags file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1765 fdp->taggedfname = relative_filename (fn, tagfiledir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1766 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1767 fdp->usecharno = TRUE; /* use char position when making tags */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1768 fdp->prop = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1769 fdp->written = FALSE; /* not written on tags file yet */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1770
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1771 fdhead = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1772 curfdp = fdhead; /* the current file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1773
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1774 find_entries (fh);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1775
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1776 /* If not Ctags, and if this is not metasource and if it contained no #line
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1777 directives, we can write the tags and free all nodes pointing to
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1778 curfdp. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1779 if (!CTAGS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1780 && curfdp->usecharno /* no #line directives in this file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1781 && !curfdp->lang->metasource)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1782 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1783 node *np, *prev;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1784
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1785 /* Look for the head of the sublist relative to this file. See add_node
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1786 for the structure of the node tree. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1787 prev = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1788 for (np = nodehead; np != NULL; prev = np, np = np->left)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1789 if (np->fdp == curfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1790 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1791
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1792 /* If we generated tags for this file, write and delete them. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1793 if (np != NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1795 /* This is the head of the last sublist, if any. The following
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1796 instructions depend on this being true. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1797 assert (np->left == NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1798
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1799 assert (fdhead == curfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1800 assert (last_node->fdp == curfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1801 put_entries (np); /* write tags for file curfdp->taggedfname */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1802 free_tree (np); /* remove the written nodes */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1803 if (prev == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1804 nodehead = NULL; /* no nodes left */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1805 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1806 prev->left = NULL; /* delete the pointer to the sublist */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 * This routine sets up the boolean pseudo-functions which work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 * by setting boolean flags dependent upon the corresponding character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 * Every char which is NOT in that string is not a white char. Therefore,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 * all of the array "_wht" is set to FALSE, and then the elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 * subscripted by the chars in "white" are set to TRUE. Thus "_wht"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 * of a char is TRUE if it is the string "white", else FALSE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1819 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 init ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 register char *sp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 register int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 for (i = 0; i < CHARS; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 iswhite(i) = notinname(i) = begtoken(i) = intoken(i) = endtoken(i) = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 for (sp = white; *sp != '\0'; sp++) iswhite (*sp) = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 for (sp = nonam; *sp != '\0'; sp++) notinname (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1829 notinname('\0') = notinname('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 for (sp = begtk; *sp != '\0'; sp++) begtoken (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1831 begtoken('\0') = begtoken('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 for (sp = midtk; *sp != '\0'; sp++) intoken (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1833 intoken('\0') = intoken('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 for (sp = endtk; *sp != '\0'; sp++) endtoken (*sp) = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 endtoken('\0') = endtoken('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 * This routine opens the specified file and calls the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 * which finds the function and type definitions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1842 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1843 find_entries (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 char *cp;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1847 language *lang = curfdp->lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1848 Lang_function *parser = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 /* If user specified a language, use it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 if (lang != NULL && lang->function != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1853 parser = lang->function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1856 /* Else try to guess the language given the file name. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1857 if (parser == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1859 lang = get_language_from_filename (curfdp->infname, TRUE);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1860 if (lang != NULL && lang->function != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1861 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1862 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1863 parser = lang->function;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1864 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1867 /* Else look for sharp-bang as the first two characters. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1868 if (parser == NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1869 && readline_internal (&lb, inf) > 0
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 && lb.len >= 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 && lb.buffer[0] == '#'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 && lb.buffer[1] == '!')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 char *lp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 /* Set lp to point at the first char after the last slash in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 line or, if no slashes, at the first nonblank. Then set cp to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 the first successive blank and terminate the string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 lp = etags_strrchr (lb.buffer+2, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 if (lp != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 lp = skip_spaces (lb.buffer + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 cp = skip_non_spaces (lp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 *cp = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 if (strlen (lp) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 lang = get_language_from_interpreter (lp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 if (lang != NULL && lang->function != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1892 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1893 parser = lang->function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1897
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 /* We rewind here, even if inf may be a pipe. We fail if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 length of the first line is longer than the pipe block size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 which is unlikely. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 rewind (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1903 /* Else try to guess the language given the case insensitive file name. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1904 if (parser == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1905 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1906 lang = get_language_from_filename (curfdp->infname, FALSE);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1907 if (lang != NULL && lang->function != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1908 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1909 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1910 parser = lang->function;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1911 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1912 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1913
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1914 /* Else try Fortran or C. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1915 if (parser == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1917 node *old_last_node = last_node;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1918
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1919 curfdp->lang = get_language_from_langname ("fortran");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1920 find_entries (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1921
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1922 if (old_last_node == last_node)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1923 /* No Fortran entries found. Try C. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1924 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1925 /* We do not tag if rewind fails.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1926 Only the file name will be recorded in the tags file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1927 rewind (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1928 curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1929 find_entries (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1930 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1931 return;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1933
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1934 if (!no_line_directive
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1935 && curfdp->lang != NULL && curfdp->lang->metasource)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1936 /* It may be that this is a bingo.y file, and we already parsed a bingo.c
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1937 file, or anyway we parsed a file that is automatically generated from
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1938 this one. If this is the case, the bingo.c file contained #line
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1939 directives that generated tags pointing to this file. Let's delete
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1940 them all before parsing this file, which is the real source. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1941 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1942 fdesc **fdpp = &fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1943 while (*fdpp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1944 if (*fdpp != curfdp
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1945 && streq ((*fdpp)->taggedfname, curfdp->taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1946 /* We found one of those! We must delete both the file description
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1947 and all tags referring to it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1948 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1949 fdesc *badfdp = *fdpp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1950
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1951 /* Delete the tags referring to badfdp->taggedfname
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1952 that were obtained from badfdp->infname. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1953 invalidate_nodes (badfdp, &nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1954
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1955 *fdpp = badfdp->next; /* remove the bad description from the list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1956 free_fdesc (badfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1957 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1958 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1959 fdpp = &(*fdpp)->next; /* advance the list pointer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1960 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1961
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1962 assert (parser != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1963
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1964 /* Generic initialisations before reading from file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1965 linebuffer_setlen (&filebuf, 0); /* reset the file buffer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1966
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1967 /* Generic initialisations before parsing file with readline. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1968 lineno = 0; /* reset global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1969 charno = 0; /* reset global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1970 linecharno = 0; /* reset global char number of line start */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1971
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1972 parser (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1973
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1974 #ifdef ETAGS_REGEXPS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1975 regex_tag_multiline ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1976 #endif /* ETAGS_REGEXPS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1978
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1980 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1981 * Check whether an implicitly named tag should be created,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1982 * then call `pfnote'.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1983 * NAME is a string that is internally copied by this function.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1984 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1985 * TAGS format specification
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1986 * Idea by Sam Kendall <kendall@mv.mv.com> (1997)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1987 * The following is explained in some more detail in etc/ETAGS.EBNF.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1988 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1989 * make_tag creates tags with "implicit tag names" (unnamed tags)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1990 * if the following are all true, assuming NONAM=" \f\t\n\r()=,;":
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1991 * 1. NAME does not contain any of the characters in NONAM;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1992 * 2. LINESTART contains name as either a rightmost, or rightmost but
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1993 * one character, substring;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1994 * 3. the character, if any, immediately before NAME in LINESTART must
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1995 * be a character in NONAM;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1996 * 4. the character, if any, immediately after NAME in LINESTART must
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1997 * also be a character in NONAM.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1998 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1999 * The implementation uses the notinname() macro, which recognises the
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2000 * characters stored in the string `nonam'.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2001 * etags.el needs to use the same characters that are in NONAM.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2002 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2003 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2004 make_tag (name, namelen, is_func, linestart, linelen, lno, cno)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2005 char *name; /* tag name, or NULL if unnamed */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2006 int namelen; /* tag length */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2007 bool is_func; /* tag is a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2008 char *linestart; /* start of the line where tag is */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2009 int linelen; /* length of the line where tag is */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2010 int lno; /* line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2011 long cno; /* character number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2012 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2013 bool named = (name != NULL && namelen > 0);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2014
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2015 if (!CTAGS && named) /* maybe set named to false */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2016 /* Let's try to make an implicit tag name, that is, create an unnamed tag
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2017 such that etags.el can guess a name from it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2018 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2019 int i;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2020 register char *cp = name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2021
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2022 for (i = 0; i < namelen; i++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2023 if (notinname (*cp++))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2024 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2025 if (i == namelen) /* rule #1 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2026 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2027 cp = linestart + linelen - namelen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2028 if (notinname (linestart[linelen-1]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2029 cp -= 1; /* rule #4 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2030 if (cp >= linestart /* rule #2 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2031 && (cp == linestart
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2032 || notinname (cp[-1])) /* rule #3 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2033 && strneq (name, cp, namelen)) /* rule #2 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2034 named = FALSE; /* use implicit tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2035 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2036 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2037
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2038 if (named)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2039 name = savenstr (name, namelen);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2040 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2041 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2042 pfnote (name, is_func, linestart, linelen, lno, cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2043 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2044
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 /* Record a tag. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2046 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 pfnote (name, is_func, linestart, linelen, lno, cno)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 char *name; /* tag name, or NULL if unnamed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 bool is_func; /* tag is a function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 char *linestart; /* start of the line where tag is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 int linelen; /* length of the line where tag is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 int lno; /* line number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 long cno; /* character number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2057 assert (name == NULL || name[0] != '\0');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 if (CTAGS && name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 np = xnew (1, node);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 /* If ctags mode, change name "main" to M<thisfilename>. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 if (CTAGS && !cxref_style && streq (name, "main"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2066 register char *fp = etags_strrchr (curfdp->taggedfname, '/');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2067 np->name = concat ("M", fp == NULL ? curfdp->taggedfname : fp + 1, "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 fp = etags_strrchr (np->name, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 if (fp != NULL && fp[1] != '\0' && fp[2] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 fp[0] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 np->name = name;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2074 np->valid = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 np->been_warned = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2076 np->fdp = curfdp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 np->is_func = is_func;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 np->lno = lno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2079 if (np->fdp->usecharno)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2080 /* Our char numbers are 0-base, because of C language tradition?
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2081 ctags compatibility? old versions compatibility? I don't know.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2082 Anyway, since emacs's are 1-base we expect etags.el to take care
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2083 of the difference. If we wanted to have 1-based numbers, we would
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2084 uncomment the +1 below. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2085 np->cno = cno /* + 1 */ ;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2086 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2087 np->cno = invalidcharno;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 np->left = np->right = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 if (CTAGS && !cxref_style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 if (strlen (linestart) < 50)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2092 np->regex = concat (linestart, "$", "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2094 np->regex = savenstr (linestart, 50);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2097 np->regex = savenstr (linestart, linelen);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2098
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2099 add_node (np, &nodehead);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 * free_tree ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 * recurse on left children, iterate on right children.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2106 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 free_tree (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 while (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 register node *node_right = np->right;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 free_tree (np->left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 if (np->name != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 free (np->name);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2116 free (np->regex);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 free (np);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 np = node_right;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2123 * free_fdesc ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2124 * delete a file description
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2125 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2126 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2127 free_fdesc (fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2128 register fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2129 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2130 if (fdp->infname != NULL) free (fdp->infname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2131 if (fdp->infabsname != NULL) free (fdp->infabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2132 if (fdp->infabsdir != NULL) free (fdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2133 if (fdp->taggedfname != NULL) free (fdp->taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2134 if (fdp->prop != NULL) free (fdp->prop);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2135 free (fdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2136 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2137
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2138 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 * add_node ()
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2140 * Adds a node to the tree of nodes. In etags mode, sort by file
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2141 * name. In ctags mode, sort by tag name. Make no attempt at
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2142 * balancing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 * add_node is the only function allowed to add nodes, so it can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 * maintain state.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2147 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 add_node (np, cur_node_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 node *np, **cur_node_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 register int dif;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 register node *cur_node = *cur_node_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 if (cur_node == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 *cur_node_p = np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 last_node = np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2162 /* Etags Mode */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2164 /* For each file name, tags are in a linked sublist on the right
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2165 pointer. The first tags of different files are a linked list
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2166 on the left pointer. last_node points to the end of the last
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2167 used sublist. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2168 if (last_node != NULL && last_node->fdp == np->fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2169 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2170 /* Let's use the same sublist as the last added node. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2171 assert (last_node->right == NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2172 last_node->right = np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2173 last_node = np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2174 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2175 else if (cur_node->fdp == np->fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2176 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2177 /* Scanning the list we found the head of a sublist which is
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2178 good for us. Let's scan this sublist. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2179 add_node (np, &cur_node->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2180 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2181 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2182 /* The head of this sublist is not good for us. Let's try the
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2183 next one. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2184 add_node (np, &cur_node->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2185 } /* if ETAGS mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2186
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 /* Ctags Mode */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 dif = strcmp (np->name, cur_node->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 * If this tag name matches an existing one, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 * do not add the node, but maybe print a warning.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 if (!dif)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2198 if (np->fdp == cur_node->fdp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 if (!no_warnings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 fprintf (stderr, "Duplicate entry in file %s, line %d: %s\n",
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2203 np->fdp->infname, lineno, np->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 fprintf (stderr, "Second entry ignored\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 else if (!cur_node->been_warned && !no_warnings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 fprintf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 "Duplicate entry in files %s and %s: %s (Warning only)\n",
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2212 np->fdp->infname, cur_node->fdp->infname, np->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 cur_node->been_warned = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 /* Actually add the node */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 add_node (np, dif < 0 ? &cur_node->left : &cur_node->right);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2220 } /* if CTAGS mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2221 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2222
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2223 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2224 * invalidate_nodes ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2225 * Scan the node tree and invalidate all nodes pointing to the
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2226 * given file description (CTAGS case) or free them (ETAGS case).
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2227 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2228 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2229 invalidate_nodes (badfdp, npp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2230 fdesc *badfdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2231 node **npp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2232 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2233 node *np = *npp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2234
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2235 if (np == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2236 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2237
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2238 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2239 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2240 if (np->left != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2241 invalidate_nodes (badfdp, &np->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2242 if (np->fdp == badfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2243 np->valid = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2244 if (np->right != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2245 invalidate_nodes (badfdp, &np->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2246 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2247 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2248 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2249 assert (np->fdp != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2250 if (np->fdp == badfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2251 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2252 *npp = np->left; /* detach the sublist from the list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2253 np->left = NULL; /* isolate it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2254 free_tree (np); /* free it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2255 invalidate_nodes (badfdp, npp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2256 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2257 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2258 invalidate_nodes (badfdp, &np->left);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2261
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2263 static int total_size_of_entries __P((node *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2264 static int number_len __P((long));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2265
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2266 /* Length of a non-negative number's decimal representation. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 number_len (num)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 long num;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 int len = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 while ((num /= 10) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 len += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 * Return total number of characters that put_entries will output for
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2279 * the nodes in the linked list at the right of the specified node.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2280 * This count is irrelevant with etags.el since emacs 19.34 at least,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2281 * but is still supplied for backward compatibility.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2283 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 total_size_of_entries (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2287 register int total = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2288
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2289 for (; np != NULL; np = np->right)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2290 if (np->valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2291 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2292 total += strlen (np->regex) + 1; /* pat\177 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2293 if (np->name != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2294 total += strlen (np->name) + 1; /* name\001 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2295 total += number_len ((long) np->lno) + 1; /* lno, */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2296 if (np->cno != invalidcharno) /* cno */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2297 total += number_len (np->cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2298 total += 1; /* newline */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2299 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2300
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2301 return total;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2302 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2303
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2304 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2305 put_entries (np)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2306 register node *np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2307 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2308 register char *sp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2309 static fdesc *fdp = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 if (np == NULL)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2312 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2313
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2314 /* Output subentries that precede this one */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2315 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2316 put_entries (np->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2317
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2318 /* Output this entry */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2319 if (np->valid)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2321 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2322 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2323 /* Etags mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2324 if (fdp != np->fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2325 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2326 fdp = np->fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2327 fprintf (tagf, "\f\n%s,%d\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2328 fdp->taggedfname, total_size_of_entries (np));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2329 fdp->written = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2330 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2331 fputs (np->regex, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2332 fputc ('\177', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2333 if (np->name != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2334 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2335 fputs (np->name, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2336 fputc ('\001', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2337 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2338 fprintf (tagf, "%d,", np->lno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2339 if (np->cno != invalidcharno)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2340 fprintf (tagf, "%ld", np->cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2341 fputs ("\n", tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2342 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2343 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2344 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2345 /* Ctags mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2346 if (np->name == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2347 error ("internal error: NULL name in ctags mode.", (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2348
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2349 if (cxref_style)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2350 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2351 if (vgrind_style)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2352 fprintf (stdout, "%s %s %d\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2353 np->name, np->fdp->taggedfname, (np->lno + 63) / 64);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2354 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2355 fprintf (stdout, "%-16s %3d %-16s %s\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2356 np->name, np->lno, np->fdp->taggedfname, np->regex);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2357 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2358 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2359 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2360 fprintf (tagf, "%s\t%s\t", np->name, np->fdp->taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2361
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2362 if (np->is_func)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2363 { /* function or #define macro with args */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2364 putc (searchar, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2365 putc ('^', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2366
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2367 for (sp = np->regex; *sp; sp++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2368 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2369 if (*sp == '\\' || *sp == searchar)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2370 putc ('\\', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2371 putc (*sp, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2372 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2373 putc (searchar, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2374 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2375 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2376 { /* anything else; text pattern inadequate */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2377 fprintf (tagf, "%d", np->lno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2378 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2379 putc ('\n', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2380 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2381 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2382 } /* if this node contains a valid tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2383
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2384 /* Output subentries that follow this one */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2385 put_entries (np->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2386 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2387 put_entries (np->left);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2389
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2391 /* C extensions. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2392 #define C_EXT 0x00fff /* C extensions */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2393 #define C_PLAIN 0x00000 /* C */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2394 #define C_PLPL 0x00001 /* C++ */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2395 #define C_STAR 0x00003 /* C* */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2396 #define C_JAVA 0x00005 /* JAVA */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2397 #define C_AUTO 0x01000 /* C, but switch to C++ if `class' is met */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2398 #define YACC 0x10000 /* yacc file */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2399
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 * The C symbol tables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 enum sym_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 st_none,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 st_C_objprot, st_C_objimpl, st_C_objend,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 st_C_gnumacro,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2408 st_C_ignore, st_C_attribute,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 st_C_javastruct,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 st_C_operator,
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2411 st_C_class, st_C_template,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2412 st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2415 static unsigned int hash __P((const char *, unsigned int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2416 static struct C_stab_entry * in_word_set __P((const char *, unsigned int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2417 static enum sym_type C_symtype __P((char *, int, int));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2418
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 /* Feed stuff between (but not including) %[ and %] lines to:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2420 gperf -m 5
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 %[
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2422 %compare-strncmp
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2423 %enum
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2424 %struct-type
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 struct C_stab_entry { char *name; int c_ext; enum sym_type type; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 %%
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2427 if, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2428 for, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2429 while, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2430 switch, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2431 return, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2432 __attribute__, 0, st_C_attribute
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2433 @interface, 0, st_C_objprot
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2434 @protocol, 0, st_C_objprot
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2435 @implementation,0, st_C_objimpl
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2436 @end, 0, st_C_objend
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2437 import, (C_JAVA & !C_PLPL), st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2438 package, (C_JAVA & !C_PLPL), st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2439 friend, C_PLPL, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2440 extends, (C_JAVA & !C_PLPL), st_C_javastruct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2441 implements, (C_JAVA & !C_PLPL), st_C_javastruct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2442 interface, (C_JAVA & !C_PLPL), st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2443 class, 0, st_C_class
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2444 namespace, C_PLPL, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2445 domain, C_STAR, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2446 union, 0, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2447 struct, 0, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2448 extern, 0, st_C_extern
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2449 enum, 0, st_C_enum
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2450 typedef, 0, st_C_typedef
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2451 define, 0, st_C_define
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2452 operator, C_PLPL, st_C_operator
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2453 template, 0, st_C_template
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 # DEFUN used in emacs, the next three used in glibc (SYSCALL only for mach).
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2455 DEFUN, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2456 SYSCALL, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2457 ENTRY, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2458 PSEUDO, 0, st_C_gnumacro
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 # These are defined inside C functions, so currently they are not met.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 # EXFUN used in glibc, DEFVAR_* in emacs.
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2461 #EXFUN, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2462 #DEFVAR_, 0, st_C_gnumacro
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 %]
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2464 and replace lines between %< and %> with its output, then:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2465 - remove the #if characterset check
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2466 - make in_word_set static and not inline. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 /*%<*/
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2468 /* C code produced by gperf version 3.0.1 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2469 /* Command-line: gperf -m 5 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2470 /* Computed positions: -k'1-2' */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2471
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 struct C_stab_entry { char *name; int c_ext; enum sym_type type; };
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2473 /* maximum key range = 31, duplicates = 0 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 __inline
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2477 #else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2478 #ifdef __cplusplus
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2479 inline
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2480 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 hash (str, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 register const char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 register unsigned int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 static unsigned char asso_values[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2489 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2490 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2491 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2492 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2493 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2494 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2495 34, 34, 34, 34, 1, 34, 34, 34, 14, 14,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2496 34, 34, 34, 34, 34, 34, 34, 34, 13, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2497 13, 34, 34, 12, 34, 34, 34, 34, 34, 11,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2498 34, 34, 34, 34, 34, 8, 34, 11, 34, 12,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2499 11, 0, 1, 34, 7, 0, 34, 34, 11, 9,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2500 0, 4, 0, 34, 7, 4, 14, 21, 34, 15,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2501 0, 2, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2502 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2503 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2504 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2505 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2506 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2507 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2508 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2509 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2510 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2511 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2512 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2513 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2514 34, 34, 34, 34, 34, 34
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 };
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2516 return len + asso_values[(unsigned char)str[1]] + asso_values[(unsigned char)str[0]];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 static struct C_stab_entry *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 in_word_set (str, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 register const char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 register unsigned int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2524 enum
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2525 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2526 TOTAL_KEYWORDS = 31,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2527 MIN_WORD_LENGTH = 2,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2528 MAX_WORD_LENGTH = 15,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2529 MIN_HASH_VALUE = 3,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2530 MAX_HASH_VALUE = 33
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2531 };
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2532
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 static struct C_stab_entry wordlist[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2535 {""}, {""}, {""},
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2536 {"if", 0, st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2537 {"enum", 0, st_C_enum},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2538 {"@end", 0, st_C_objend},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2539 {"extern", 0, st_C_extern},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2540 {"extends", (C_JAVA & !C_PLPL), st_C_javastruct},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2541 {"for", 0, st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2542 {"interface", (C_JAVA & !C_PLPL), st_C_struct},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2543 {"@protocol", 0, st_C_objprot},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2544 {"@interface", 0, st_C_objprot},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2545 {"operator", C_PLPL, st_C_operator},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2546 {"return", 0, st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2547 {"friend", C_PLPL, st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2548 {"import", (C_JAVA & !C_PLPL), st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2549 {"@implementation",0, st_C_objimpl},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2550 {"define", 0, st_C_define},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2551 {"package", (C_JAVA & !C_PLPL), st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2552 {"implements", (C_JAVA & !C_PLPL), st_C_javastruct},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2553 {"namespace", C_PLPL, st_C_struct},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2554 {"domain", C_STAR, st_C_struct},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2555 {"template", 0, st_C_template},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2556 {"typedef", 0, st_C_typedef},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2557 {"struct", 0, st_C_struct},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2558 {"switch", 0, st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2559 {"union", 0, st_C_struct},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2560 {"while", 0, st_C_ignore},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2561 {"class", 0, st_C_class},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2562 {"__attribute__", 0, st_C_attribute},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2563 {"SYSCALL", 0, st_C_gnumacro},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2564 {"PSEUDO", 0, st_C_gnumacro},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2565 {"ENTRY", 0, st_C_gnumacro},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2566 {"DEFUN", 0, st_C_gnumacro}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 register int key = hash (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 if (key <= MAX_HASH_VALUE && key >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 register const char *s = wordlist[key].name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2577 if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 return &wordlist[key];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 /*%>*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 static enum sym_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 C_symtype (str, len, c_ext)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 int c_ext;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 register struct C_stab_entry *se = in_word_set (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 if (se == NULL || (se->c_ext && !(c_ext & se->c_ext)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 return st_none;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 return se->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2597
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2599 /*
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2600 * Ignoring __attribute__ ((list))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2601 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2602 static bool inattribute; /* looking at an __attribute__ construct */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2603
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2604 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2605 * C functions and variables are recognized using a simple
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2606 * finite automaton. fvdef is its state variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2607 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2608 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 fvnone, /* nothing seen */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2611 fdefunkey, /* Emacs DEFUN keyword seen */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2612 fdefunname, /* Emacs DEFUN name seen */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 foperator, /* func: operator keyword seen (cplpl) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 fvnameseen, /* function or variable name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 fstartlist, /* func: just after open parenthesis */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 finlist, /* func: in parameter list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 flistseen, /* func: after parameter list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 fignore, /* func: before open brace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 vignore /* var-like: ignore until ';' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 } fvdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2622 static bool fvextern; /* func or var: extern keyword seen; */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2624 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2625 * typedefs are recognized using a simple finite automaton.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2626 * typdef is its state variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2627 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2628 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630 tnone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 tkeyseen, /* typedef keyword seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 ttypeseen, /* defined type seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 tinbody, /* inside typedef body */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634 tend, /* just before typedef tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 tignore /* junk after typedef tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 } typdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2638 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2639 * struct-like structures (enum, struct and union) are recognized
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2640 * using another simple finite automaton. `structdef' is its state
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2641 * variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2642 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2643 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2645 snone, /* nothing seen yet,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2646 or in struct body if bracelev > 0 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 skeyseen, /* struct-like keyword seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 stagseen, /* struct-like tag seen */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2649 scolonseen /* colon seen after struct-like tag */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 } structdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 * When objdef is different from onone, objtag is the name of the class.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2655 static char *objtag = "<uninited>";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 * Yet another little state machine to deal with preprocessor lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2660 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 dnone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 dsharpseen, /* '#' seen as first char on line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 ddefineseen, /* '#' and 'define' seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 dignorerest /* ignore rest of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 } definedef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 * State machine for Objective C protocols and implementations.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2670 * Idea by Tom R.Hageman <tom@basil.icce.rug.nl> (1995)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2672 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 onone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 oprotocol, /* @interface or @protocol seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 oimplementation, /* @implementations seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 otagseen, /* class name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 oparenseen, /* parenthesis before category seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 ocatseen, /* category name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 oinbody, /* in @implementation body */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 omethodsign, /* in @implementation body, after +/- */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 omethodtag, /* after method name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 omethodcolon, /* after method colon */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 omethodparm, /* after method parameter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 oignore /* wait for @end */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 } objdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 * Use this structure to keep info about the token read, and how it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 * should be tagged. Used by the make_C_tag function to build a tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2693 static struct tok
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2695 char *line; /* string containing the token */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2696 int offset; /* where the token starts in LINE */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2697 int length; /* token length */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2698 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2699 The previous members can be used to pass strings around for generic
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2700 purposes. The following ones specifically refer to creating tags. In this
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2701 case the token contained here is the pattern that will be used to create a
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2702 tag.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2703 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2704 bool valid; /* do not create a tag; the token should be
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2705 invalidated whenever a state machine is
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2706 reset prematurely */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2707 bool named; /* create a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2708 int lineno; /* source line number of tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2709 long linepos; /* source char number of tag */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2710 } token; /* latest token read */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2713 * Variables and functions for dealing with nested structures.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2714 * Idea by Mykola Dzyuba <mdzyuba@yahoo.com> (2001)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2716 static void pushclass_above __P((int, char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2717 static void popclass_above __P((int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2718 static void write_classname __P((linebuffer *, char *qualifier));
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2719
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2720 static struct {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2721 char **cname; /* nested class names */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2722 int *bracelev; /* nested class brace level */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2723 int nl; /* class nesting level (elements used) */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2724 int size; /* length of the array */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2725 } cstack; /* stack for nested declaration tags */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2726 /* Current struct nesting depth (namespace, class, struct, union, enum). */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2727 #define nestlev (cstack.nl)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2728 /* After struct keyword or in struct body, not inside a nested function. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2729 #define instruct (structdef == snone && nestlev > 0 \
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2730 && bracelev == cstack.bracelev[nestlev-1] + 1)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2731
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2732 static void
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2733 pushclass_above (bracelev, str, len)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2734 int bracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2735 char *str;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2736 int len;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2737 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2738 int nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2739
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2740 popclass_above (bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2741 nl = cstack.nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2742 if (nl >= cstack.size)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2743 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2744 int size = cstack.size *= 2;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2745 xrnew (cstack.cname, size, char *);
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2746 xrnew (cstack.bracelev, size, int);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2747 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2748 assert (nl == 0 || cstack.bracelev[nl-1] < bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2749 cstack.cname[nl] = (str == NULL) ? NULL : savenstr (str, len);
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2750 cstack.bracelev[nl] = bracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2751 cstack.nl = nl + 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2752 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2753
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2754 static void
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2755 popclass_above (bracelev)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2756 int bracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2757 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2758 int nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2759
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2760 for (nl = cstack.nl - 1;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2761 nl >= 0 && cstack.bracelev[nl] >= bracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2762 nl--)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2763 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2764 if (cstack.cname[nl] != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2765 free (cstack.cname[nl]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2766 cstack.nl = nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2767 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2768 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2769
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2770 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2771 write_classname (cn, qualifier)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2772 linebuffer *cn;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2773 char *qualifier;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2774 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2775 int i, len;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2776 int qlen = strlen (qualifier);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2777
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2778 if (cstack.nl == 0 || cstack.cname[0] == NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2779 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2780 len = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2781 cn->len = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2782 cn->buffer[0] = '\0';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2783 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2784 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2785 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2786 len = strlen (cstack.cname[0]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2787 linebuffer_setlen (cn, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2788 strcpy (cn->buffer, cstack.cname[0]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2789 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2790 for (i = 1; i < cstack.nl; i++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2791 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2792 char *s;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2793 int slen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2794
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2795 s = cstack.cname[i];
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2796 if (s == NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2797 continue;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2798 slen = strlen (s);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2799 len += slen + qlen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2800 linebuffer_setlen (cn, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2801 strncat (cn->buffer, qualifier, qlen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2802 strncat (cn->buffer, s, slen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2803 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2804 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2805
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2806
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2807 static bool consider_token __P((char *, int, int, int *, int, int, bool *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2808 static void make_C_tag __P((bool));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2809
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 * consider_token ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 * checks to see if the current token is at the start of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 * function or variable, or corresponds to a typedef, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 * is a struct/union/enum tag, or #define, or an enum constant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 * *IS_FUNC gets TRUE iff the token is a function or #define macro
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2817 * with args. C_EXTP points to which language we are looking at.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 * Globals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 * fvdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 * structdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 * definedef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 * typdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 * objdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 static bool
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2828 consider_token (str, len, c, c_extp, bracelev, parlev, is_func_or_var)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 register char *str; /* IN: token pointer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 register int len; /* IN: token length */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2831 register int c; /* IN: first char after the token */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2832 int *c_extp; /* IN, OUT: C extensions mask */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2833 int bracelev; /* IN: brace level */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 int parlev; /* IN: parenthesis level */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 bool *is_func_or_var; /* OUT: function or variable found */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2837 /* When structdef is stagseen, scolonseen, or snone with bracelev > 0,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2838 structtype is the type of the preceding struct-like keyword, and
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2839 structbracelev is the brace level where it has been seen. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2840 static enum sym_type structtype;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2841 static int structbracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2842 static enum sym_type toktype;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2843
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2844
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2845 toktype = C_symtype (str, len, *c_extp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 /*
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2848 * Skip __attribute__
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2850 if (toktype == st_C_attribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2852 inattribute = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 return FALSE;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2854 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2855
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2856 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2857 * Advance the definedef state machine.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2858 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2859 switch (definedef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2860 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2861 case dnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2862 /* We're not on a preprocessor line. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2863 if (toktype == st_C_gnumacro)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2864 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2865 fvdef = fdefunkey;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2866 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2867 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2868 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2869 case dsharpseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2870 if (toktype == st_C_define)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2871 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2872 definedef = ddefineseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2873 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2874 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2875 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2876 definedef = dignorerest;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2877 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2878 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2879 case ddefineseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2880 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2881 * Make a tag for any macro, unless it is a constant
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2882 * and constantypedefs is FALSE.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2883 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2884 definedef = dignorerest;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2885 *is_func_or_var = (c == '(');
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2886 if (!*is_func_or_var && !constantypedefs)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2887 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2888 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2889 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2890 case dignorerest:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2891 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2892 default:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2893 error ("internal error: definedef value.", (char *)NULL);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2894 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2895
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2896 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2897 * Now typedefs
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2898 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2899 switch (typdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2900 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2901 case tnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2902 if (toktype == st_C_typedef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2903 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2904 if (typedefs)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2905 typdef = tkeyseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2906 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2907 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2908 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2909 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2910 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2911 case tkeyseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2912 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2913 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2914 case st_none:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2915 case st_C_class:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2916 case st_C_struct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2917 case st_C_enum:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2918 typdef = ttypeseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2919 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2920 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2921 case ttypeseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2922 if (structdef == snone && fvdef == fvnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2923 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2924 fvdef = fvnameseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2925 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2926 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2927 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2928 case tend:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2929 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2930 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2931 case st_C_class:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2932 case st_C_struct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2933 case st_C_enum:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2934 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2935 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2936 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2937 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2938
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2939 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2940 * This structdef business is NOT invoked when we are ctags and the
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2941 * file is plain C. This is because a struct tag may have the same
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2942 * name as another tag, and this loses with ctags.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2943 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2944 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2945 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2946 case st_C_javastruct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2947 if (structdef == stagseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2948 structdef = scolonseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2949 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2950 case st_C_template:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2951 case st_C_class:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2952 if ((*c_extp & C_AUTO) /* automatic detection of C++ language */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2953 && bracelev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2954 && definedef == dnone && structdef == snone
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2955 && typdef == tnone && fvdef == fvnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2956 *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2957 if (toktype == st_C_template)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2958 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2959 /* FALLTHRU */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2960 case st_C_struct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2961 case st_C_enum:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2962 if (parlev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2963 && fvdef != vignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2964 && (typdef == tkeyseen
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2965 || (typedefs_or_cplusplus && structdef == snone)))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2966 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2967 structdef = skeyseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2968 structtype = toktype;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2969 structbracelev = bracelev;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2970 if (fvdef == fvnameseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2971 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2972 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2973 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2974 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2975
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2976 if (structdef == skeyseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2977 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2978 structdef = stagseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2979 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2980 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2981
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2982 if (typdef != tnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2983 definedef = dnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2984
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2985 /* Detect Objective C constructs. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2986 switch (objdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2987 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2988 case onone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2989 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2990 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2991 case st_C_objprot:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2992 objdef = oprotocol;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2993 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2994 case st_C_objimpl:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2995 objdef = oimplementation;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2996 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2997 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2998 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2999 case oimplementation:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3000 /* Save the class tag for functions or variables defined inside. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3001 objtag = savenstr (str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3002 objdef = oinbody;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3003 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3004 case oprotocol:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3005 /* Save the class tag for categories. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3006 objtag = savenstr (str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3007 objdef = otagseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3008 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3009 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3010 case oparenseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3011 objdef = ocatseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3012 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3013 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3014 case oinbody:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3015 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3016 case omethodsign:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3017 if (parlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3018 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3019 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3020 objdef = omethodtag;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3021 linebuffer_setlen (&token_name, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3022 strncpy (token_name.buffer, str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3023 token_name.buffer[len] = '\0';
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3024 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3025 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3026 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3027 case omethodcolon:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3028 if (parlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3029 objdef = omethodparm;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3030 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3031 case omethodparm:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3032 if (parlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3033 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3034 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3035 objdef = omethodtag;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3036 linebuffer_setlen (&token_name, token_name.len + len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3037 strncat (token_name.buffer, str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3038 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3039 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3040 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3041 case oignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3042 if (toktype == st_C_objend)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3043 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3044 /* Memory leakage here: the string pointed by objtag is
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3045 never released, because many tests would be needed to
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3046 avoid breaking on incorrect input code. The amount of
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3047 memory leaked here is the sum of the lengths of the
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3048 class tags.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3049 free (objtag); */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3050 objdef = onone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3051 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3052 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3053 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3054
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3055 /* A function, variable or enum constant? */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3056 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3057 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3058 case st_C_extern:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3059 fvextern = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3060 switch (fvdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3061 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3062 case finlist:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3063 case flistseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3064 case fignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3065 case vignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3066 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3067 default:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3068 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3069 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3070 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3071 case st_C_ignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3072 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3073 fvdef = vignore;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3074 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3075 case st_C_operator:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3076 fvdef = foperator;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3077 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3078 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3079 case st_none:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3080 if (constantypedefs
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3081 && structdef == snone
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3082 && structtype == st_C_enum && bracelev > structbracelev)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3083 return TRUE; /* enum constant */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3084 switch (fvdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3085 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3086 case fdefunkey:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3087 if (bracelev > 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3088 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3089 fvdef = fdefunname; /* GNU macro */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3090 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3091 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3092 case fvnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3093 switch (typdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3094 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3095 case ttypeseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3096 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3097 case tnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3098 if ((strneq (str, "asm", 3) && endtoken (str[3]))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3099 || (strneq (str, "__asm__", 7) && endtoken (str[7])))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3100 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3101 fvdef = vignore;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3102 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3103 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3104 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3105 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3106 /* FALLTHRU */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3107 case fvnameseen:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3108 if (len >= 10 && strneq (str+len-10, "::operator", 10))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3109 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3110 if (*c_extp & C_AUTO) /* automatic detection of C++ */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3111 *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3112 fvdef = foperator;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3113 *is_func_or_var = TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3114 return TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3115 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3116 if (bracelev > 0 && !instruct)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3117 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 fvdef = fvnameseen; /* function or variable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 *is_func_or_var = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3128
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3130 * C_entries often keeps pointers to tokens or lines which are older than
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3131 * the line currently read. By keeping two line buffers, and switching
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3132 * them at end of line, it is possible to use those pointers.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3134 static struct
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3135 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3136 long linepos;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3137 linebuffer lb;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3138 } lbs[2];
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3139
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 #define current_lb_is_new (newndx == curndx)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 #define switch_line_buffers() (curndx = 1 - curndx)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 #define curlb (lbs[curndx].lb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 #define newlb (lbs[newndx].lb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 #define curlinepos (lbs[curndx].linepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 #define newlinepos (lbs[newndx].linepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3148 #define plainc ((c_ext & C_EXT) == C_PLAIN)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3149 #define cplpl (c_ext & C_PLPL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3150 #define cjava ((c_ext & C_JAVA) == C_JAVA)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3151
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 #define CNL_SAVE_DEFINEDEF() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 curlinepos = charno; \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3155 readline (&curlb, inf); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 lp = curlb.buffer; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 quotednl = FALSE; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 newndx = curndx; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 #define CNL() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 CNL_SAVE_DEFINEDEF(); \
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3164 if (savetoken.valid) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 { \
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3166 token = savetoken; \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3167 savetoken.valid = FALSE; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169 definedef = dnone; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 make_C_tag (isfun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 bool isfun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3177 /* This function should never be called when token.valid is FALSE, but
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 we must protect against invalid input or internal errors. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3179 if (!DEBUG && !token.valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3180 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3181
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3182 if (token.valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3183 make_tag (token_name.buffer, token_name.len, isfun, token.line,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3184 token.offset+token.length+1, token.lineno, token.linepos);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3185 else /* this case is optimised away if !DEBUG */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3186 make_tag (concat ("INVALID TOKEN:-->", token_name.buffer, ""),
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3187 token_name.len + 17, isfun, token.line,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3188 token.offset+token.length+1, token.lineno, token.linepos);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3189
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3190 token.valid = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3194 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3195 * C_entries ()
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3196 * This routine finds functions, variables, typedefs,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3197 * #define's, enum constants and struct/union/enum definitions in
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3198 * C syntax and adds them to the list.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3199 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3200 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201 C_entries (c_ext, inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 int c_ext; /* extension of C */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 FILE *inf; /* input file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 register char c; /* latest char read; '\0' for end of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 register char *lp; /* pointer one beyond the character `c' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 int curndx, newndx; /* indices for current and new lb */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 register int tokoff; /* offset in line of start of current token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 register int toklen; /* length of current token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 char *qualifier; /* string used to qualify names */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 int qlen; /* length of qualifier */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3212 int bracelev; /* current brace level */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3213 int bracketlev; /* current bracket level */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 int parlev; /* current parenthesis level */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3215 int attrparlev; /* __attribute__ parenthesis level */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3216 int templatelev; /* current template level */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3217 int typdefbracelev; /* bracelev where a typedef struct body begun */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 bool incomm, inquote, inchar, quotednl, midtoken;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3219 bool yacc_rules; /* in the rules part of a yacc file */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3220 struct tok savetoken; /* token saved during preprocessor handling */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3221
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3222
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3223 linebuffer_init (&lbs[0].lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3224 linebuffer_init (&lbs[1].lb);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3225 if (cstack.size == 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3226 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3227 cstack.size = (DEBUG) ? 1 : 4;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3228 cstack.nl = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3229 cstack.cname = xnew (cstack.size, char *);
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3230 cstack.bracelev = xnew (cstack.size, int);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3231 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3233 tokoff = toklen = typdefbracelev = 0; /* keep compiler quiet */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 curndx = newndx = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 lp = curlb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 *lp = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 fvdef = fvnone; fvextern = FALSE; typdef = tnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 structdef = snone; definedef = dnone; objdef = onone;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3240 yacc_rules = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 midtoken = inquote = inchar = incomm = quotednl = FALSE;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3242 token.valid = savetoken.valid = FALSE;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3243 bracelev = bracketlev = parlev = attrparlev = templatelev = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 if (cjava)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245 { qualifier = "."; qlen = 1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 { qualifier = "::"; qlen = 2; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3249
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250 while (!feof (inf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 c = *lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 if (c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3255 /* If we are at the end of the line, the next character is a
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3256 '\0'; do not skip it, because it is what tells us
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 to read the next line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 if (*lp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 quotednl = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 c = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 else if (incomm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 case '*':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 if (*lp == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273 c = *lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 incomm = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278 /* Newlines inside comments do not end macro definitions in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 traditional cpp. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 CNL_SAVE_DEFINEDEF ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 else if (inquote)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 case '"':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 /* Newlines inside strings do not end macro definitions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 in traditional cpp, even though compilers don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 usually accept them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 CNL_SAVE_DEFINEDEF ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 else if (inchar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 /* Hmmm, something went wrong. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307 CNL ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 case '\'':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 inchar = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3315 else if (bracketlev > 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3316 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3317 switch (c)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3318 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3319 case ']':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3320 if (--bracketlev > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 continue;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3322 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3323 case '\0':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3324 CNL_SAVE_DEFINEDEF ();
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3325 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3326 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3327 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3328 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3329 else switch (c)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3330 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3331 case '"':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3332 inquote = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3333 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3334 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3335 switch (fvdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3336 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3337 case fdefunkey:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3338 case fstartlist:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3339 case finlist:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3340 case fignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3341 case vignore:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3343 default:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3344 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3345 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3346 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3347 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3348 case '\'':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3349 inchar = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3350 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3351 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3352 if (fvdef != finlist && fvdef != fignore && fvdef !=vignore)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3353 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3354 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3355 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3356 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3357 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3358 case '/':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3359 if (*lp == '*')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3360 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3361 lp++;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3362 incomm = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3363 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3364 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3365 else if (/* cplpl && */ *lp == '/')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3366 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3367 c = '\0';
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3369 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3370 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3371 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3372 case '%':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3373 if ((c_ext & YACC) && *lp == '%')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3374 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3375 /* Entering or exiting rules section in yacc file. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3376 lp++;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3377 definedef = dnone; fvdef = fvnone; fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3378 typdef = tnone; structdef = snone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3379 midtoken = inquote = inchar = incomm = quotednl = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3380 bracelev = 0;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3381 yacc_rules = !yacc_rules;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3382 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3383 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3384 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3385 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3386 case '#':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3387 if (definedef == dnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3388 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3389 char *cp;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3390 bool cpptoken = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3391
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3392 /* Look back on this line. If all blanks, or nonblanks
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3393 followed by an end of comment, this is a preprocessor
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3394 token. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3395 for (cp = newlb.buffer; cp < lp-1; cp++)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3396 if (!iswhite (*cp))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3397 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3398 if (*cp == '*' && *(cp+1) == '/')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3399 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3400 cp++;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3401 cpptoken = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3402 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3403 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3404 cpptoken = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3405 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3406 if (cpptoken)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3407 definedef = dsharpseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3408 } /* if (definedef == dnone) */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3409 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3410 case '[':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3411 bracketlev++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3412 continue;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3413 } /* switch (c) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3416 /* Consider token only if some involved conditions are satisfied. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3417 if (typdef != tignore
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 && definedef != dignorerest
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3419 && fvdef != finlist
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3420 && templatelev == 0
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3421 && (definedef != dnone
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3422 || structdef != scolonseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3423 && !inattribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 if (midtoken)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 if (endtoken (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3429 if (c == ':' && *lp == ':' && begtoken (lp[1]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3430 /* This handles :: in the middle,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3431 but not at the beginning of an identifier.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3432 Also, space-separated :: is not recognised. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3434 if (c_ext & C_AUTO) /* automatic detection of C++ */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3435 c_ext = (c_ext | C_PLPL) & ~C_AUTO;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436 lp += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 toklen += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 c = lp[-1];
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3439 goto still_in_token;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3443 bool funorvar = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3444
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 if (yacc_rules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 || consider_token (newlb.buffer + tokoff, toklen, c,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3447 &c_ext, bracelev, parlev,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3448 &funorvar))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 if (fvdef == foperator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 char *oldlp = lp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 lp = skip_spaces (lp-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 if (*lp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456 while (*lp != '\0'
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3457 && !iswhite (*lp) && *lp != '(')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 c = *lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 toklen += lp - oldlp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3462 token.named = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3463 if (!plainc
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3464 && nestlev > 0 && definedef == dnone)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3465 /* in struct body */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3467 write_classname (&token_name, qualifier);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3468 linebuffer_setlen (&token_name,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3469 token_name.len+qlen+toklen);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470 strcat (token_name.buffer, qualifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 strncat (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472 newlb.buffer + tokoff, toklen);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3473 token.named = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 else if (objdef == ocatseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476 /* Objective C category */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 int len = strlen (objtag) + 2 + toklen;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3479 linebuffer_setlen (&token_name, len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 strcpy (token_name.buffer, objtag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 strcat (token_name.buffer, "(");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 strncat (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 newlb.buffer + tokoff, toklen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484 strcat (token_name.buffer, ")");
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3485 token.named = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 else if (objdef == omethodtag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 || objdef == omethodparm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489 /* Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3491 token.named = TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3492 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3493 else if (fvdef == fdefunname)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3494 /* GNU DEFUN and similar macros */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3495 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3496 bool defun = (newlb.buffer[tokoff] == 'F');
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3497 int off = tokoff;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3498 int len = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3499
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3500 /* Rewrite the tag so that emacs lisp DEFUNs
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3501 can be found by their elisp name */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3502 if (defun)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3503 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3504 off += 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3505 len -= 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3506 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3507 len = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3508 linebuffer_setlen (&token_name, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3509 strncpy (token_name.buffer,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3510 newlb.buffer + off, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3511 token_name.buffer[len] = '\0';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3512 if (defun)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3513 while (--len >= 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3514 if (token_name.buffer[len] == '_')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3515 token_name.buffer[len] = '-';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3516 token.named = defun;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3520 linebuffer_setlen (&token_name, toklen);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 strncpy (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 newlb.buffer + tokoff, toklen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 token_name.buffer[toklen] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 /* Name macros and members. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3525 token.named = (structdef == stagseen
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3526 || typdef == ttypeseen
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3527 || typdef == tend
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3528 || (funorvar
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3529 && definedef == dignorerest)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3530 || (funorvar
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3531 && definedef == dnone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3532 && structdef == snone
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3533 && bracelev > 0));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3535 token.lineno = lineno;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3536 token.offset = tokoff;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3537 token.length = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3538 token.line = newlb.buffer;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3539 token.linepos = newlinepos;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3540 token.valid = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 if (definedef == dnone
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543 && (fvdef == fvnameseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 || fvdef == foperator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 || structdef == stagseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 || typdef == tend
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3547 || typdef == ttypeseen
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 || objdef != onone))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 if (current_lb_is_new)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 switch_line_buffers ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3553 else if (definedef != dnone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3554 || fvdef == fdefunname
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3555 || instruct)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 make_C_tag (funorvar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3558 else /* not yacc and consider_token failed */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3559 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3560 if (inattribute && fvdef == fignore)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3561 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3562 /* We have just met __attribute__ after a
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3563 function parameter list: do not tag the
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3564 function again. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3565 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3566 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3567 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 midtoken = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570 } /* if (endtoken (c)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3571 else if (intoken (c))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3572 still_in_token:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574 toklen++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577 } /* if (midtoken) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 else if (begtoken (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580 switch (definedef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 case dnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 case fstartlist:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3586 /* This prevents tagging fb in
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3587 void (__attribute__((noreturn)) *fb) (void);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3588 Fixing this is not easy and not very important. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 fvdef = finlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591 case flistseen:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3592 if (plainc || declarations)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3593 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3594 make_C_tag (TRUE); /* a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3595 fvdef = fignore;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3596 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 if (structdef == stagseen && !cjava)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3600 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3601 popclass_above (bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3602 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3603 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605 case dsharpseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3606 savetoken = token;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3607 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 if (!yacc_rules || lp == newlb.buffer + 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611 tokoff = lp - 1 - newlb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 toklen = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 midtoken = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616 } /* if (begtoken) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 } /* if must look at token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 /* Detect end of line, colon, comma, semicolon and various braces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 after having handled a token.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3624 case ':':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3625 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3626 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3627 if (yacc_rules && token.offset == 0 && token.valid)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3628 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3629 make_C_tag (FALSE); /* a yacc function */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3630 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3631 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3634 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3636 case otagseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642 objdef = omethodcolon;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3643 linebuffer_setlen (&token_name, token_name.len + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3644 strcat (token_name.buffer, ":");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647 if (structdef == stagseen)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3648 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3649 structdef = scolonseen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3650 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3651 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3652 /* Should be useless, but may be work as a safety net. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3653 if (cplpl && fvdef == flistseen)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3654 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3655 make_C_tag (TRUE); /* a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3656 fvdef = fignore;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3657 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3658 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 case ';':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3661 if (definedef != dnone || inattribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3662 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3663 switch (typdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3665 case tend:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3666 case ttypeseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3667 make_C_tag (FALSE); /* a typedef */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3668 typdef = tnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3669 fvdef = fvnone;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3671 case tnone:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3672 case tinbody:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3673 case tignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3674 switch (fvdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3675 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3676 case fignore:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3677 if (typdef == tignore || cplpl)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3678 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3679 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3680 case fvnameseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3681 if ((globals && bracelev == 0 && (!fvextern || declarations))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3682 || (members && instruct))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3683 make_C_tag (FALSE); /* a variable */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3684 fvextern = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3685 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3686 token.valid = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3687 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3688 case flistseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3689 if ((declarations
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3690 && (cplpl || !instruct)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3691 && (typdef == tnone || (typdef != tignore && instruct)))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3692 || (members
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3693 && plainc && instruct))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3694 make_C_tag (TRUE); /* a function */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3695 /* FALLTHRU */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3696 default:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3697 fvextern = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3698 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3699 if (declarations
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3700 && cplpl && structdef == stagseen)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3701 make_C_tag (FALSE); /* forward declaration */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3702 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3703 token.valid = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3704 } /* switch (fvdef) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 default:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3707 if (!instruct)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3708 typdef = tnone;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710 if (structdef == stagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711 structdef = snone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 case ',':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3714 if (definedef != dnone || inattribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3715 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720 make_C_tag (TRUE); /* an Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 objdef = oinbody;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3726 case fdefunkey:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727 case foperator:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3728 case fstartlist:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3730 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3733 case fdefunname:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3734 fvdef = fignore;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3735 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3736 case fvnameseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3737 if (parlev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3738 && ((globals
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3739 && bracelev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3740 && templatelev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3741 && (!fvextern || declarations))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3742 || (members && instruct)))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3743 make_C_tag (FALSE); /* a variable */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3744 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3745 case flistseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3746 if ((declarations && typdef == tnone && !instruct)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3747 || (members && typdef != tignore && instruct))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3748 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3749 make_C_tag (TRUE); /* a function */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3750 fvdef = fvnameseen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3751 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3752 else if (!declarations)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3753 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3754 token.valid = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3758 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3759 if (structdef == stagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760 structdef = snone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3762 case ']':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3763 if (definedef != dnone || inattribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3765 if (structdef == stagseen)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3766 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3767 switch (typdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3769 case ttypeseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3770 case tend:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 typdef = tignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 make_C_tag (FALSE); /* a typedef */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3774 case tnone:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3775 case tinbody:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3776 switch (fvdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3777 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3778 case foperator:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3779 case finlist:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3780 case fignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3781 case vignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3782 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3783 case fvnameseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3784 if ((members && bracelev == 1)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3785 || (globals && bracelev == 0
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3786 && (!fvextern || declarations)))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3787 make_C_tag (FALSE); /* a variable */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3788 /* FALLTHRU */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3789 default:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3790 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3791 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795 case '(':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3796 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3797 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3798 attrparlev++;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3799 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3800 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3802 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 if (objdef == otagseen && parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 objdef = oparenseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807 case fvnameseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 if (typdef == ttypeseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 && *lp != '*'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3810 && !instruct)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 /* This handles constructs like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813 typedef void OperatorFun (int fun); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 make_C_tag (FALSE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 typdef = tignore;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3816 fvdef = fignore;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3817 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 fvdef = fstartlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823 case flistseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 fvdef = finlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3827 parlev++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829 case ')':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3830 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3831 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3832 if (--attrparlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3833 inattribute = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3834 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3835 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3836 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 if (objdef == ocatseen && parlev == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840 make_C_tag (TRUE); /* an Objective C category */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3843 if (--parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3844 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3845 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 case fstartlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849 fvdef = flistseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3850 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3851 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3852 if (!instruct
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3853 && (typdef == tend
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3854 || typdef == ttypeseen))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856 typdef = tignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857 make_C_tag (FALSE); /* a typedef */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3858 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3859 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3860 else if (parlev < 0) /* can happen due to ill-conceived #if's. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3861 parlev = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3862 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863 case '{':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3864 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3865 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 if (typdef == ttypeseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867 {
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3868 /* Whenever typdef is set to tinbody (currently only
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3869 here), typdefbracelev should be set to bracelev. */
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3870 typdef = tinbody;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3871 typdefbracelev = bracelev;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3872 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 case flistseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3876 make_C_tag (TRUE); /* a function */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3877 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3879 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881 case fvnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 case otagseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 make_C_tag (TRUE); /* an Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891 objdef = oinbody;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3893 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3894 /* Neutralize `extern "C" {' grot. */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3895 if (bracelev == 0 && structdef == snone && nestlev == 0
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3896 && typdef == tnone)
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3897 bracelev = -1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3898 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3899 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3900 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3901 switch (structdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3902 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3903 case skeyseen: /* unnamed struct */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3904 pushclass_above (bracelev, NULL, 0);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3905 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3906 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3907 case stagseen: /* named struct or enum */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3908 case scolonseen: /* a class */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3909 pushclass_above (bracelev,token.line+token.offset, token.length);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3910 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3911 make_C_tag (FALSE); /* a struct or enum */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3912 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3913 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3914 bracelev++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3915 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3916 case '*':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3917 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3918 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3919 if (fvdef == fstartlist)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3920 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3921 fvdef = fvnone; /* avoid tagging `foo' in `foo (*bar()) ()' */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3922 token.valid = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3923 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3924 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3925 case '}':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3926 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927 break;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3928 if (!ignoreindent && lp == newlb.buffer + 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3930 if (bracelev != 0)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3931 token.valid = FALSE;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3932 bracelev = 0; /* reset brace level if first column */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3933 parlev = 0; /* also reset paren level, just in case... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3935 else if (bracelev > 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3936 bracelev--;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3937 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3938 token.valid = FALSE; /* something gone amiss, token unreliable */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3939 popclass_above (bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3940 structdef = snone;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3941 /* Only if typdef == tinbody is typdefbracelev significant. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3942 if (typdef == tinbody && bracelev <= typdefbracelev)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3943 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3944 assert (bracelev == typdefbracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3945 typdef = tend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948 case '=':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3950 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3951 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3954 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3955 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3957 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3958 case fvnameseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3959 if ((members && bracelev == 1)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3960 || (globals && bracelev == 0 && (!fvextern || declarations)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3961 make_C_tag (FALSE); /* a variable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3963 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3964 fvdef = vignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3965 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3966 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3967 case '<':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3968 if (cplpl
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3969 && (structdef == stagseen || fvdef == fvnameseen))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3970 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3971 templatelev++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3972 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3973 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3974 goto resetfvdef;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3975 case '>':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3976 if (templatelev > 0)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3977 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3978 templatelev--;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3979 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3980 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3981 goto resetfvdef;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3982 case '+':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3983 case '-':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3984 if (objdef == oinbody && bracelev == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3985 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3986 objdef = omethodsign;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 /* FALLTHRU */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3990 resetfvdef:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3991 case '#': case '~': case '&': case '%': case '/':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3992 case '|': case '^': case '!': case '.': case '?':
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995 /* These surely cannot follow a function tag in C. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4003 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4008 if (objdef == otagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4009 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 /* If a macro spans multiple lines don't reset its state. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014 if (quotednl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015 CNL_SAVE_DEFINEDEF ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017 CNL ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019 } /* switch (c) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 } /* while not eof */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4022
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4023 free (lbs[0].lb.buffer);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4024 free (lbs[1].lb.buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 * Process either a C++ file or a C file depending on the setting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4029 * of a global flag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4031 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4032 default_C_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4033 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4035 C_entries (cplusplus ? C_PLPL : C_AUTO, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4036 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4037
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4038 /* Always do plain C. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4039 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040 plain_C_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4041 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4043 C_entries (0, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 /* Always do C++. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4047 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 Cplusplus_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4050 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4051 C_entries (C_PLPL, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4053
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4054 /* Always do Java. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4055 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 Cjava_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4058 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4059 C_entries (C_JAVA, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4062 /* Always do C*. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4063 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 Cstar_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 C_entries (C_STAR, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 /* Always do Yacc. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4071 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072 Yacc_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 C_entries (YACC, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4077
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4079 /* Useful macros. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 #define LOOP_ON_INPUT_LINES(file_pointer, line_buffer, char_pointer) \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4081 for (; /* loop initialization */ \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4082 !feof (file_pointer) /* loop test */ \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4083 && /* instructions at start of loop */ \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4084 (readline (&line_buffer, file_pointer), \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4085 char_pointer = line_buffer.buffer, \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 TRUE); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087 )
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4088
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4089 #define LOOKING_AT(cp, kw) /* kw is the keyword, a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4090 ((assert("" kw), TRUE) /* syntax error if not a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4091 && strneq ((cp), kw, sizeof(kw)-1) /* cp points at kw */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4092 && notinname ((cp)[sizeof(kw)-1]) /* end of kw */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4093 && ((cp) = skip_spaces((cp)+sizeof(kw)-1))) /* skip spaces */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4094
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4095 /* Similar to LOOKING_AT but does not use notinname, does not skip */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4096 #define LOOKING_AT_NOCASE(cp, kw) /* the keyword is a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4097 ((assert("" kw), TRUE) /* syntax error if not a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4098 && strncaseeq ((cp), kw, sizeof(kw)-1) /* cp points at kw */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4099 && ((cp) += sizeof(kw)-1)) /* skip spaces */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4101 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 * Read a file, but do no processing. This is used to do regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4103 * matching on files that have no language defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4104 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4105 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106 just_read_file (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4109 register char *dummy;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4111 LOOP_ON_INPUT_LINES (inf, lb, dummy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4112 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4113 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4114
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116 /* Fortran parsing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4117
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4118 static void F_takeprec __P((void));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4119 static void F_getit __P((FILE *));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4121 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4122 F_takeprec ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125 if (*dbp != '*')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4127 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4128 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129 if (strneq (dbp, "(*)", 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4131 dbp += 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4133 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4134 if (!ISDIGIT (*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4135 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136 --dbp; /* force failure */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4139 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 dbp++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4141 while (ISDIGIT (*dbp));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4144 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4145 F_getit (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4146 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4147 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4148 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4150 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4151 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4152 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4153 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4154 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 if (dbp[5] != '&')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4156 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4157 dbp += 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4160 if (!ISALPHA (*dbp) && *dbp != '_' && *dbp != '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4161 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162 for (cp = dbp + 1; *cp != '\0' && intoken (*cp); cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4164 make_tag (dbp, cp-dbp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4165 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4169 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 Fortran_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4173 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4175 if (*dbp == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176 dbp++; /* Ratfor escape to fortran */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4180 switch (lowcase (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4181 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182 case 'i':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4183 if (nocase_tail ("integer"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4184 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186 case 'r':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4187 if (nocase_tail ("real"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4188 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4190 case 'l':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4191 if (nocase_tail ("logical"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4192 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194 case 'c':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4195 if (nocase_tail ("complex") || nocase_tail ("character"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4196 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198 case 'd':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4199 if (nocase_tail ("double"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4204 if (nocase_tail ("precision"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4207 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213 switch (lowcase (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4214 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4216 if (nocase_tail ("function"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4217 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 case 's':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4220 if (nocase_tail ("subroutine"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4221 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4222 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223 case 'e':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4224 if (nocase_tail ("entry"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4225 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 case 'b':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4228 if (nocase_tail ("blockdata") || nocase_tail ("block data"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4229 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4230 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 if (*dbp == '\0') /* assume un-named */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4232 make_tag ("blockdata", 9, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4233 lb.buffer, dbp - lb.buffer, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4235 F_getit (inf); /* look for name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4241
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4243 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 * Ada parsing
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4245 * Original code by
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4246 * Philippe Waroquiers (1998)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4248
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4249 static void Ada_getit __P((FILE *, char *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4250
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4251 /* Once we are positioned after an "interesting" keyword, let's get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 the real tag value necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4254 Ada_getit (inf, name_qualifier)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256 char *name_qualifier;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4258 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 char *name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260 char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 while (!feof (inf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 if (*dbp == '\0'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 || (dbp[0] == '-' && dbp[1] == '-'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4268 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4271 switch (lowcase(*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 case 'b':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4274 if (nocase_tail ("body"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 /* Skipping body of procedure body or package body or ....
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 resetting qualifier to body instead of spec. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278 name_qualifier = "/b";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4281 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 case 't':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 /* Skipping type of task type or protected type ... */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4284 if (nocase_tail ("type"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 if (*dbp == '"')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4290 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 for (cp = dbp; *cp != '\0' && *cp != '"'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4294 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4295 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4296 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4297 for (cp = dbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 (*cp != '\0'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4299 && (ISALPHA (*cp) || ISDIGIT (*cp) || *cp == '_' || *cp == '.'));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 if (cp == dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4303 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 c = *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4306 *cp = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4307 name = concat (dbp, name_qualifier, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4308 *cp = c;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4309 make_tag (name, strlen (name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4310 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4311 free (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4312 if (c == '"')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313 dbp = cp + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4316 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4318 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4319 Ada_funcs (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4320 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 bool inquote = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4323 bool skip_till_semicolumn = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 while (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4328 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329 /* Skip a string i.e. "abcd". */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4330 if (inquote || (*dbp == '"'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 dbp = etags_strchr ((inquote) ? dbp : dbp+1, '"');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4333 if (dbp != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4335 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4336 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4337 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4339 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341 inquote = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4342 break; /* advance line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4343 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4346 /* Skip comments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347 if (dbp[0] == '-' && dbp[1] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 break; /* advance line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 /* Skip character enclosed in single quote i.e. 'a'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 and skip single quote starting an attribute i.e. 'Image. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 if (*dbp == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 dbp++ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 if (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4360 if (skip_till_semicolumn)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4361 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4362 if (*dbp == ';')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4363 skip_till_semicolumn = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4364 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4365 continue; /* advance char */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4366 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4367
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 /* Search for beginning of a token. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 if (!begtoken (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4372 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 /* We are at the beginning of a token. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4376 switch (lowcase(*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4377 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4378 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4379 if (!packages_only && nocase_tail ("function"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4380 Ada_getit (inf, "/f");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4383 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 case 'p':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4385 if (!packages_only && nocase_tail ("procedure"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4386 Ada_getit (inf, "/p");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4387 else if (nocase_tail ("package"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4388 Ada_getit (inf, "/s");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4389 else if (nocase_tail ("protected")) /* protected type */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4390 Ada_getit (inf, "/t");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393 continue; /* advance char */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4394
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4395 case 'u':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4396 if (typedefs && !packages_only && nocase_tail ("use"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4397 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4398 /* when tagging types, avoid tagging use type Pack.Typename;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4399 for this, we will skip everything till a ; */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4400 skip_till_semicolumn = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4401 continue; /* advance char */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4402 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4403
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404 case 't':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4405 if (!packages_only && nocase_tail ("task"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4406 Ada_getit (inf, "/k");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4407 else if (typedefs && !packages_only && nocase_tail ("type"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4408 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4409 Ada_getit (inf, "/t");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4410 while (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4411 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4412 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4414 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4415 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4416 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4418 /* Look for the end of the token. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4419 while (!endtoken (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4420 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4422 } /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4423 } /* advance line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4424 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4425
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4427 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4428 * Unix and microcontroller assembly tag handling
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4429 * Labels: /^[a-zA-Z_.$][a-zA_Z0-9_.$]*[: ^I^J]/
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4430 * Idea by Bob Weiner, Motorola Inc. (1994)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4431 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4432 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433 Asm_labels (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4436 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4438 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4439 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440 /* If first char is alphabetic or one of [_.$], test for colon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4441 following identifier. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4442 if (ISALPHA (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444 /* Read past label. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 cp++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4446 while (ISALNUM (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4447 cp++;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4448 if (*cp == ':' || iswhite (*cp))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4449 /* Found end of label, so copy it and add it to the table. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4450 make_tag (lb.buffer, cp - lb.buffer, TRUE,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4451 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4452 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4454 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4455
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4457 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4458 * Perl support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4459 * Perl sub names: /^sub[ \t\n]+[^ \t\n{]+/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4460 * Perl variable names: /^(my|local).../
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4461 * Original code by Bart Robinson <lomew@cs.utah.edu> (1995)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4462 * Additions by Michael Ernst <mernst@alum.mit.edu> (1997)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4463 * Ideas by Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> (2001)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4464 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4465 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 Perl_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4469 char *package = savestr ("main"); /* current package name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4473 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4474 skip_spaces(cp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4475
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4476 if (LOOKING_AT (cp, "package"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4477 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4478 free (package);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4479 get_tag (cp, &package);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4480 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4481 else if (LOOKING_AT (cp, "sub"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4482 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4483 char *pos;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4484 char *sp = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4485
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4486 while (!notinname (*cp))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4487 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4488 if (cp == sp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4489 continue; /* nothing found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4490 if ((pos = etags_strchr (sp, ':')) != NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4491 && pos < cp && pos[1] == ':')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4492 /* The name is already qualified. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4493 make_tag (sp, cp - sp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4494 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4495 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4496 /* Qualify it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4497 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4498 char savechar, *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4499
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4500 savechar = *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4501 *cp = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4502 name = concat (package, "::", sp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4503 *cp = savechar;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4504 make_tag (name, strlen(name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4505 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4506 free (name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4507 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4508 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4509 else if (globals) /* only if we are tagging global vars */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4510 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4511 /* Skip a qualifier, if any. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4512 bool qual = LOOKING_AT (cp, "my") || LOOKING_AT (cp, "local");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513 /* After "my" or "local", but before any following paren or space. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4514 char *varstart = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4515
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4516 if (qual /* should this be removed? If yes, how? */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4517 && (*cp == '$' || *cp == '@' || *cp == '%'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4518 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4519 varstart += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4520 do
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4521 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4522 while (ISALNUM (*cp) || *cp == '_');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4523 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4524 else if (qual)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526 /* Should be examining a variable list at this point;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4527 could insist on seeing an open parenthesis. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4528 while (*cp != '\0' && *cp != ';' && *cp != '=' && *cp != ')')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4531 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4532 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4533
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4534 make_tag (varstart, cp - varstart, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4535 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4536 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4538 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4539
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4540
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4541 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4542 * Python support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4543 * Look for /^[\t]*def[ \t\n]+[^ \t\n(:]+/ or /^class[ \t\n]+[^ \t\n(:]+/
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4544 * Idea by Eric S. Raymond <esr@thyrsus.com> (1997)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4545 * More ideas by seb bacon <seb@jamkit.com> (2002)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4546 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4547 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4548 Python_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4549 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4550 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4551 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4553 LOOP_ON_INPUT_LINES (inf, lb, cp)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4554 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4555 cp = skip_spaces (cp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4556 if (LOOKING_AT (cp, "def") || LOOKING_AT (cp, "class"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4557 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4558 char *name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4559 while (!notinname (*cp) && *cp != ':')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4560 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4561 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4562 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4563 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4564 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4565 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4566
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4567
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4568 /*
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4569 * PHP support
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4570 * Look for:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4571 * - /^[ \t]*function[ \t\n]+[^ \t\n(]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4572 * - /^[ \t]*class[ \t\n]+[^ \t\n]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4573 * - /^[ \t]*define\(\"[^\"]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4574 * Only with --members:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4575 * - /^[ \t]*var[ \t\n]+\$[^ \t\n=;]/
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4576 * Idea by Diez B. Roggisch (2001)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4577 */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4578 static void
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4579 PHP_functions (inf)
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4580 FILE *inf;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4581 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4582 register char *cp, *name;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4583 bool search_identifier = FALSE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4584
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4585 LOOP_ON_INPUT_LINES (inf, lb, cp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4586 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4587 cp = skip_spaces (cp);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4588 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4589 if (search_identifier
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4590 && *cp != '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4592 while (!notinname (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4594 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4595 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4596 search_identifier = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4597 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4598 else if (LOOKING_AT (cp, "function"))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4599 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4600 if(*cp == '&')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4601 cp = skip_spaces (cp+1);
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4602 if(*cp != '\0')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4603 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4604 name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4605 while (!notinname (*cp))
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4606 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4607 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4608 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4609 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4610 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4611 search_identifier = TRUE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4612 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4613 else if (LOOKING_AT (cp, "class"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4615 if (*cp != '\0')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4616 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4617 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4618 while (*cp != '\0' && !iswhite (*cp))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4619 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4620 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4621 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4622 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4623 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4624 search_identifier = TRUE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4625 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4626 else if (strneq (cp, "define", 6)
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4627 && (cp = skip_spaces (cp+6))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4628 && *cp++ == '('
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4629 && (*cp == '"' || *cp == '\''))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4630 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4631 char quote = *cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4632 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4633 while (*cp != quote && *cp != '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4634 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4635 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4636 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4637 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4638 else if (members
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4639 && LOOKING_AT (cp, "var")
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4640 && *cp == '$')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4641 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4642 name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4643 while (!notinname(*cp))
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4644 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4645 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4646 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4647 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4648 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4650
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4651
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4652 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4653 * Cobol tag functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654 * We could look for anything that could be a paragraph name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4655 * i.e. anything that starts in column 8 is one word and ends in a full stop.
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4656 * Idea by Corny de Souza (1993)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4657 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4658 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4659 Cobol_paragraphs (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4660 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4661 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4662 register char *bp, *ep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4664 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666 if (lb.len < 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4668 bp += 8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670 /* If eoln, compiler option or comment ignore whole line. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4671 if (bp[-1] != ' ' || !ISALNUM (bp[0]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4673
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4674 for (ep = bp; ISALNUM (*ep) || *ep == '-'; ep++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4676 if (*ep++ == '.')
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4677 make_tag (bp, ep - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4678 lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4679 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4680 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4681
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4682
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4683 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4684 * Makefile support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4685 * Ideas by Assar Westerlund <assar@sics.se> (2001)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4686 */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4687 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4688 Makefile_targets (inf)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4689 FILE *inf;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4690 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4691 register char *bp;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4692
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4693 LOOP_ON_INPUT_LINES (inf, lb, bp)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4694 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4695 if (*bp == '\t' || *bp == '#')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4696 continue;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4697 while (*bp != '\0' && *bp != '=' && *bp != ':')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4698 bp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4699 if (*bp == ':' || (globals && *bp == '='))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4700 make_tag (lb.buffer, bp - lb.buffer, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4701 lb.buffer, bp - lb.buffer + 1, lineno, linecharno);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4702 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4703 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4704
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4706 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4707 * Pascal parsing
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4708 * Original code by Mosur K. Mohan (1989)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4709 *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 * Locates tags for procedures & functions. Doesn't do any type- or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711 * var-definitions. It does look for the keyword "extern" or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 * "forward" immediately following the procedure statement; if found,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713 * the tag is skipped.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4715 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716 Pascal_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719 linebuffer tline; /* mostly copied from C_entries */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 long save_lcno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4721 int save_lineno, namelen, taglen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4722 char c, *name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724 bool /* each of these flags is TRUE iff: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4725 incomment, /* point is inside a comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726 inquote, /* point is inside '..' string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 get_tagname, /* point is after PROCEDURE/FUNCTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728 keyword, so next item = potential tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 found_tag, /* point is after a potential tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 inparms, /* point is within parameter-list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 verify_tag; /* point has passed the parm-list, so the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732 next token will determine whether this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733 is a FORWARD/EXTERN to be ignored, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4734 whether it is a real tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4736 save_lcno = save_lineno = namelen = taglen = 0; /* keep compiler quiet */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4737 name = NULL; /* keep compiler quiet */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 *dbp = '\0';
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4740 linebuffer_init (&tline);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 incomment = inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 found_tag = FALSE; /* have a proc name; check if extern */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4744 get_tagname = FALSE; /* found "procedure" keyword */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745 inparms = FALSE; /* found '(' after "proc" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746 verify_tag = FALSE; /* check if "extern" is ahead */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4748
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4749 while (!feof (inf)) /* long main loop to get next char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4750 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4751 c = *dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752 if (c == '\0') /* if end of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4753 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4754 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4756 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4758 if (!((found_tag && verify_tag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759 || get_tagname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4760 c = *dbp++; /* only if don't need *dbp pointing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4761 to the beginning of the name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4762 the procedure or function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4763 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4764 if (incomment)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4766 if (c == '}') /* within { } comments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4767 incomment = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768 else if (c == '*' && *dbp == ')') /* within (* *) comments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 incomment = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4773 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4774 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4775 else if (inquote)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4776 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 if (c == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4778 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4780 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 case '\'':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 inquote = TRUE; /* found first quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4786 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4787 case '{': /* found open { comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788 incomment = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790 case '(':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 if (*dbp == '*') /* found open (* comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4792 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4793 incomment = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 else if (found_tag) /* found '(' after tag, i.e., parm-list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 inparms = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4798 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 case ')': /* end of parms list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800 if (inparms)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 inparms = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 case ';':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 if (found_tag && !inparms) /* end of proc or fn stmt */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806 verify_tag = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4808 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4811 if (found_tag && verify_tag && (*dbp != ' '))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4812 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4813 /* Check if this is an "extern" declaration. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 if (lowcase (*dbp == 'e'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4818 if (nocase_tail ("extern")) /* superfluous, really! */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4821 verify_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4823 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 else if (lowcase (*dbp) == 'f')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4825 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4826 if (nocase_tail ("forward")) /* check for forward reference */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4829 verify_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4830 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4831 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832 if (found_tag && verify_tag) /* not external proc, so make tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 verify_tag = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4836 make_tag (name, namelen, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4837 tline.buffer, taglen, save_lineno, save_lcno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841 if (get_tagname) /* grab name of proc or fn */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4843 char *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4844
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4848 /* Find block name. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4849 for (cp = dbp + 1; *cp != '\0' && !endtoken (*cp); cp++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4850 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4851
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4852 /* Save all values for later tagging. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4853 linebuffer_setlen (&tline, lb.len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854 strcpy (tline.buffer, lb.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855 save_lineno = lineno;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856 save_lcno = linecharno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4857 name = tline.buffer + (dbp - lb.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4858 namelen = cp - dbp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4859 taglen = cp - lb.buffer + 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4860
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4861 dbp = cp; /* set dbp to e-o-token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862 get_tagname = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4863 found_tag = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4864 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4865
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4866 /* And proceed to check for "extern". */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 else if (!incomment && !inquote && !found_tag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4870 /* Check for proc/fn keywords. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 switch (lowcase (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873 case 'p':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4874 if (nocase_tail ("rocedure")) /* c = 'p', dbp has advanced */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 get_tagname = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4876 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4877 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4878 if (nocase_tail ("unction"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4879 get_tagname = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4881 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4882 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4883 } /* while not eof */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4884
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4885 free (tline.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4887
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4889 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4890 * Lisp tag functions
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4891 * look for (def or (DEF, quote or QUOTE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4893
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4894 static void L_getit __P((void));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4895
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4896 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4897 L_getit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4899 if (*dbp == '\'') /* Skip prefix quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4900 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4901 else if (*dbp == '(')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4902 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4903 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4904 /* Try to skip "(quote " */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4905 if (!LOOKING_AT (dbp, "quote") && !LOOKING_AT (dbp, "QUOTE"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4906 /* Ok, then skip "(" before name in (defstruct (foo)) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4907 dbp = skip_spaces (dbp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4909 get_tag (dbp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4912 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4913 Lisp_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4914 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4915 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4916 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4917 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4918 if (dbp[0] != '(')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4919 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4920
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4921 if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4922 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4923 dbp = skip_non_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4924 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4925 L_getit ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4926 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4927 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4928 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4929 /* Check for (foo::defmumble name-defined ... */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4930 do
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4931 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4932 while (!notinname (*dbp) && *dbp != ':');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4933 if (*dbp == ':')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4934 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4935 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4936 dbp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4937 while (*dbp == ':');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4938
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4939 if (strneq (dbp, "def", 3) || strneq (dbp, "DEF", 3))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4940 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4941 dbp = skip_non_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4942 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4943 L_getit ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4944 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4945 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4947 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4948 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4949
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4951 /*
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4952 * Lua script language parsing
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4953 * Original code by David A. Capello <dacap@users.sourceforge.net> (2004)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4954 *
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4955 * "function" and "local function" are tags if they start at column 1.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4956 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4957 static void
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4958 Lua_functions (inf)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4959 FILE *inf;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4960 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4961 register char *bp;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4962
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4963 LOOP_ON_INPUT_LINES (inf, lb, bp)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4964 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4965 if (bp[0] != 'f' && bp[0] != 'l')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4966 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4967
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4968 LOOKING_AT (bp, "local"); /* skip possible "local" */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4969
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4970 if (LOOKING_AT (bp, "function"))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4971 get_tag (bp, NULL);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4972 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4973 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4974
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4975
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4976 /*
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4977 * Postscript tags
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978 * Just look for lines where the first character is '/'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979 * Also look at "defineps" for PSWrap
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4980 * Ideas by:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4981 * Richard Mlynarik <mly@adoc.xerox.com> (1997)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4982 * Masatake Yamato <masata-y@is.aist-nara.ac.jp> (1999)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4983 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4984 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4985 PS_functions (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988 register char *bp, *ep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4991 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4992 if (bp[0] == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4994 for (ep = bp+1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995 *ep != '\0' && *ep != ' ' && *ep != '{';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996 ep++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4997 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4998 make_tag (bp, ep - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4999 lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5000 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5001 else if (LOOKING_AT (bp, "defineps"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5002 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5003 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5004 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007 /*
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5008 * Forth tags
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5009 * Ignore anything after \ followed by space or in ( )
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5010 * Look for words defined by :
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5011 * Look for constant, code, create, defer, value, and variable
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5012 * OBP extensions: Look for buffer:, field,
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5013 * Ideas by Eduardo Horvath <eeh@netbsd.org> (2004)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5014 */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5015 static void
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5016 Forth_words (inf)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5017 FILE *inf;
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5018 {
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5019 register char *bp;
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5020
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5021 LOOP_ON_INPUT_LINES (inf, lb, bp)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5022 while ((bp = skip_spaces (bp))[0] != '\0')
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5023 if (bp[0] == '\\' && iswhite(bp[1]))
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5024 break; /* read next line */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5025 else if (bp[0] == '(' && iswhite(bp[1]))
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5026 do /* skip to ) or eol */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5027 bp++;
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5028 while (*bp != ')' && *bp != '\0');
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5029 else if ((bp[0] == ':' && iswhite(bp[1]) && bp++)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5030 || LOOKING_AT_NOCASE (bp, "constant")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5031 || LOOKING_AT_NOCASE (bp, "code")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5032 || LOOKING_AT_NOCASE (bp, "create")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5033 || LOOKING_AT_NOCASE (bp, "defer")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5034 || LOOKING_AT_NOCASE (bp, "value")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5035 || LOOKING_AT_NOCASE (bp, "variable")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5036 || LOOKING_AT_NOCASE (bp, "buffer:")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5037 || LOOKING_AT_NOCASE (bp, "field"))
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5038 get_tag (skip_spaces (bp), NULL); /* Yay! A definition! */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5039 else
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5040 bp = skip_non_spaces (bp);
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5041 }
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5042
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5043
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5044 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045 * Scheme tag functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046 * look for (def... xyzzy
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5047 * (def... (xyzzy
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5048 * (def ... ((...(xyzzy ....
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5049 * (set! xyzzy
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5050 * Original code by Ken Haase (1985?)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5051 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5052 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 Scheme_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5056 register char *bp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5060 if (strneq (bp, "(def", 4) || strneq (bp, "(DEF", 4))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5062 bp = skip_non_spaces (bp+4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063 /* Skip over open parens and white space */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5064 while (notinname (*bp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065 bp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5066 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5068 if (LOOKING_AT (bp, "(SET!") || LOOKING_AT (bp, "(set!"))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5069 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5070 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5072
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074 /* Find tags in TeX and LaTeX input files. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076 /* TEX_toktab is a table of TeX control sequences that define tags.
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5077 * Each entry records one such control sequence.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5078 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5079 * Original code from who knows whom.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5080 * Ideas by:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5081 * Stefan Monnier (2002)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5082 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5083
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5084 static linebuffer *TEX_toktab = NULL; /* Table with tag tokens */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5085
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5086 /* Default set of control sequences to put into TEX_toktab.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087 The value of environment var TEXTAGS is prepended to this. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5088 static char *TEX_defenv = "\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089 :chapter:section:subsection:subsubsection:eqno:label:ref:cite:bibitem\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5090 :part:appendix:entry:index:def\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5091 :newcommand:renewcommand:newenvironment:renewenvironment";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5093 static void TEX_mode __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5094 static void TEX_decode_env __P((char *, char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5095
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5096 static char TEX_esc = '\\';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5097 static char TEX_opgrp = '{';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5098 static char TEX_clgrp = '}';
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5100 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5101 * TeX/LaTeX scanning loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5103 static void
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5104 TeX_commands (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5105 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5106 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5107 char *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5108 linebuffer *key;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5110 /* Select either \ or ! as escape character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5111 TEX_mode (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5113 /* Initialize token table once from environment. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5114 if (TEX_toktab == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5115 TEX_decode_env ("TEXTAGS", TEX_defenv);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5117 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5118 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5119 /* Look at each TEX keyword in line. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5120 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5121 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5122 /* Look for a TEX escape. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5123 while (*cp++ != TEX_esc)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5124 if (cp[-1] == '\0' || cp[-1] == '%')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5125 goto tex_next_line;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5126
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5127 for (key = TEX_toktab; key->buffer != NULL; key++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5128 if (strneq (cp, key->buffer, key->len))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5129 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5130 register char *p;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5131 int namelen, linelen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5132 bool opgrp = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5133
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5134 cp = skip_spaces (cp + key->len);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5135 if (*cp == TEX_opgrp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5136 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5137 opgrp = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5138 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5139 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5140 for (p = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5141 (!iswhite (*p) && *p != '#' &&
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5142 *p != TEX_opgrp && *p != TEX_clgrp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5143 p++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5144 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5145 namelen = p - cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5146 linelen = lb.len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5147 if (!opgrp || *p == TEX_clgrp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5148 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5149 while (*p != '\0' && *p != TEX_opgrp && *p != TEX_clgrp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5150 *p++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5151 linelen = p - lb.buffer + 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5152 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5153 make_tag (cp, namelen, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5154 lb.buffer, linelen, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5155 goto tex_next_line; /* We only tag a line once */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5156 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5157 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5158 tex_next_line:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5159 ;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5161 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163 #define TEX_LESC '\\'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5164 #define TEX_SESC '!'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5166 /* Figure out whether TeX's escapechar is '\\' or '!' and set grouping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5167 chars accordingly. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5168 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5169 TEX_mode (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172 int c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5174 while ((c = getc (inf)) != EOF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5175 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5176 /* Skip to next line if we hit the TeX comment char. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5177 if (c == '%')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5178 while (c != '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5179 c = getc (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180 else if (c == TEX_LESC || c == TEX_SESC )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5181 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5182 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 if (c == TEX_LESC)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5185 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5186 TEX_esc = TEX_LESC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187 TEX_opgrp = '{';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 TEX_clgrp = '}';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5190 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5191 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5192 TEX_esc = TEX_SESC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5193 TEX_opgrp = '<';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5194 TEX_clgrp = '>';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5195 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5196 /* If the input file is compressed, inf is a pipe, and rewind may fail.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5197 No attempt is made to correct the situation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5198 rewind (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5199 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5201 /* Read environment and prepend it to the default string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5202 Build token table. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5203 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5204 TEX_decode_env (evarname, defenv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5205 char *evarname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5206 char *defenv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5208 register char *env, *p;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5209 int i, len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5211 /* Append default string to environment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5212 env = getenv (evarname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5213 if (!env)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5214 env = defenv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5215 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5216 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5217 char *oldenv = env;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5218 env = concat (oldenv, defenv, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5219 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5221 /* Allocate a token table */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5222 for (len = 1, p = env; p;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5223 if ((p = etags_strchr (p, ':')) && *++p != '\0')
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5224 len++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5225 TEX_toktab = xnew (len, linebuffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5227 /* Unpack environment string into token table. Be careful about */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5228 /* zero-length strings (leading ':', "::" and trailing ':') */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5229 for (i = 0; *env != '\0';)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5230 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5231 p = etags_strchr (env, ':');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5232 if (!p) /* End of environment string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5233 p = env + strlen (env);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5234 if (p - env > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5235 { /* Only non-zero strings. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5236 TEX_toktab[i].buffer = savenstr (env, p - env);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5237 TEX_toktab[i].len = p - env;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5238 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5240 if (*p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5241 env = p + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5242 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5243 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5244 TEX_toktab[i].buffer = NULL; /* Mark end of table. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5245 TEX_toktab[i].len = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5246 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5247 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5248 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5249 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5250
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5251
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5252 /* Texinfo support. Dave Love, Mar. 2000. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5253 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5254 Texinfo_nodes (inf)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5255 FILE * inf;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5256 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5257 char *cp, *start;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5258 LOOP_ON_INPUT_LINES (inf, lb, cp)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5259 if (LOOKING_AT (cp, "@node"))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5260 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5261 start = cp;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5262 while (*cp != '\0' && *cp != ',')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5263 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5264 make_tag (start, cp - start, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5265 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5266 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5267 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5268
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5269
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5270 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5271 * HTML support.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5272 * Contents of <title>, <h1>, <h2>, <h3> are tags.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5273 * Contents of <a name=xxx> are tags with name xxx.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5274 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5275 * Francesco Potort́, 2002.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5276 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5277 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5278 HTML_labels (inf)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5279 FILE * inf;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5280 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5281 bool getnext = FALSE; /* next text outside of HTML tags is a tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5282 bool skiptag = FALSE; /* skip to the end of the current HTML tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5283 bool intag = FALSE; /* inside an html tag, looking for ID= */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5284 bool inanchor = FALSE; /* when INTAG, is an anchor, look for NAME= */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5285 char *end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5286
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5287
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5288 linebuffer_setlen (&token_name, 0); /* no name in buffer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5289
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5290 LOOP_ON_INPUT_LINES (inf, lb, dbp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5291 for (;;) /* loop on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5292 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5293 if (skiptag) /* skip HTML tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5294 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5295 while (*dbp != '\0' && *dbp != '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5296 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5297 if (*dbp == '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5298 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5299 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5300 skiptag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5301 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5302 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5303 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5304 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5305
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5306 else if (intag) /* look for "name=" or "id=" */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5307 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5308 while (*dbp != '\0' && *dbp != '>'
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5309 && lowcase (*dbp) != 'n' && lowcase (*dbp) != 'i')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5310 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5311 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5312 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5313 if (*dbp == '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5314 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5315 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5316 intag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5317 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5318 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5319 if ((inanchor && LOOKING_AT_NOCASE (dbp, "name="))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5320 || LOOKING_AT_NOCASE (dbp, "id="))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5321 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5322 bool quoted = (dbp[0] == '"');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5323
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5324 if (quoted)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5325 for (end = ++dbp; *end != '\0' && *end != '"'; end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5326 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5327 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5328 for (end = dbp; *end != '\0' && intoken (*end); end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5329 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5330 linebuffer_setlen (&token_name, end - dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5331 strncpy (token_name.buffer, dbp, end - dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5332 token_name.buffer[end - dbp] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5333
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5334 dbp = end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5335 intag = FALSE; /* we found what we looked for */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5336 skiptag = TRUE; /* skip to the end of the tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5337 getnext = TRUE; /* then grab the text */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5338 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5339 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5340 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5341 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5342
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5343 else if (getnext) /* grab next tokens and tag them */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5344 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5345 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5346 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5347 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5348 if (*dbp == '<')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5349 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5350 intag = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5351 inanchor = (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5352 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5353 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5354
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5355 for (end = dbp + 1; *end != '\0' && *end != '<'; end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5356 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5357 make_tag (token_name.buffer, token_name.len, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5358 dbp, end - dbp, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5359 linebuffer_setlen (&token_name, 0); /* no name in buffer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5360 getnext = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5361 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5362 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5363
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5364 else /* look for an interesting HTML tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5365 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5366 while (*dbp != '\0' && *dbp != '<')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5367 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5368 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5369 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5370 intag = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5371 if (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5372 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5373 inanchor = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5374 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5375 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5376 else if (LOOKING_AT_NOCASE (dbp, "<title>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5377 || LOOKING_AT_NOCASE (dbp, "<h1>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5378 || LOOKING_AT_NOCASE (dbp, "<h2>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5379 || LOOKING_AT_NOCASE (dbp, "<h3>"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5380 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5381 intag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5382 getnext = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5383 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5384 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5385 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5386 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5387 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5388 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5389
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5391 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5392 * Prolog support
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5393 *
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5394 * Assumes that the predicate or rule starts at column 0.
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5395 * Only the first clause of a predicate or rule is added.
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5396 * Original code by Sunichirou Sugou (1989)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5397 * Rewritten by Anders Lindgren (1996)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5398 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5399 static int prolog_pr __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5400 static void prolog_skip_comment __P((linebuffer *, FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5401 static int prolog_atom __P((char *, int));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5402
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5403 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5404 Prolog_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5405 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5406 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5407 char *cp, *last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5408 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5409 int allocated;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5411 allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5412 len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5413 last = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5415 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5416 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5417 if (cp[0] == '\0') /* Empty line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5418 continue;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5419 else if (iswhite (cp[0])) /* Not a predicate */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5420 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5421 else if (cp[0] == '/' && cp[1] == '*') /* comment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5422 prolog_skip_comment (&lb, inf);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5423 else if ((len = prolog_pr (cp, last)) > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5424 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5425 /* Predicate or rule. Store the function name so that we
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5426 only generate a tag for the first clause. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5427 if (last == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5428 last = xnew(len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5429 else if (len + 1 > allocated)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5430 xrnew (last, len + 1, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5431 allocated = len + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5432 strncpy (last, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5433 last[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5434 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5435 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5436 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5438
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5439 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5440 prolog_skip_comment (plb, inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5441 linebuffer *plb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5442 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5443 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5444 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5446 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5447 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5448 for (cp = plb->buffer; *cp != '\0'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5449 if (cp[0] == '*' && cp[1] == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5450 return;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5451 readline (plb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5452 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5453 while (!feof(inf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5454 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5456 /*
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5457 * A predicate or rule definition is added if it matches:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5458 * <beginning of line><Prolog Atom><whitespace>(
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5459 * or <beginning of line><Prolog Atom><whitespace>:-
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5460 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5461 * It is added to the tags database if it doesn't match the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5462 * name of the previous clause header.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5463 *
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5464 * Return the size of the name of the predicate or rule, or 0 if no
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5465 * header was found.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5466 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5467 static int
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5468 prolog_pr (s, last)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5469 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5470 char *last; /* Name of last clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5471 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5472 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5473 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5475 pos = prolog_atom (s, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5476 if (pos < 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5477 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5479 len = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5480 pos = skip_spaces (s + pos) - s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5481
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5482 if ((s[pos] == '.'
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5483 || (s[pos] == '(' && (pos += 1))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5484 || (s[pos] == ':' && s[pos + 1] == '-' && (pos += 2)))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5485 && (last == NULL /* save only the first clause */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5486 || len != (int)strlen (last)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5487 || !strneq (s, last, len)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5488 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5489 make_tag (s, len, TRUE, s, pos, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5490 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5491 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5492 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5493 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5494 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5496 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5497 * Consume a Prolog atom.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5498 * Return the number of bytes consumed, or -1 if there was an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5499 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5500 * A prolog atom, in this context, could be one of:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5501 * - An alphanumeric sequence, starting with a lower case letter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5502 * - A quoted arbitrary string. Single quotes can escape themselves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5503 * Backslash quotes everything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5504 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5505 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5506 prolog_atom (s, pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5507 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5508 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5509 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5510 int origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5512 origpos = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5513
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5514 if (ISLOWER(s[pos]) || (s[pos] == '_'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5515 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5516 /* The atom is unquoted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5517 pos++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5518 while (ISALNUM(s[pos]) || (s[pos] == '_'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5519 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5520 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5521 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5522 return pos - origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5523 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5524 else if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5526 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5527
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5528 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5529 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5530 if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5531 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5532 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5533 if (s[pos] != '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5534 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5535 pos++; /* A double quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5536 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5537 else if (s[pos] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5538 /* Multiline quoted atoms are ignored. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5539 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5540 else if (s[pos] == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5541 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5542 if (s[pos+1] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5543 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5544 pos += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5546 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5547 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5548 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5549 return pos - origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5550 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5551 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5552 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5553 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5554
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5556 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5557 * Support for Erlang
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5558 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5559 * Generates tags for functions, defines, and records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5560 * Assumes that Erlang functions start at column 0.
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5561 * Original code by Anders Lindgren (1996)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5562 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5563 static int erlang_func __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5564 static void erlang_attribute __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5565 static int erlang_atom __P((char *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5566
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5567 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5568 Erlang_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5569 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5570 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5571 char *cp, *last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5572 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5573 int allocated;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5575 allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5576 len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5577 last = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5579 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5580 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5581 if (cp[0] == '\0') /* Empty line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5582 continue;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5583 else if (iswhite (cp[0])) /* Not function nor attribute */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5584 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5585 else if (cp[0] == '%') /* comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5586 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5587 else if (cp[0] == '"') /* Sometimes, strings start in column one */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5588 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5589 else if (cp[0] == '-') /* attribute, e.g. "-define" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5590 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5591 erlang_attribute (cp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5592 last = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5593 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5594 else if ((len = erlang_func (cp, last)) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5595 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5596 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5597 * Function. Store the function name so that we only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5598 * generates a tag for the first clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5599 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5600 if (last == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5601 last = xnew (len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5602 else if (len + 1 > allocated)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5603 xrnew (last, len + 1, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5604 allocated = len + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5605 strncpy (last, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5606 last[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5607 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5608 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5609 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5612 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5613 * A function definition is added if it matches:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5614 * <beginning of line><Erlang Atom><whitespace>(
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5615 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5616 * It is added to the tags database if it doesn't match the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5617 * name of the previous clause header.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5618 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5619 * Return the size of the name of the function, or 0 if no function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5620 * was found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5621 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5622 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5623 erlang_func (s, last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5624 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5625 char *last; /* Name of last clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5626 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5627 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5628 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5629
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5630 pos = erlang_atom (s);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5631 if (pos < 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5632 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5634 len = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5635 pos = skip_spaces (s + pos) - s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5637 /* Save only the first clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5638 if (s[pos++] == '('
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5639 && (last == NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5640 || len != (int)strlen (last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5641 || !strneq (s, last, len)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5642 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5643 make_tag (s, len, TRUE, s, pos, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5644 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5645 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5647 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5648 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5651 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5652 * Handle attributes. Currently, tags are generated for defines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5653 * and records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5654 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5655 * They are on the form:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5656 * -define(foo, bar).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5657 * -define(Foo(M, N), M+N).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5658 * -record(graph, {vtab = notable, cyclic = true}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5659 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5660 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5661 erlang_attribute (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5662 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5663 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5664 char *cp = s;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5665
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5666 if ((LOOKING_AT (cp, "-define") || LOOKING_AT (cp, "-record"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5667 && *cp++ == '(')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5668 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5669 int len = erlang_atom (skip_spaces (cp));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5670 if (len > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5671 make_tag (cp, len, TRUE, s, cp + len - s, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5673 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5674 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5677 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5678 * Consume an Erlang atom (or variable).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5679 * Return the number of bytes consumed, or -1 if there was an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5680 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5681 static int
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5682 erlang_atom (s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5683 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5684 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5685 int pos = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5686
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5687 if (ISALPHA (s[pos]) || s[pos] == '_')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5688 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5689 /* The atom is unquoted. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5690 do
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5691 pos++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5692 while (ISALNUM (s[pos]) || s[pos] == '_');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5693 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5694 else if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5695 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5696 for (pos++; s[pos] != '\''; pos++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5697 if (s[pos] == '\0' /* multiline quoted atoms are ignored */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5698 || (s[pos] == '\\' && s[++pos] == '\0'))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5699 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5700 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5701 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5702
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5703 return pos;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5704 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5705
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5707 #ifdef ETAGS_REGEXPS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5708
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5709 static char *scan_separators __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5710 static void add_regex __P((char *, language *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5711 static char *substitute __P((char *, char *, struct re_registers *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5712
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5713 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5714 * Take a string like "/blah/" and turn it into "blah", verifying
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5715 * that the first and last characters are the same, and handling
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5716 * quoted separator characters. Actually, stops on the occurrence of
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5717 * an unquoted separator. Also process \t, \n, etc. and turn into
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5718 * appropriate characters. Works in place. Null terminates name string.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5719 * Returns pointer to terminating separator, or NULL for
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5720 * unterminated regexps.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5721 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5722 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5723 scan_separators (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5724 char *name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5725 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5726 char sep = name[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5727 char *copyto = name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5728 bool quoted = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5729
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5730 for (++name; *name != '\0'; ++name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5731 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5732 if (quoted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5733 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5734 switch (*name)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5735 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5736 case 'a': *copyto++ = '\007'; break; /* BEL (bell) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5737 case 'b': *copyto++ = '\b'; break; /* BS (back space) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5738 case 'd': *copyto++ = 0177; break; /* DEL (delete) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5739 case 'e': *copyto++ = 033; break; /* ESC (delete) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5740 case 'f': *copyto++ = '\f'; break; /* FF (form feed) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5741 case 'n': *copyto++ = '\n'; break; /* NL (new line) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5742 case 'r': *copyto++ = '\r'; break; /* CR (carriage return) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5743 case 't': *copyto++ = '\t'; break; /* TAB (horizontal tab) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5744 case 'v': *copyto++ = '\v'; break; /* VT (vertical tab) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5745 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5746 if (*name == sep)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5747 *copyto++ = sep;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5748 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5749 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5750 /* Something else is quoted, so preserve the quote. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5751 *copyto++ = '\\';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5752 *copyto++ = *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5753 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5754 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5755 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5756 quoted = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5758 else if (*name == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5759 quoted = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5760 else if (*name == sep)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5761 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5762 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5763 *copyto++ = *name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5764 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5765 if (*name != sep)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5766 name = NULL; /* signal unterminated regexp */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5768 /* Terminate copied string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5769 *copyto = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5770 return name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5773 /* Look at the argument of --regex or --no-regex and do the right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5774 thing. Same for each line of a regexp file. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5775 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5776 analyse_regex (regex_arg)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5777 char *regex_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5778 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5779 if (regex_arg == NULL)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5780 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5781 free_regexps (); /* --no-regex: remove existing regexps */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5782 return;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5783 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5785 /* A real --regexp option or a line in a regexp file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5786 switch (regex_arg[0])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5787 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5788 /* Comments in regexp file or null arg to --regex. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5789 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5790 case ' ':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5791 case '\t':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5792 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5794 /* Read a regex file. This is recursive and may result in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5795 loop, which will stop when the file descriptors are exhausted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5796 case '@':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5797 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5798 FILE *regexfp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5799 linebuffer regexbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5800 char *regexfile = regex_arg + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5802 /* regexfile is a file containing regexps, one per line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5803 regexfp = fopen (regexfile, "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5804 if (regexfp == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5805 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5806 pfatal (regexfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5807 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5808 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5809 linebuffer_init (&regexbuf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5810 while (readline_internal (&regexbuf, regexfp) > 0)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5811 analyse_regex (regexbuf.buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5812 free (regexbuf.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5813 fclose (regexfp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5814 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5815 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5817 /* Regexp to be used for a specific language only. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5818 case '{':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5819 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5820 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5821 char *lang_name = regex_arg + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5822 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5824 for (cp = lang_name; *cp != '}'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5825 if (*cp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5826 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5827 error ("unterminated language name in regex: %s", regex_arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5828 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5829 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5830 *cp++ = '\0';
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5831 lang = get_language_from_langname (lang_name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5832 if (lang == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5833 return;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5834 add_regex (cp, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5835 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5836 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5838 /* Regexp to be used for any language. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5839 default:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5840 add_regex (regex_arg, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5841 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5843 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5844
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5845 /* Separate the regexp pattern, compile it,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5846 and care for optional name and modifiers. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5847 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5848 add_regex (regexp_pattern, lang)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5849 char *regexp_pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5850 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5851 {
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5852 static struct re_pattern_buffer zeropattern;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5853 char sep, *pat, *name, *modifiers;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5854 const char *err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5855 struct re_pattern_buffer *patbuf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5856 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5857 bool
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5858 force_explicit_name = TRUE, /* do not use implicit tag names */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5859 ignore_case = FALSE, /* case is significant */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5860 multi_line = FALSE, /* matches are done one line at a time */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5861 single_line = FALSE; /* dot does not match newline */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5862
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5863
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5864 if (strlen(regexp_pattern) < 3)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5865 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5866 error ("null regexp", (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5867 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5868 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5869 sep = regexp_pattern[0];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5870 name = scan_separators (regexp_pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5871 if (name == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5872 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5873 error ("%s: unterminated regexp", regexp_pattern);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5874 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5875 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5876 if (name[1] == sep)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5877 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5878 error ("null name for regexp \"%s\"", regexp_pattern);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5879 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5880 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5881 modifiers = scan_separators (name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5882 if (modifiers == NULL) /* no terminating separator --> no name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5883 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5884 modifiers = name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5885 name = "";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5886 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5887 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5888 modifiers += 1; /* skip separator */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5889
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5890 /* Parse regex modifiers. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5891 for (; modifiers[0] != '\0'; modifiers++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5892 switch (modifiers[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5893 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5894 case 'N':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5895 if (modifiers == name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5896 error ("forcing explicit tag name but no name, ignoring", NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5897 force_explicit_name = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5898 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5899 case 'i':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5900 ignore_case = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5901 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5902 case 's':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5903 single_line = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5904 /* FALLTHRU */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5905 case 'm':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5906 multi_line = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5907 need_filebuf = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5908 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5909 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5910 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5911 char wrongmod [2];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5912 wrongmod[0] = modifiers[0];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5913 wrongmod[1] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5914 error ("invalid regexp modifier `%s', ignoring", wrongmod);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5915 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5916 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5917 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5919 patbuf = xnew (1, struct re_pattern_buffer);
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5920 *patbuf = zeropattern;
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5921 if (ignore_case)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5922 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5923 static char lc_trans[CHARS];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5924 int i;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5925 for (i = 0; i < CHARS; i++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5926 lc_trans[i] = lowcase (i);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5927 patbuf->translate = lc_trans; /* translation table to fold case */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5928 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5929
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5930 if (multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5931 pat = concat ("^", regexp_pattern, ""); /* anchor to beginning of line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5932 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5933 pat = regexp_pattern;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5934
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5935 if (single_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5936 re_set_syntax (RE_SYNTAX_EMACS | RE_DOT_NEWLINE);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5937 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5938 re_set_syntax (RE_SYNTAX_EMACS);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5939
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5940 err = re_compile_pattern (pat, strlen (regexp_pattern), patbuf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5941 if (multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5942 free (pat);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5943 if (err != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5944 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5945 error ("%s while compiling pattern", err);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5946 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5947 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5948
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5949 rp = p_head;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5950 p_head = xnew (1, regexp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5951 p_head->pattern = savestr (regexp_pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5952 p_head->p_next = rp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5953 p_head->lang = lang;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5954 p_head->pat = patbuf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5955 p_head->name = savestr (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5956 p_head->error_signaled = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5957 p_head->force_explicit_name = force_explicit_name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5958 p_head->ignore_case = ignore_case;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5959 p_head->multi_line = multi_line;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5960 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5962 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5963 * Do the substitutions indicated by the regular expression and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5964 * arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5965 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5966 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5967 substitute (in, out, regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5968 char *in, *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5969 struct re_registers *regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5970 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5971 char *result, *t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5972 int size, dig, diglen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5974 result = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5975 size = strlen (out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5976
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5977 /* Pass 1: figure out how much to allocate by finding all \N strings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5978 if (out[size - 1] == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5979 fatal ("pattern error in \"%s\"", out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5980 for (t = etags_strchr (out, '\\');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5981 t != NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5982 t = etags_strchr (t + 2, '\\'))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5983 if (ISDIGIT (t[1]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5984 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5985 dig = t[1] - '0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5986 diglen = regs->end[dig] - regs->start[dig];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5987 size += diglen - 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5988 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5989 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5990 size -= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5991
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5992 /* Allocate space and do the substitutions. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5993 assert (size >= 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5994 result = xnew (size + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5996 for (t = result; *out != '\0'; out++)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5997 if (*out == '\\' && ISDIGIT (*++out))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5998 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5999 dig = *out - '0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6000 diglen = regs->end[dig] - regs->start[dig];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6001 strncpy (t, in + regs->start[dig], diglen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6002 t += diglen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6003 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6004 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6005 *t++ = *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6006 *t = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6007
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6008 assert (t <= result + size);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6009 assert (t - result == (int)strlen (result));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6011 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6012 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6013
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6014 /* Deallocate all regexps. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6015 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6016 free_regexps ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6017 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6018 regexp *rp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6019 while (p_head != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6020 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6021 rp = p_head->p_next;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6022 free (p_head->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6023 free (p_head->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6024 free (p_head);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6025 p_head = rp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6026 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6027 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6028 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6029
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6030 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6031 * Reads the whole file as a single string from `filebuf' and looks for
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6032 * multi-line regular expressions, creating tags on matches.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6033 * readline already dealt with normal regexps.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6034 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6035 * Idea by Ben Wing <ben@666.com> (2002).
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6036 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6037 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6038 regex_tag_multiline ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6039 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6040 char *buffer = filebuf.buffer;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6041 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6042 char *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6043
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6044 for (rp = p_head; rp != NULL; rp = rp->p_next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6045 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6046 int match = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6047
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6048 if (!rp->multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6049 continue; /* skip normal regexps */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6050
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6051 /* Generic initialisations before parsing file from memory. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6052 lineno = 1; /* reset global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6053 charno = 0; /* reset global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6054 linecharno = 0; /* reset global char number of line start */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6055
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6056 /* Only use generic regexps or those for the current language. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6057 if (rp->lang != NULL && rp->lang != curfdp->lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6058 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6059
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6060 while (match >= 0 && match < filebuf.len)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6061 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6062 match = re_search (rp->pat, buffer, filebuf.len, charno,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6063 filebuf.len - match, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6064 switch (match)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6065 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6066 case -2:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6067 /* Some error. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6068 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6069 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6070 error ("regexp stack overflow while matching \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6071 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6072 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6073 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6074 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6075 case -1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6076 /* No match. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6077 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6078 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6079 if (match == rp->regs.end[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6080 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6081 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6082 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6083 error ("regexp matches the empty string: \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6084 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6085 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6086 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6087 match = -3; /* exit from while loop */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6088 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6089 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6090
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6091 /* Match occurred. Construct a tag. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6092 while (charno < rp->regs.end[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6093 if (buffer[charno++] == '\n')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6094 lineno++, linecharno = charno;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6095 name = rp->name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6096 if (name[0] == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6097 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6098 else /* make a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6099 name = substitute (buffer, rp->name, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6100 if (rp->force_explicit_name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6101 /* Force explicit tag name, if a name is there. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6102 pfnote (name, TRUE, buffer + linecharno,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6103 charno - linecharno + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6104 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6105 make_tag (name, strlen (name), TRUE, buffer + linecharno,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6106 charno - linecharno + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6107 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6108 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6109 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6110 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6111 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6112
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6113 #endif /* ETAGS_REGEXPS */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6114
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6115
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6116 static bool
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6117 nocase_tail (cp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6118 char *cp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6119 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6120 register int len = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6121
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6122 while (*cp != '\0' && lowcase (*cp) == lowcase (dbp[len]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6123 cp++, len++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6124 if (*cp == '\0' && !intoken (dbp[len]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6125 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6126 dbp += len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6127 return TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6128 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6129 return FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6130 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6131
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6132 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6133 get_tag (bp, namepp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6134 register char *bp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6135 char **namepp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6136 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6137 register char *cp = bp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6138
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6139 if (*bp != '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6140 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6141 /* Go till you get to white space or a syntactic break */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6142 for (cp = bp + 1; !notinname (*cp); cp++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6143 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6144 make_tag (bp, cp - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6145 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6146 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6147
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6148 if (namepp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6149 *namepp = savenstr (bp, cp - bp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6150 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6152 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6153 * Read a line of text from `stream' into `lbp', excluding the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6154 * newline or CR-NL, if any. Return the number of characters read from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6155 * `stream', which is the length of the line including the newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6156 *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6157 * On DOS or Windows we do not count the CR character, if any before the
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6158 * NL, in the returned length; this mirrors the behavior of Emacs on those
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6159 * platforms (for text files, it translates CR-NL to NL as it reads in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6160 * file).
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6161 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6162 * If multi-line regular expressions are requested, each line read is
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6163 * appended to `filebuf'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6164 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6165 static long
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6166 readline_internal (lbp, stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6167 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6168 register FILE *stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6169 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6170 char *buffer = lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6171 register char *p = lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6172 register char *pend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6173 int chars_deleted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6175 pend = p + lbp->size; /* Separate to avoid 386/IX compiler bug. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6176
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6177 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6178 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6179 register int c = getc (stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6180 if (p == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6181 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6182 /* We're at the end of linebuffer: expand it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6183 lbp->size *= 2;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6184 xrnew (buffer, lbp->size, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6185 p += buffer - lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6186 pend = buffer + lbp->size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6187 lbp->buffer = buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6188 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6189 if (c == EOF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6190 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6191 *p = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6192 chars_deleted = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6193 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6194 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6195 if (c == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6196 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6197 if (p > buffer && p[-1] == '\r')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6198 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6199 p -= 1;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6200 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6201 /* Assume CRLF->LF translation will be performed by Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6202 when loading this file, so CRs won't appear in the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6203 It would be cleaner to compensate within Emacs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6204 however, Emacs does not know how many CRs were deleted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6205 before any given point in the file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6206 chars_deleted = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6207 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6208 chars_deleted = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6209 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6210 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6211 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6212 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6213 chars_deleted = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6214 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6215 *p = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6216 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6217 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6218 *p++ = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6219 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6220 lbp->len = p - buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6221
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6222 if (need_filebuf /* we need filebuf for multi-line regexps */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6223 && chars_deleted > 0) /* not at EOF */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6224 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6225 while (filebuf.size <= filebuf.len + lbp->len + 1) /* +1 for \n */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6226 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6227 /* Expand filebuf. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6228 filebuf.size *= 2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6229 xrnew (filebuf.buffer, filebuf.size, char);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6230 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6231 strncpy (filebuf.buffer + filebuf.len, lbp->buffer, lbp->len);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6232 filebuf.len += lbp->len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6233 filebuf.buffer[filebuf.len++] = '\n';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6234 filebuf.buffer[filebuf.len] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6235 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6236
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6237 return lbp->len + chars_deleted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6238 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6240 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6241 * Like readline_internal, above, but in addition try to match the
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6242 * input line against relevant regular expressions and manage #line
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6243 * directives.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6244 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6245 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6246 readline (lbp, stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6247 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6248 FILE *stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6249 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6250 long result;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6251
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6252 linecharno = charno; /* update global char number of line start */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6253 result = readline_internal (lbp, stream); /* read line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6254 lineno += 1; /* increment global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6255 charno += result; /* increment global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6256
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6257 /* Honour #line directives. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6258 if (!no_line_directive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6259 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6260 static bool discard_until_line_directive;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6261
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6262 /* Check whether this is a #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6263 if (result > 12 && strneq (lbp->buffer, "#line ", 6))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6264 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6265 int start, lno;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6266
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6267 if (DEBUG) start = 0; /* shut up the compiler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6268 if (sscanf (lbp->buffer, "#line %d \"%n", &lno, &start) == 1)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6269 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6270 char *endp = lbp->buffer + start;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6271
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6272 assert (start > 0);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6273 while ((endp = etags_strchr (endp, '"')) != NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6274 && endp[-1] == '\\')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6275 endp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6276 if (endp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6277 /* Ok, this is a real #line directive. Let's deal with it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6278 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6279 char *taggedabsname; /* absolute name of original file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6280 char *taggedfname; /* name of original file as given */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6281 char *name; /* temp var */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6282
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6283 discard_until_line_directive = FALSE; /* found it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6284 name = lbp->buffer + start;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6285 *endp = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6286 canonicalize_filename (name); /* for DOS */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6287 taggedabsname = absolute_filename (name, curfdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6288 if (filename_is_absolute (name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6289 || filename_is_absolute (curfdp->infname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6290 taggedfname = savestr (taggedabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6291 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6292 taggedfname = relative_filename (taggedabsname,tagfiledir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6293
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6294 if (streq (curfdp->taggedfname, taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6295 /* The #line directive is only a line number change. We
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6296 deal with this afterwards. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6297 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6298 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6299 /* The tags following this #line directive should be
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6300 attributed to taggedfname. In order to do this, set
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6301 curfdp accordingly. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6302 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6303 fdesc *fdp; /* file description pointer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6304
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6305 /* Go look for a file description already set up for the
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6306 file indicated in the #line directive. If there is
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6307 one, use it from now until the next #line
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6308 directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6309 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6310 if (streq (fdp->infname, curfdp->infname)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6311 && streq (fdp->taggedfname, taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6312 /* If we remove the second test above (after the &&)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6313 then all entries pertaining to the same file are
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6314 coalesced in the tags file. If we use it, then
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6315 entries pertaining to the same file but generated
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6316 from different files (via #line directives) will
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6317 go into separate sections in the tags file. These
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6318 alternatives look equivalent. The first one
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6319 destroys some apparently useless information. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6320 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6321 curfdp = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6322 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6323 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6324 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6325 /* Else, if we already tagged the real file, skip all
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6326 input lines until the next #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6327 if (fdp == NULL) /* not found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6328 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6329 if (streq (fdp->infabsname, taggedabsname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6330 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6331 discard_until_line_directive = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6332 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6333 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6334 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6335 /* Else create a new file description and use that from
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6336 now on, until the next #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6337 if (fdp == NULL) /* not found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6338 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6339 fdp = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6340 fdhead = xnew (1, fdesc);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6341 *fdhead = *curfdp; /* copy curr. file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6342 fdhead->next = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6343 fdhead->infname = savestr (curfdp->infname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6344 fdhead->infabsname = savestr (curfdp->infabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6345 fdhead->infabsdir = savestr (curfdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6346 fdhead->taggedfname = taggedfname;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6347 fdhead->usecharno = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6348 fdhead->prop = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6349 fdhead->written = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6350 curfdp = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6351 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6352 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6353 free (taggedabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6354 lineno = lno - 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6355 readline (lbp, stream);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6356 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6357 } /* if a real #line directive */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6358 } /* if #line is followed by a a number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6359 } /* if line begins with "#line " */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6360
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6361 /* If we are here, no #line directive was found. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6362 if (discard_until_line_directive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6363 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6364 if (result > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6365 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6366 /* Do a tail recursion on ourselves, thus discarding the contents
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6367 of the line buffer. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6368 readline (lbp, stream);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6369 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6370 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6371 /* End of file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6372 discard_until_line_directive = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6373 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6374 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6375 } /* if #line directives should be considered */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6376
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6377 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6378 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6379 int match;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6380 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6381 char *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6382
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6383 /* Match against relevant regexps. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6384 if (lbp->len > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6385 for (rp = p_head; rp != NULL; rp = rp->p_next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6386 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6387 /* Only use generic regexps or those for the current language.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6388 Also do not use multiline regexps, which is the job of
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6389 regex_tag_multiline. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6390 if ((rp->lang != NULL && rp->lang != fdhead->lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6391 || rp->multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6392 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6393
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6394 match = re_match (rp->pat, lbp->buffer, lbp->len, 0, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6395 switch (match)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6396 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6397 case -2:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6398 /* Some error. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6399 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6400 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6401 error ("regexp stack overflow while matching \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6402 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6403 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6404 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6405 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6406 case -1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6407 /* No match. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6408 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6409 case 0:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6410 /* Empty string matched. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6411 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6412 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6413 error ("regexp matches the empty string: \"%s\"", rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6414 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6415 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6416 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6417 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6418 /* Match occurred. Construct a tag. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6419 name = rp->name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6420 if (name[0] == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6421 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6422 else /* make a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6423 name = substitute (lbp->buffer, rp->name, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6424 if (rp->force_explicit_name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6425 /* Force explicit tag name, if a name is there. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6426 pfnote (name, TRUE, lbp->buffer, match, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6427 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6428 make_tag (name, strlen (name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6429 lbp->buffer, match, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6430 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6431 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6432 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6433 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6434 #endif /* ETAGS_REGEXPS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6435 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6436
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6438 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6439 * Return a pointer to a space of size strlen(cp)+1 allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6440 * with xnew where the string CP has been copied.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6441 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6442 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6443 savestr (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6444 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6445 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6446 return savenstr (cp, strlen (cp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6447 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6449 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6450 * Return a pointer to a space of size LEN+1 allocated with xnew where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6451 * the string CP has been copied for at most the first LEN characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6452 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6453 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6454 savenstr (cp, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6455 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6456 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6457 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6458 register char *dp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6460 dp = xnew (len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6461 strncpy (dp, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6462 dp[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6463 return dp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6464 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6466 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6467 * Return the ptr in sp at which the character c last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6468 * appears; NULL if not found
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6469 *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6470 * Identical to POSIX strrchr, included for portability.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6471 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6472 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6473 etags_strrchr (sp, c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6474 register const char *sp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6475 register int c;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6476 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 432
diff changeset
6477 register const char *r;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6479 r = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6480 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6481 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6482 if (*sp == c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6483 r = sp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6484 } while (*sp++);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6485 return (char *)r;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6486 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6488 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6489 * Return the ptr in sp at which the character c first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6490 * appears; NULL if not found
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6491 *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6492 * Identical to POSIX strchr, included for portability.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6493 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6494 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6495 etags_strchr (sp, c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6496 register const char *sp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6497 register int c;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6498 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6499 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6500 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6501 if (*sp == c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6502 return (char *)sp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6503 } while (*sp++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6504 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6506
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6507 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6508 * Compare two strings, ignoring case for alphabetic characters.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6509 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6510 * Same as BSD's strcasecmp, included for portability.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6511 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6512 static int
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6513 etags_strcasecmp (s1, s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6514 register const char *s1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6515 register const char *s2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6516 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6517 while (*s1 != '\0'
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6518 && (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6519 ? lowcase (*s1) == lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6520 : *s1 == *s2))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6521 s1++, s2++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6522
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6523 return (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6524 ? lowcase (*s1) - lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6525 : *s1 - *s2);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6526 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6527
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6528 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6529 * Compare two strings, ignoring case for alphabetic characters.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6530 * Stop after a given number of characters
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6531 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6532 * Same as BSD's strncasecmp, included for portability.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6533 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6534 static int
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6535 etags_strncasecmp (s1, s2, n)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6536 register const char *s1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6537 register const char *s2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6538 register int n;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6539 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6540 while (*s1 != '\0' && n-- > 0
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6541 && (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6542 ? lowcase (*s1) == lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6543 : *s1 == *s2))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6544 s1++, s2++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6545
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6546 if (n < 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6547 return 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6548 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6549 return (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6550 ? lowcase (*s1) - lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6551 : *s1 - *s2);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6552 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6553
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
6554 /* Skip spaces (end of string is not space), return new pointer. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6555 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6556 skip_spaces (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6557 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6558 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6559 while (iswhite (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6560 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6561 return cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6562 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6563
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
6564 /* Skip non spaces, except end of string, return new pointer. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6565 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6566 skip_non_spaces (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6567 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6568 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6569 while (*cp != '\0' && !iswhite (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6570 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6571 return cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6572 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6574 /* Print error message and exit. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6575 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6576 fatal (s1, s2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6577 char *s1, *s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6578 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6579 error (s1, s2);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6580 exit (EXIT_FAILURE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6581 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6582
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6583 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6584 pfatal (s1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6585 char *s1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6586 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6587 perror (s1);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6588 exit (EXIT_FAILURE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6589 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6590
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6591 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6592 suggest_asking_for_help ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6593 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
6594 fprintf (stderr, "\tTry `%s %s' for a complete list of options.\n",
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
6595 progname, LONG_OPTIONS ? "--help" : "-h");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6596 exit (EXIT_FAILURE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6597 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6599 /* Print error message. `s1' is printf control string, `s2' is arg for it. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6600 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6601 error (s1, s2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6602 const char *s1, *s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6603 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6604 fprintf (stderr, "%s: ", progname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6605 fprintf (stderr, s1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6606 fprintf (stderr, "\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6607 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6609 /* Return a newly-allocated string whose contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6610 concatenate those of s1, s2, s3. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6611 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6612 concat (s1, s2, s3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6613 char *s1, *s2, *s3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6614 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6615 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6616 char *result = xnew (len1 + len2 + len3 + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6618 strcpy (result, s1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6619 strcpy (result + len1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6620 strcpy (result + len1 + len2, s3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6621 result[len1 + len2 + len3] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6622
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6623 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6624 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6625
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6626
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6627 /* Does the same work as the system V getcwd, but does not need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6628 guess the buffer size in advance. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6629 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6630 etags_getcwd ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6631 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6632 #ifdef HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6633 int bufsize = 200;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6634 char *path = xnew (bufsize, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6636 while (getcwd (path, bufsize) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6637 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6638 if (errno != ERANGE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6639 pfatal ("getcwd");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6640 bufsize *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6641 free (path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6642 path = xnew (bufsize, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6643 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6645 canonicalize_filename (path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6646 return path;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6648 #else /* not HAVE_GETCWD */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6649 #if MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6650
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6651 char *p, path[MAXPATHLEN + 1]; /* Fixed size is safe on MSDOS. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6652
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6653 getwd (path);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6654
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6655 for (p = path; *p != '\0'; p++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6656 if (*p == '\\')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6657 *p = '/';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6658 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6659 *p = lowcase (*p);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6660
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6661 return strdup (path);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6662 #else /* not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6663 linebuffer path;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6664 FILE *pipe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6665
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6666 linebuffer_init (&path);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6667 pipe = (FILE *) popen ("pwd 2>/dev/null", "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6668 if (pipe == NULL || readline_internal (&path, pipe) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6669 pfatal ("pwd");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6670 pclose (pipe);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6672 return path.buffer;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6673 #endif /* not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6674 #endif /* not HAVE_GETCWD */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6675 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6677 /* Return a newly allocated string containing the file name of FILE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6678 relative to the absolute directory DIR (which should end with a slash). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6679 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6680 relative_filename (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6681 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6682 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6683 char *fp, *dp, *afn, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6684 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6685
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6686 /* Find the common root of file and dir (with a trailing slash). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6687 afn = absolute_filename (file, cwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6688 fp = afn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6689 dp = dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6690 while (*fp++ == *dp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6691 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6692 fp--, dp--; /* back to the first differing char */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6693 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6694 if (fp == afn && afn[0] != '/') /* cannot build a relative name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6695 return afn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6696 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6697 do /* look at the equal chars until '/' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6698 fp--, dp--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6699 while (*fp != '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6701 /* Build a sequence of "../" strings for the resulting relative file name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6702 i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6703 while ((dp = etags_strchr (dp + 1, '/')) != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6704 i += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6705 res = xnew (3*i + strlen (fp + 1) + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6706 res[0] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6707 while (i-- > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6708 strcat (res, "../");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6710 /* Add the file name relative to the common root of file and dir. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6711 strcat (res, fp + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6712 free (afn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6714 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6715 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6716
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6717 /* Return a newly allocated string containing the absolute file name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6718 of FILE given DIR (which should end with a slash). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6719 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6720 absolute_filename (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6721 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6722 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6723 char *slashp, *cp, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6724
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6725 if (filename_is_absolute (file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6726 res = savestr (file);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6727 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6728 /* We don't support non-absolute file names with a drive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6729 letter, like `d:NAME' (it's too much hassle). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6730 else if (file[1] == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6731 fatal ("%s: relative file names with drive letters not supported", file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6732 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6733 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6734 res = concat (dir, file, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6736 /* Delete the "/dirname/.." and "/." substrings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6737 slashp = etags_strchr (res, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6738 while (slashp != NULL && slashp[0] != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6739 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6740 if (slashp[1] == '.')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6741 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6742 if (slashp[2] == '.'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6743 && (slashp[3] == '/' || slashp[3] == '\0'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6744 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6745 cp = slashp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6746 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6747 cp--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6748 while (cp >= res && !filename_is_absolute (cp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6749 if (cp < res)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6750 cp = slashp; /* the absolute name begins with "/.." */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6751 #ifdef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6752 /* Under MSDOS and NT we get `d:/NAME' as absolute
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6753 file name, so the luser could say `d:/../NAME'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6754 We silently treat this as `d:/NAME'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6755 else if (cp[0] != '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6756 cp = slashp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6757 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6758 strcpy (cp, slashp + 3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6759 slashp = cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6760 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6761 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6762 else if (slashp[2] == '/' || slashp[2] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6763 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6764 strcpy (slashp, slashp + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6765 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6766 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6769 slashp = etags_strchr (slashp + 1, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6770 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6771
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6772 if (res[0] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6773 return savestr ("/");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6774 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6775 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6776 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6778 /* Return a newly allocated string containing the absolute
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6779 file name of dir where FILE resides given DIR (which should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6780 end with a slash). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6781 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6782 absolute_dirname (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6783 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6784 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6785 char *slashp, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6786 char save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6788 canonicalize_filename (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6789 slashp = etags_strrchr (file, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6790 if (slashp == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6791 return savestr (dir);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6792 save = slashp[1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6793 slashp[1] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6794 res = absolute_filename (file, dir);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6795 slashp[1] = save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6797 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6798 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6799
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6800 /* Whether the argument string is an absolute file name. The argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6801 string must have been canonicalized with canonicalize_filename. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6802 static bool
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6803 filename_is_absolute (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6804 char *fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6805 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6806 return (fn[0] == '/'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6807 #ifdef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6808 || (ISALPHA(fn[0]) && fn[1] == ':' && fn[2] == '/')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6809 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6810 );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6811 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6813 /* Translate backslashes into slashes. Works in place. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6814 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6815 canonicalize_filename (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6816 register char *fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6817 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6818 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6819 /* Canonicalize drive letter case. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6820 if (fn[0] != '\0' && fn[1] == ':' && ISLOWER (fn[0]))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6821 fn[0] = upcase (fn[0]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6822 /* Convert backslashes to slashes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6823 for (; *fn != '\0'; fn++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6824 if (*fn == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6825 *fn = '/';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6826 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6827 /* No action. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6828 fn = NULL; /* shut up the compiler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6829 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6830 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6831
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6832
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6833 /* Initialize a linebuffer for use */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6834 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6835 linebuffer_init (lbp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6836 linebuffer *lbp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6837 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6838 lbp->size = (DEBUG) ? 3 : 200;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6839 lbp->buffer = xnew (lbp->size, char);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6840 lbp->buffer[0] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6841 lbp->len = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6842 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6843
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6844 /* Set the minimum size of a string contained in a linebuffer. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6845 static void
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6846 linebuffer_setlen (lbp, toksize)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6847 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6848 int toksize;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6849 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6850 while (lbp->size <= toksize)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6851 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6852 lbp->size *= 2;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6853 xrnew (lbp->buffer, lbp->size, char);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6854 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6855 lbp->len = toksize;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6856 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6857
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6858 /* Like malloc but get fatal error if memory is exhausted. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6859 static PTR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6860 xmalloc (size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6861 unsigned int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6862 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6863 PTR result = (PTR) malloc (size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6864 if (result == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6865 fatal ("virtual memory exhausted", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6866 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6867 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6868
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6869 static PTR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6870 xrealloc (ptr, size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6871 char *ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6872 unsigned int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6873 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6874 PTR result = (PTR) realloc (ptr, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6875 if (result == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6876 fatal ("virtual memory exhausted", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6877 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6878 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6879
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6880 /*
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6881 * Local Variables:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6882 * c-indentation-style: gnu
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6883 * indent-tabs-mode: t
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6884 * tab-width: 8
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6885 * fill-column: 79
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6886 * c-font-lock-extra-types: ("FILE" "bool" "language" "linebuffer" "fdesc" "node" "regexp")
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6887 * End:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6888 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6889
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6890 /* arch-tag: 8a9b748d-390c-4922-99db-2eeefa921051
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6891 (do not change this comment) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6892
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6893 /* etags.c ends here */