annotate lib-src/etags.c @ 2227:8e7b4a0c1a81

[xemacs-hg @ 2004-08-21 17:05:49 by michaels] 2004-08-15 Jan Rychter <jwr@xemacs.org> * window-xemacs.el (really-set-window-configuration): deal gracefully with the case when the buffer previously saved in the configuration (and that we want to switch to) has been killed. Switch to the next buffer on the buffer-list in that case.
author michaels
date Sat, 21 Aug 2004 17:05:51 +0000
parents 4968c73cb252
children 9d8bfee6e672
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 -*-
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2 Copyright (C) 1984, 1987-1989, 1993-1995, 1998-2001, 2002
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.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
35 *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
38 char pot_etags_version[] = "@(#) pot revision number is 16.56";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #define TRUE 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #define FALSE 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
43 #ifdef DEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
44 # undef DEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
45 # define DEBUG TRUE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
46 #else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
47 # define DEBUG FALSE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
48 # define NDEBUG /* disable assert */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #ifdef HAVE_CONFIG_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 # include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 /* On some systems, Emacs defines static as nothing for the sake
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 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
55 # undef static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 # define ETAGS_REGEXPS /* use the regexp features */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 # define LONG_OPTIONS /* accept long options */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
58 # ifndef PTR /* for XEmacs */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
59 # define PTR void *
715
add5a821a048 [xemacs-hg @ 2001-12-24 07:44:55 by yoshiki]
yoshiki
parents: 709
diff changeset
60 # endif
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
61 # ifndef __P /* for XEmacs */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
62 # define __P(args) args
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
63 # endif
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
64 #else
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
65 # if defined(__STDC__) && (__STDC__ || defined(__SUNPRO_C))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
66 # define __P(args) args /* use prototypes */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
67 # define PTR void * /* for generic pointers */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
68 # else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
69 # define __P(args) () /* no prototypes */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
70 # define const /* remove const for old compilers' sake */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
71 # define PTR long * /* don't use void* */
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
72 # endif
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
73 #endif /* !HAVE_CONFIG_H */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
432
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
75 #ifndef _GNU_SOURCE
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
76 # define _GNU_SOURCE 1 /* enables some compiler checks on GNU */
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
77 #endif
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
78
920
47ca978d6c75 [xemacs-hg @ 2002-07-14 14:23:43 by adrian]
adrian
parents: 771
diff changeset
79 /* WIN32_NATIVE is for XEmacs.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
80 MSDOS, WINDOWSNT, DOS_NT are for Emacs. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
81 #ifdef WIN32_NATIVE
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
82 # undef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
83 # undef WINDOWSNT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
84 # define WINDOWSNT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
85 #endif /* WIN32_NATIVE */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
86
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
87 #ifdef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
88 # undef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
89 # define MSDOS TRUE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
90 # include <fcntl.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
91 # include <sys/param.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
92 # include <io.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
93 # ifndef HAVE_CONFIG_H
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
94 # define DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
95 # include <sys/config.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
96 # endif
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
97 #else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
98 # define MSDOS FALSE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
99 #endif /* MSDOS */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
100
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
101 #ifdef WINDOWSNT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 # include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 # include <fcntl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 # include <string.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
105 # include <direct.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 # include <io.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 # define MAXPATHLEN _MAX_PATH
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
108 # undef HAVE_NTGUI
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
109 # undef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
110 # define DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 # ifndef HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 # define HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 # endif /* undef HAVE_GETCWD */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
114 #else /* !WINDOWSNT */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
115 # ifdef STDC_HEADERS
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
116 # include <stdlib.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
117 # include <string.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
118 # else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
119 extern char *getenv ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
120 # endif
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
121 #endif /* !WINDOWSNT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 #ifdef HAVE_UNISTD_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 # include <unistd.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 #else
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
126 # if defined (HAVE_GETCWD) && !defined (WINDOWSNT)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
127 extern char *getcwd (char *buf, size_t size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 #endif /* HAVE_UNISTD_H */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 #include <ctype.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 #include <errno.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
134 #ifndef errno
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
135 extern int errno;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
136 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 #include <sys/stat.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
140 #include <assert.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
141 #ifdef NDEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
142 # undef assert /* some systems have a buggy assert.h */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
143 # define assert(x) ((void) 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
144 #endif
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
145
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 #if !defined (S_ISREG) && defined (S_IFREG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 #endif
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 #ifdef LONG_OPTIONS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 # include <getopt.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 # define getopt_long(argc,argv,optstr,lopts,lind) getopt (argc, argv, optstr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 extern char *optarg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 extern int optind, opterr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 #endif /* LONG_OPTIONS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 #ifdef ETAGS_REGEXPS
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
159 # 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
160 # ifdef __CYGWIN__ /* compiling on Cygwin */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
161 !!! NOTICE !!!
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
162 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
163 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
164 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
165 # endif
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
166 # endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 # include <regex.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 #endif /* ETAGS_REGEXPS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 /* Define CTAGS to make the program "ctags" compatible with the usual one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 Leave it undefined to make the program "etags", which makes emacs-style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 tag tables and tags typedefs, #defines and struct/union/enum by default. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 #ifdef CTAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 # undef CTAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 # define CTAGS TRUE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 # define CTAGS FALSE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
180 #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
181 #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
182 #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
183 #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
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 #define CHARS 256 /* 2^sizeof(char) */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
186 #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
187 #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
188 #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
189 #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
190 #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
191 #define endtoken(c) (_etk[CHAR(c)]) /* c ends tokens (see endtk) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
193 #define ISALNUM(c) isalnum (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
194 #define ISALPHA(c) isalpha (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
195 #define ISDIGIT(c) isdigit (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
196 #define ISLOWER(c) islower (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
197
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
198 #define lowcase(c) tolower (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
199 #define upcase(c) toupper (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
200
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 * xnew, xrnew -- allocate, reallocate storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 * SYNOPSIS: Type *xnew (int n, Type);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
206 * void xrnew (OldPointer, int n, Type);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
208 #if DEBUG
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 # include "chkmalloc.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 # define xnew(n,Type) ((Type *) trace_malloc (__FILE__, __LINE__, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (n) * sizeof (Type)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
212 # define xrnew(op,n,Type) ((op) = (Type *) trace_realloc (__FILE__, __LINE__, \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
213 (char *) (op), (n) * sizeof (Type)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 # define xnew(n,Type) ((Type *) xmalloc ((n) * sizeof (Type)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
216 # define xrnew(op,n,Type) ((op) = (Type *) xrealloc ( \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
217 (char *) (op), (n) * sizeof (Type)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
220 #define bool int
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
221
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
222 typedef void Lang_function __P((FILE *));
428
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 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
226 char *suffix; /* file name suffix for this compressor */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
227 char *command; /* takes one arg and decompresses to stdout */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 } compressor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
232 char *name; /* language name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
233 char *help; /* detailed help for the language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
234 Lang_function *function; /* parse function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
235 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
236 char **filenames; /* names of this language's files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
237 char **interpreters; /* interpreters for this language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
238 bool metasource; /* source used to generate other sources */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 } language;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
241 typedef struct fdesc
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
242 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
243 struct fdesc *next; /* for the linked list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
244 char *infname; /* uncompressed input file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
245 char *infabsname; /* absolute uncompressed input file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
246 char *infabsdir; /* absolute dir of input file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
247 char *taggedfname; /* file name to write in tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
248 language *lang; /* language of file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
249 char *prop; /* file properties to write in tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
250 bool usecharno; /* etags tags shall contain char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
251 bool written; /* entry written in the tags file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
252 } fdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
253
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 typedef struct node_st
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
255 { /* sorting structure */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
256 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
257 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
258 char *name; /* tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
259 char *regex; /* search regexp */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
260 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
261 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
262 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
263 int lno; /* line number tag is on */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 long cno; /* character number line starts on */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 } node;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 * A `linebuffer' is a structure which holds a line of text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 * `readline_internal' reads a line from a stream into a linebuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 * and works regardless of the length of the line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 * 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
272 * BUFFER after readline reads it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 long size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 char *buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 } linebuffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
281 /* 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
282 typedef struct
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
283 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
284 enum {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
285 at_language, /* a language specification */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
286 at_regexp, /* a regular expression */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
287 at_filename, /* a file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
288 at_stdin, /* read from stdin here */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
289 at_end /* stop parsing the list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
290 } arg_type; /* argument type */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
291 language *lang; /* language associated with the argument */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
292 char *what; /* the argument itself */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
293 } argument;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
294
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
295 #ifdef ETAGS_REGEXPS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
296 /* Structure defining a regular expression. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
297 typedef struct regexp
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
298 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
299 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
300 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
301 char *pattern; /* the regexp pattern */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
302 char *name; /* tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
303 struct re_pattern_buffer *pat; /* the compiled pattern */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
304 struct re_registers regs; /* re registers */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
305 bool error_signaled; /* already signaled for this regexp */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
306 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
307 bool ignore_case; /* ignore case when matching */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
308 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
309 } regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
310 #endif /* ETAGS_REGEXPS */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
311
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
312
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 /* Many compilers barf on this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 Lang_function Ada_funcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 so let's write it this way */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
316 static void Ada_funcs __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
317 static void Asm_labels __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
318 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
319 static void default_C_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
320 static void plain_C_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
321 static void Cjava_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
322 static void Cobol_paragraphs __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
323 static void Cplusplus_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
324 static void Cstar_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
325 static void Erlang_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
326 static void Fortran_functions __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
327 static void HTML_labels __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
328 static void Lisp_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
329 static void Makefile_targets __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
330 static void Pascal_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
331 static void Perl_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
332 static void PHP_functions __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
333 static void PS_functions __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
334 static void Prolog_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
335 static void Python_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
336 static void Scheme_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
337 static void TeX_commands __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
338 static void Texinfo_nodes __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
339 static void Yacc_entries __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
340 static void just_read_file __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
341
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
342 static void print_language_names __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
343 static void print_version __P((void));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
344 static void print_help __P((argument *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
345 int main __P((int, char **));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
346
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
347 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
348 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
349 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
350 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
351 static void readline __P((linebuffer *, FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
352 static long readline_internal __P((linebuffer *, FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
353 static bool nocase_tail __P((char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
354 static void get_tag __P((char *, char **));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
357 static void analyse_regex __P((char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
358 static void free_regexps __P((void));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
359 static void regex_tag_multiline __P((void));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 #endif /* ETAGS_REGEXPS */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
361 static void error __P((const char *, const char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
362 static void suggest_asking_for_help __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
363 void fatal __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
364 static void pfatal __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
365 static void add_node __P((node *, node **));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
366
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
367 static void init __P((void));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
368 static void process_file_name __P((char *, language *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
369 static void process_file __P((FILE *, char *, language *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
370 static void find_entries __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
371 static void free_tree __P((node *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
372 static void free_fdesc __P((fdesc *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
373 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
374 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
375 static void invalidate_nodes __P((fdesc *, node **));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
376 static void put_entries __P((node *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
377
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
378 static char *concat __P((char *, char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
379 static char *skip_spaces __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
380 static char *skip_non_spaces __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
381 static char *savenstr __P((char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
382 static char *savestr __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
383 static char *etags_strchr __P((const char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
384 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
385 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
386 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
387 static char *etags_getcwd __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
388 static char *relative_filename __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
389 static char *absolute_filename __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
390 static char *absolute_dirname __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
391 static bool filename_is_absolute __P((char *f));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
392 static void canonicalize_filename __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
393 static void linebuffer_init __P((linebuffer *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
394 static void linebuffer_setlen __P((linebuffer *, int));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
395 static PTR xmalloc __P((unsigned int));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
396 static PTR xrealloc __P((char *, unsigned int));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
399 static char searchar = '/'; /* use /.../ searches */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
400
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
401 static char *tagfile; /* output file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
402 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
403 static char *cwd; /* current working directory */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
404 static char *tagfiledir; /* directory of tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
405 static FILE *tagf; /* ioptr for tags file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
406
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
407 static fdesc *fdhead; /* head of file description list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
408 static fdesc *curfdp; /* current file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
409 static int lineno; /* line number of current line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
410 static long charno; /* current character number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
411 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
412 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
413
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
414 static const int invalidcharno = -1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
415
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
416 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
417 static node *last_node; /* the last node created */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
418
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
419 static linebuffer lb; /* the current line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
420 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
421 static linebuffer token_name; /* a buffer containing a tag name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 /* boolean "functions" (see init) */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
424 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
425 static char
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 /* white chars */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
427 *white = " \f\t\n\r\v",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 /* not in a name */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
429 *nonam = " \f\t\n\r()=,;", /* look at make_tag before modifying! */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 /* token ending chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 *endtk = " \t\n\r\"'#()[]{}=-+%*/&|^~!<>;,.:?",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 /* token starting chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$~@",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 /* valid in-token chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 *midtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
437 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
438 /* 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
439 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
440 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
441 /* 0 struct/enum/union decls, and C++ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 /* member functions. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
443 static bool constantypedefs; /* -d: create tags for C #define, enum */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 /* constants and variables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 /* -D: opposite of -d. Default under ctags. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
446 static bool globals; /* create tags for global variables */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
447 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
448 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
449 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
450 static bool update; /* -u: update tags */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
451 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
452 static bool no_warnings; /* -w: suppress warnings */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
453 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
454 static bool cplusplus; /* .[hc] means C++, not C */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
455 static bool ignoreindent; /* -I: ignore indentation in C */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
456 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
457
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
458 #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
459 static bool parsing_stdin; /* --parse-stdin used */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
460
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
461 #ifdef ETAGS_REGEXPS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
462 static regexp *p_head; /* list of all regexps */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
463 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
464 #else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
465 # define need_filebuf FALSE
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
466 #endif /* ETAGS_REGEXPS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 #ifdef LONG_OPTIONS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
469 static struct option longopts[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
471 { "packages-only", no_argument, &packages_only, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
472 { "c++", no_argument, NULL, 'C' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
473 { "declarations", no_argument, &declarations, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
474 { "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
475 { "help", no_argument, NULL, 'h' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
476 { "help", no_argument, NULL, 'H' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
477 { "ignore-indentation", no_argument, NULL, 'I' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
478 { "language", required_argument, NULL, 'l' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
479 { "members", no_argument, &members, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
480 { "no-members", no_argument, &members, FALSE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
481 { "output", required_argument, NULL, 'o' },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
483 { "regex", required_argument, NULL, 'r' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
484 { "no-regex", no_argument, NULL, 'R' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
485 { "ignore-case-regex", required_argument, NULL, 'c' },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 #endif /* ETAGS_REGEXPS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
487 { "parse-stdin", required_argument, NULL, STDIN },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
488 { "version", no_argument, NULL, 'V' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
489
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
490 #if CTAGS /* Etags options */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
491 { "backward-search", no_argument, NULL, 'B' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
492 { "cxref", no_argument, NULL, 'x' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
493 { "defines", no_argument, NULL, 'd' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
494 { "globals", no_argument, &globals, TRUE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
495 { "typedefs", no_argument, NULL, 't' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
496 { "typedefs-and-c++", no_argument, NULL, 'T' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
497 { "update", no_argument, NULL, 'u' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
498 { "vgrind", no_argument, NULL, 'v' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
499 { "no-warn", no_argument, NULL, 'w' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
500
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
501 #else /* Ctags options */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
502 { "append", no_argument, NULL, 'a' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
503 { "no-defines", no_argument, NULL, 'D' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
504 { "no-globals", no_argument, &globals, FALSE },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
505 { "include", required_argument, NULL, 'i' },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
506 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 { NULL }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 #endif /* LONG_OPTIONS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
511 static compressor compressors[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 { "z", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 { "Z", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 { "gz", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 { "GZ", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 { "bz2", "bzip2 -d -c" },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 { NULL }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 * Language stuff.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 /* Ada code */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
526 static char *Ada_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 { "ads", "adb", "ada", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
528 static char Ada_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
529 "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
530 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
531 packages only.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
532 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
533 Entity type: Qualifier:\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
534 ------------ ----------\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
535 function /f\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
536 procedure /p\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
537 package spec /s\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
538 package body /b\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
539 type /t\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
540 task /k\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
541 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
542 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
543 will just search for any tag `bidule'.";
428
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 /* Assembly code */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
546 static char *Asm_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
547 { "a", /* Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
548 "asm", /* Microcontroller assembly */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
549 "def", /* BSO/Tasking definition includes */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
550 "inc", /* Microcontroller include files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
551 "ins", /* Microcontroller include files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
552 "s", "sa", /* Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
553 "S", /* cpp-processed Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
554 "src", /* BSO/Tasking C compiler output */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
555 NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
556 };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
557 static char Asm_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
558 "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
559 followed by a colon, are tags.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
560
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 /* 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
563 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
564 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
565 static char *default_C_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 { "c", "h", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
567 static char default_C_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
568 "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
569 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
570 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
571 `--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
572 `--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
573 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
574 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
575 using `--declarations', and struct members by using `--members'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
576
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
577 static char *Cplusplus_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
578 { "C", "c++", "cc", "cpp", "cxx", "H", "h++", "hh", "hpp", "hxx",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 "M", /* Objective C++ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 "pdb", /* Postscript with C syntax */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
582 static char Cplusplus_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
583 "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
584 --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
585 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
586 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
587 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
588 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
589 `operator+'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
590
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
591 static char *Cjava_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 { "java", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
593 static char Cjava_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
594 "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
595 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
596
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 *Cobol_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 { "COB", "cob", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
600 static char Cobol_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
601 "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
602 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
603
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
604 static char *Cstar_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 { "cs", "hs", NULL };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
607 static char *Erlang_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 { "erl", "hrl", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
609 static char Erlang_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
610 "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
611 defined in the file.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
612
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
613 static char *Fortran_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 { "F", "f", "f90", "for", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
615 static char Fortran_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
616 "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
617
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
618 static char *HTML_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
619 { "htm", "html", "shtml", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
620 static char HTML_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
621 "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
622 `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
623 occurrences of `id='.";
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 *Lisp_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
626 { "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
627 static char Lisp_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
628 "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
629 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
630 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
631 is a tag.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
632
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
633 static char *Makefile_filenames [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
634 { "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
635 static char Makefile_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
636 "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
637 unless you specify `--no-globals'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
638
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
639 static char *Objc_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
640 { "lm", /* Objective lex file */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 "m", /* Objective C file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
643 static char Objc_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
644 "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
645 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
646 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
647
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
648 static char *Pascal_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
649 { "p", "pas", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
650 static char Pascal_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
651 "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
652 in the file.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
653
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
654 static char *Perl_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
655 { "pl", "pm", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
656 static char *Perl_interpreters [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
657 { "perl", "@PERL@", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
658 static char Perl_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
659 "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
660 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
661 `--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
662 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
663 defined in the default package is `main::SUB'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
664
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
665 static char *PHP_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
666 { "php", "php3", "php4", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
667 static char PHP_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
668 "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
669 the `--members' option, vars are tags too.";
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 *plain_C_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
672 { "pc", /* Pro*C file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
673 NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
674
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
675 static char *PS_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 { "ps", "psw", NULL }; /* .psw is for PSWrap */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
677 static char PS_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
678 "In PostScript code, the tags are the functions.";
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 *Prolog_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 { "prolog", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
682 static char Prolog_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
683 "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
684 line.";
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 *Python_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 { "py", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
688 static char Python_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
689 "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
690 generate a tag.";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 /* 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
693 static char *Scheme_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
694 { "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
695 static char Scheme_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
696 "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
697 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
698 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
699
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
700 static char *TeX_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
701 { "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
702 static char TeX_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
703 "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
704 `\\section', `\\subsection', `\\subsubsection', `\\eqno', `\\label',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
705 `\\ref', `\\cite', `\\bibitem', `\\part', `\\appendix', `\\entry',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
706 `\\index', `\\def', `\\newcommand', `\\renewcommand',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
707 `\\newenvironment' or `\\renewenvironment' is a tag.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
708 \n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
709 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
710 `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
711 TEXTAGS=\"mycommand:myothercommand\".";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
712
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
713
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
714 static char *Texinfo_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
715 { "texi", "texinfo", "txi", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
716 static char Texinfo_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
717 "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
718
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
719 static char *Yacc_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
720 { "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
721 static char Yacc_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
722 "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
723 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
724 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
725 for full help).";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
726
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
727 static char auto_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
728 "`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
729 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
730
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
731 static char none_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
732 "`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
733 regexp processing on files.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
734
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
735 static char no_lang_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
736 "No detailed help available for this language.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
737
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 * Table of languages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 * 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
743 * name. I just didn't.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
746 static language lang_names [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
748 { "ada", Ada_help, Ada_funcs, Ada_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
749 { "asm", Asm_help, Asm_labels, Asm_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
750 { "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
751 { "c++", Cplusplus_help, Cplusplus_entries, Cplusplus_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
752 { "c*", no_lang_help, Cstar_entries, Cstar_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
753 { "cobol", Cobol_help, Cobol_paragraphs, Cobol_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
754 { "erlang", Erlang_help, Erlang_functions, Erlang_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
755 { "fortran", Fortran_help, Fortran_functions, Fortran_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
756 { "html", HTML_help, HTML_labels, HTML_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
757 { "java", Cjava_help, Cjava_entries, Cjava_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
758 { "lisp", Lisp_help, Lisp_functions, Lisp_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
759 { "makefile", Makefile_help,Makefile_targets,NULL,Makefile_filenames},
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
760 { "objc", Objc_help, plain_C_entries, Objc_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
761 { "pascal", Pascal_help, Pascal_functions, Pascal_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
762 { "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
763 { "php", PHP_help, PHP_functions, PHP_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
764 { "postscript",PS_help, PS_functions, PS_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
765 { "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
766 { "prolog", Prolog_help, Prolog_functions, Prolog_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
767 { "python", Python_help, Python_functions, Python_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
768 { "scheme", Scheme_help, Scheme_functions, Scheme_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
769 { "tex", TeX_help, TeX_commands, TeX_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
770 { "texinfo", Texinfo_help, Texinfo_nodes, Texinfo_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
771 { "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
772 { "auto", auto_help }, /* default guessing scheme */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
773 { "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
774 { NULL } /* end of list */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 };
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
776
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 print_language_names ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 language *lang;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
782 char **name, **ext;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 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
785 default file names and dot suffixes:");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
788 printf (" %-*s", 10, lang->name);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
789 if (lang->filenames != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
790 for (name = lang->filenames; *name != NULL; name++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
791 printf (" %s", *name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 if (lang->suffixes != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 for (ext = lang->suffixes; *ext != NULL; ext++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 printf (" .%s", *ext);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 puts ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
797 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
798 name suffix, and `none' means only do regexp processing on files.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 If no language is specified and no matching suffix is found,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 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
801 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
802 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
803 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
804 switches to C++.");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
805 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
806 \n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
807 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
808 etags --help --lang=ada.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
811 #ifndef EMACS_NAME
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
812 # define EMACS_NAME "standalone"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 #ifndef VERSION
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
815 # define VERSION "version"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 print_version ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
820 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
821 puts ("Copyright (C) 2002 Free Software Foundation, Inc. and Ken Arnold");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 puts ("This program is distributed under the same terms as Emacs");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
824 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
828 print_help (argbuffer)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
829 argument *argbuffer;
428
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 bool help_for_lang = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
832
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
833 for (; argbuffer->arg_type != at_end; argbuffer++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
834 if (argbuffer->arg_type == at_language)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
835 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
836 if (help_for_lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
837 puts ("");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
838 puts (argbuffer->lang->help);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
839 help_for_lang = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
840 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
841
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
842 if (help_for_lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
843 exit (EXIT_SUCCESS);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
844
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 printf ("Usage: %s [options] [[regex-option ...] file-name] ...\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 \n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 These are the options accepted by %s.\n", progname, progname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 #ifdef LONG_OPTIONS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 puts ("You may use unambiguous abbreviations for the long option names.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 puts ("Long option names do not work with this executable, as it is not\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 linked with GNU getopt.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 #endif /* LONG_OPTIONS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
854 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
855 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
856 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
857
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
859 puts ("-a, --append\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 Append tag entries to existing tags file.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 puts ("--packages-only\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
863 For Ada files, only generate tags for packages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 puts ("-B, --backward-search\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 Write the search commands for the tag entries using '?', the\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 backward-search command instead of '/', the forward-search command.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
870 /* This option is mostly obsolete, because etags can now automatically
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
871 detect C++. Retained for backward compatibility and for debugging and
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
872 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
873 before any "class" or "template" keyword.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 puts ("-C, --c++\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 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
876 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 puts ("--declarations\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 In C and derived languages, create tags for function declarations,");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 puts ("\tand create tags for extern variables if --globals is used.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 puts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 ("\tand create tags for extern variables unless --no-globals is used.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 puts ("-d, --defines\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 Create tag entries for C #define constants and enum constants, too.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 puts ("-D, --no-defines\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 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
892 This makes the tags file smaller.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
895 puts ("-i FILE, --include=FILE\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 Include a note in tag file indicating that, when searching for\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 a tag, one should also consult the tags file FILE after\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 checking the current file.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
899
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
900 puts ("-l LANG, --language=LANG\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 Force the following files to be considered as written in the\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 named language up to the next --language=LANG option.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 puts ("--globals\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 Create tag entries for global variables in some languages.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 puts ("--no-globals\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 Do not create tag entries for global variables in some\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 languages. This makes the tags file smaller.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 puts ("--members\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
912 Create tag entries for members of structures in some languages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
915 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
916 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
917 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
918 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
919 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
920 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
921 puts (" If TAGNAME/ is present, the tags created are named.\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 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
923 --regex=\"/proc[ \\t]+\\([^ \\t]+\\)/\\1/.\".\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
924 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
925 `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
926 causes dot to match any character, including newline.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 puts ("-R, --no-regex\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 Don't create tags from regexps for the following files.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 #endif /* ETAGS_REGEXPS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
930 puts ("-I, --ignore-indentation\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
931 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
932 column is the final brace of a function or structure definition.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 puts ("-o FILE, --output=FILE\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 Write the tags to FILE.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
935 puts ("--parse-stdin=NAME\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
936 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
937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 puts ("-t, --typedefs\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 Generate tag entries for C and Ada typedefs.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 puts ("-T, --typedefs-and-c++\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 Generate tag entries for C typedefs, C struct/enum/union tags,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 and C++ member functions.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
945 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
946
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
947 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
948 puts ("-u, --update\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 Update the tag entries for the given files, leaving tag\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 entries for other files in place. Currently, this is\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 implemented by deleting the existing entries for the given\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 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
953 tags file. It is often faster to simply rebuild the entire\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 tag file than to use this.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
955
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
956 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
957 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 puts ("-v, --vgrind\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 Generates an index of items intended for human consumption,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 similar to the output of vgrind. The index is sorted, and\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 gives the page number of each item.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 puts ("-w, --no-warn\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 Suppress warning messages about entries defined in multiple\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 files.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 puts ("-x, --cxref\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 Like --vgrind, but in the style of cxref, rather than vgrind.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 The output uses line numbers instead of page numbers, but\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 beyond that the differences are cosmetic; try both to see\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 which you like.");
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 puts ("-V, --version\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 Print the version of the program.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 -h, --help\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
975 Print this help message.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
976 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
977 help about tag generation for the specified languages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 print_language_names ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 puts ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 puts ("Report bugs to bug-gnu-emacs@gnu.org");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
984 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 #ifdef VMS /* VMS specific functions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 #define EOS '\0'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 /* This is a BUG! ANY arbitrary limit is a BUG!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 Won't someone please fix this? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 #define MAX_FILE_SPEC_LEN 255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 typedef struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 short curlen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 char body[MAX_FILE_SPEC_LEN + 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 } vspec;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 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
1002 returning in each successive call the next file name matching the input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 spec. The function expects that each in_spec passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 to it will be processed to completion; in particular, up to and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 including the call following that in which the last matching name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 is returned, the function ignores the value of in_spec, and will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 only start processing a new spec with the following call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 If an error occurs, on return out_spec contains the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 of in_spec when the error occurred.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 With each successive file name returned in out_spec, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 function's return value is one. When there are no more matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 names the function returns zero. If on the first call no file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 matches in_spec, or there is any other error, -1 is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 #include <rmsdef.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 #include <descrip.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 #define OUTSIZE MAX_FILE_SPEC_LEN
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1020 static short
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 fn_exp (out, in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 vspec *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 char *in;
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 static long context = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 static struct dsc$descriptor_s o;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 static struct dsc$descriptor_s i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 static bool pass1 = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 long status;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 short retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 if (pass1)
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 pass1 = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 o.dsc$a_pointer = (char *) out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 o.dsc$w_length = (short)OUTSIZE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 i.dsc$a_pointer = in;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 i.dsc$w_length = (short)strlen(in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 i.dsc$b_dtype = DSC$K_DTYPE_T;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 i.dsc$b_class = DSC$K_CLASS_S;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 o.dsc$b_dtype = DSC$K_DTYPE_VT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 o.dsc$b_class = DSC$K_CLASS_VS;
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 if ((status = lib$find_file(&i, &o, &context, 0, 0)) == RMS$_NORMAL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 out->body[out->curlen] = EOS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 return 1;
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 else if (status == RMS$_NMF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 retval = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 strcpy(out->body, in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 retval = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 lib$find_file_end(&context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 pass1 = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 v1.01 nmm 19-Aug-85 gfnames - return in successive calls the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 name of each file specified by the provided arg expanding wildcards.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1065 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 gfnames (arg, p_error)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 char *arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 bool *p_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 static vspec filename = {MAX_FILE_SPEC_LEN, "\0"};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 switch (fn_exp (&filename, arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 case 1:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 *p_error = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 return filename.body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 case 0:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 *p_error = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 *p_error = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 return filename.body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 }
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 #ifndef OLD /* Newer versions of VMS do provide `system'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 system (cmd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 char *cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 error ("%s", "system() function not implemented under VMS");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 #endif
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 #define VERSION_DELIM ';'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 char *massage_name (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 char *start = s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 for ( ; *s; s++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 if (*s == VERSION_DELIM)
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 *s = EOS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 *s = lowcase (*s);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 return start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 #endif /* VMS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 main (argc, argv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 int argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 char *argv[];
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 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 unsigned int nincluded_files;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 char **included_files;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 argument *argbuffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 int current_arg, file_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 linebuffer filename_lb;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1124 bool help_asked = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 bool got_err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 #endif
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1128 char *optstring;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1129 int opt;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1130
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1132 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 _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
1134 #endif /* DOS_NT */
428
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 progname = argv[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 nincluded_files = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 included_files = xnew (argc, char *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 current_arg = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 file_count = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 /* Allocate enough no matter what happens. Overkill, but each one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 is small. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 argbuffer = xnew (argc, argument);
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 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 * If etags, always find typedefs and structure tags. Why not?
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1148 * Also default to find macro constants, enum constants and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 * global variables.
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 if (!CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1153 typedefs = typedefs_or_cplusplus = constantypedefs = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 globals = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1157 optstring = "-";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1159 optstring = "-r:Rc:";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 #endif /* ETAGS_REGEXPS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 #ifndef LONG_OPTIONS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1162 optstring = optstring + 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 #endif /* LONG_OPTIONS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1164 optstring = concat (optstring,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1165 "Cf:Il:o:SVhH",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1166 (CTAGS) ? "BxdtTuvw" : "aDi:");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1167
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1168 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
1169 switch (opt)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1170 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1171 case 0:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1172 /* 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
1173 long-named option. We should do nothing. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1176 case 1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1177 /* 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
1178 argbuffer[current_arg].arg_type = at_filename;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1179 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1180 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1181 ++file_count;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1182 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1183
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1184 case STDIN:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1185 /* 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
1186 argbuffer[current_arg].arg_type = at_stdin;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1187 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1188 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1189 ++file_count;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1190 if (parsing_stdin)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1191 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
1192 parsing_stdin = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1193 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1194
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1195 /* Common options. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1196 case 'C': cplusplus = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1197 case 'f': /* for compatibility with old makefiles */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1198 case 'o':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1199 if (tagfile)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1201 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
1202 suggest_asking_for_help ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1203 /* NOTREACHED */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1205 tagfile = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1206 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1207 case 'I':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1208 case 'S': /* for backward compatibility */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1209 ignoreindent = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1210 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1211 case 'l':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1212 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1213 language *lang = get_language_from_langname (optarg);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1214 if (lang != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1215 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1216 argbuffer[current_arg].lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1217 argbuffer[current_arg].arg_type = at_language;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1218 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1219 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1221 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1222 case 'c':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1223 /* Backward compatibility: support obsolete --ignore-case-regexp. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1224 optarg = concat (optarg, "i", ""); /* memory leak here */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1225 /* FALLTHRU */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1226 case 'r':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1227 argbuffer[current_arg].arg_type = at_regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1228 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1229 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1230 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1231 case 'R':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1232 argbuffer[current_arg].arg_type = at_regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1233 argbuffer[current_arg].what = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1234 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1235 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1236 case 'V':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1237 print_version ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1238 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1239 case 'h':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1240 case 'H':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1241 help_asked = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1242 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1243
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1244 /* Etags options */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1245 case 'a': append_to_tagfile = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1246 case 'D': constantypedefs = FALSE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1247 case 'i': included_files[nincluded_files++] = optarg; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1248
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1249 /* Ctags options. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1250 case 'B': searchar = '?'; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1251 case 'd': constantypedefs = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1252 case 't': typedefs = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1253 case 'T': typedefs = typedefs_or_cplusplus = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1254 case 'u': update = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1255 case 'v': vgrind_style = TRUE; /*FALLTHRU*/
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1256 case 'x': cxref_style = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1257 case 'w': no_warnings = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1258 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1259 suggest_asking_for_help ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1260 /* NOTREACHED */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1261 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1262
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1263 for (; optind < argc; optind++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 argbuffer[current_arg].arg_type = at_filename;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 argbuffer[current_arg].what = argv[optind];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 ++current_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 ++file_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1271 argbuffer[current_arg].arg_type = at_end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1272
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1273 if (help_asked)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1274 print_help (argbuffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1275 /* NOTREACHED */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1276
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 if (nincluded_files == 0 && file_count == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 error ("no input files specified.", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 suggest_asking_for_help ();
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1281 /* NOTREACHED */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 if (tagfile == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 tagfile = CTAGS ? "tags" : "TAGS";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 cwd = etags_getcwd (); /* the current working directory */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 if (cwd[strlen (cwd) - 1] != '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 char *oldcwd = cwd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 cwd = concat (oldcwd, "/", "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 free (oldcwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 if (streq (tagfile, "-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 tagfiledir = cwd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 tagfiledir = absolute_dirname (tagfile, cwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 init (); /* set up boolean "functions" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1300 linebuffer_init (&lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1301 linebuffer_init (&filename_lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1302 linebuffer_init (&filebuf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1303 linebuffer_init (&token_name);
428
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 if (!CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 if (streq (tagfile, "-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 tagf = stdout;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1310 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 /* Switch redirected `stdout' to binary mode (setting `_fmode'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 doesn't take effect until after `stdout' is already open). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 if (!isatty (fileno (stdout)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 setmode (fileno (stdout), O_BINARY);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1315 #endif /* DOS_NT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 if (tagf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 pfatal (tagfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322
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 * Loop through files finding functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1326 for (i = 0; i < current_arg; i++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1328 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
1329 char *this_file;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1330
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 switch (argbuffer[i].arg_type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 case at_language:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1334 lang = argbuffer[i].lang;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 #ifdef ETAGS_REGEXPS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 case at_regexp:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1338 analyse_regex (argbuffer[i].what);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 case at_filename:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 while ((this_file = gfnames (argbuffer[i].what, &got_err)) != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 if (got_err)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 error ("can't find file %s\n", this_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 argc--, argv++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 this_file = massage_name (this_file);
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 this_file = argbuffer[i].what;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 /* Input file named "-" means read file names from stdin
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 (one per line) and use them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 if (streq (this_file, "-"))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1360 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1361 if (parsing_stdin)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1362 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
1363 (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1364 while (readline_internal (&filename_lb, stdin) > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1365 process_file_name (filename_lb.buffer, lang);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1366 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1368 process_file_name (this_file, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 break;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1373 case at_stdin:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1374 this_file = argbuffer[i].what;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1375 process_file (stdin, this_file, lang);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1376 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1381 free_regexps ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 #endif /* ETAGS_REGEXPS */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1383 free (lb.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1384 free (filebuf.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1385 free (token_name.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1386
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1387 if (!CTAGS || cxref_style)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1389 put_entries (nodehead); /* write the remainig tags (ETAGS) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1390 free_tree (nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1391 nodehead = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1392 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1393 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1394 fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1395
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1396 /* Output file entries that have no tags. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1397 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1398 if (!fdp->written)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1399 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
1400
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1401 while (nincluded_files-- > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1402 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
1403 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1404
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1405 if (fclose (tagf) == EOF)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1406 pfatal (tagfile);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1407 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 if (update)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 char cmd[BUFSIZ];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 for (i = 0; i < current_arg; ++i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1415 switch (argbuffer[i].arg_type)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1416 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1417 case at_filename:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1418 case at_stdin:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1419 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1420 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1421 continue; /* the for loop */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1422 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 sprintf (cmd,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 tagfile, argbuffer[i].what, tagfile);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1426 if (system (cmd) != EXIT_SUCCESS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 fatal ("failed to execute shell command", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 append_to_tagfile = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 if (tagf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 pfatal (tagfile);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1435 put_entries (nodehead); /* write all the tags (CTAGS) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1436 free_tree (nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1437 nodehead = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1438 if (fclose (tagf) == EOF)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1439 pfatal (tagfile);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 if (update)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1443 char cmd[2*BUFSIZ+10];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1444 sprintf (cmd, "sort -o %.*s %.*s", BUFSIZ, tagfile, BUFSIZ, tagfile);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 exit (system (cmd));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1447 return EXIT_SUCCESS;
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 * Return a compressor given the file name. If EXTPTR is non-zero,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 * return a pointer into FILE where the compressor-specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 * extension begins. If no compressor is found, NULL is returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 * and EXTPTR is not significant.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1456 * Idea by Vladimir Alexiev <vladimir@cs.ualberta.ca> (1998)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1458 static compressor *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 get_compressor_from_suffix (file, extptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 char *file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 char **extptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 compressor *compr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 char *slash, *suffix;
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 /* This relies on FN to be after canonicalize_filename,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1467 so we don't need to consider backslashes on DOS_NT. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 slash = etags_strrchr (file, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 suffix = etags_strrchr (file, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 if (suffix == NULL || suffix < slash)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 if (extptr != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 *extptr = suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 suffix += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 /* 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
1476 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
1477 Only the first do loop is run if not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 for (compr = compressors; compr->suffix != NULL; compr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 if (streq (compr->suffix, suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 return compr;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1483 if (!MSDOS)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1484 break; /* do it only once: not really a loop */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 if (extptr != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 *extptr = ++suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 } while (*suffix != '\0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 * Return a language given the name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1496 static language *
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1497 get_language_from_langname (name)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
1498 const char *name;
428
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 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 if (name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 error ("empty language name", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 if (streq (name, lang->name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 error ("unknown language \"%s\"", name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515
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 * Return a language given the interpreter name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1519 static language *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 get_language_from_interpreter (interpreter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 char *interpreter;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 char **iname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 if (interpreter == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 if (lang->interpreters != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 for (iname = lang->interpreters; *iname != NULL; iname++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 if (streq (*iname, interpreter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 }
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
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 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 * Return a language given the file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1542 static language *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1543 get_language_from_filename (file, case_sensitive)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 char *file;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1545 bool case_sensitive;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 language *lang;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1548 char **name, **ext, *suffix;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1549
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1550 /* Try whole file name first. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1551 for (lang = lang_names; lang->name != NULL; lang++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1552 if (lang->filenames != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1553 for (name = lang->filenames; *name != NULL; name++)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1554 if ((case_sensitive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1555 ? streq (*name, file)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1556 : strcaseeq (*name, file))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1557 return lang;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1558
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1559 /* If not found, try suffix after last dot. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 suffix = etags_strrchr (file, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 if (suffix == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 suffix += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 if (lang->suffixes != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 for (ext = lang->suffixes; *ext != NULL; ext++)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1567 if ((case_sensitive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1568 ? streq (*ext, suffix)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1569 : strcaseeq (*ext, suffix))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 return lang;
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
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1574
428
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 * This routine is called on each file argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1578 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1579 process_file_name (file, lang)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 char *file;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1581 language *lang;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 struct stat stat_buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 FILE *inf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1585 fdesc *fdp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 compressor *compr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 char *compressed_name, *uncompressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 char *ext, *real_name;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1589 int retval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 canonicalize_filename (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 if (streq (file, tagfile) && !streq (tagfile, "-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 error ("skipping inclusion of %s in self.", file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 if ((compr = get_compressor_from_suffix (file, &ext)) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 compressed_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 real_name = uncompressed_name = savestr (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 real_name = compressed_name = savestr (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 uncompressed_name = savenstr (file, ext - file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1608 /* If the canonicalized uncompressed name
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1609 has already been dealt with, skip it silently. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1610 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1612 assert (fdp->infname != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1613 if (streq (uncompressed_name, fdp->infname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1614 goto cleanup;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1615 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 if (stat (real_name, &stat_buf) != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 /* Reset real_name and try with a different name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 real_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 if (compressed_name != NULL) /* try with the given suffix */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 if (stat (uncompressed_name, &stat_buf) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 real_name = uncompressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 else /* try all possible suffixes */
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 for (compr = compressors; compr->suffix != NULL; compr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 compressed_name = concat (file, ".", compr->suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 if (stat (compressed_name, &stat_buf) != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1633 if (MSDOS)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1634 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1635 char *suf = compressed_name + strlen (file);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1636 size_t suflen = strlen (compr->suffix) + 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1637 for ( ; suf[1]; suf++, suflen--)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1638 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1639 memmove (suf, suf + 1, suflen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1640 if (stat (compressed_name, &stat_buf) == 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1641 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1642 real_name = compressed_name;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1643 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1644 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1645 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1646 if (real_name != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1647 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1648 } /* MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 free (compressed_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 compressed_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 else
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 real_name = compressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 if (real_name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 perror (file);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1662 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 } /* try with a different name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 if (!S_ISREG (stat_buf.st_mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 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
1669 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 if (real_name == compressed_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 char *cmd = concat (compr->command, " ", real_name);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1674 inf = (FILE *) popen (cmd, "r");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 free (cmd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 inf = fopen (real_name, "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 if (inf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 perror (real_name);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1682 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1685 process_file (inf, uncompressed_name, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 if (real_name == compressed_name)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1688 retval = pclose (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1690 retval = fclose (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1691 if (retval < 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1692 pfatal (file);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1693
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1694 cleanup:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1695 if (compressed_name) free (compressed_name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1696 if (uncompressed_name) free (uncompressed_name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1697 last_node = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1698 curfdp = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1699 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1700 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1701
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1702 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1703 process_file (fh, fn, lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1704 FILE *fh;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1705 char *fn;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1706 language *lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1707 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1708 static const fdesc emptyfdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1709 fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1710
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1711 /* Create a new input file description entry. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1712 fdp = xnew (1, fdesc);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1713 *fdp = emptyfdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1714 fdp->next = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1715 fdp->infname = savestr (fn);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1716 fdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1717 fdp->infabsname = absolute_filename (fn, cwd);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1718 fdp->infabsdir = absolute_dirname (fn, cwd);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1719 if (filename_is_absolute (fn))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1721 /* An absolute file name. Canonicalize it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1722 fdp->taggedfname = absolute_filename (fn, NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1723 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1724 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1725 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1726 /* 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
1727 to the directory of the tags file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1728 fdp->taggedfname = relative_filename (fn, tagfiledir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1729 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1730 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
1731 fdp->prop = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1732 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
1733
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1734 fdhead = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1735 curfdp = fdhead; /* the current file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1736
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1737 find_entries (fh);
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 /* 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
1740 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
1741 curfdp. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1742 if (!CTAGS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1743 && curfdp->usecharno /* no #line directives in this file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1744 && !curfdp->lang->metasource)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1745 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1746 node *np, *prev;
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 /* 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
1749 for the structure of the node tree. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1750 prev = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1751 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
1752 if (np->fdp == curfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1753 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1754
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1755 /* 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
1756 if (np != NULL)
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 /* 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
1759 instructions depend on this being true. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1760 assert (np->left == NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1761
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1762 assert (fdhead == curfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1763 assert (last_node->fdp == curfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1764 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
1765 free_tree (np); /* remove the written nodes */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1766 if (prev == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1767 nodehead = NULL; /* no nodes left */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1768 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1769 prev->left = NULL; /* delete the pointer to the sublist */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 * This routine sets up the boolean pseudo-functions which work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 * by setting boolean flags dependent upon the corresponding character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 * 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
1778 * 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
1779 * subscripted by the chars in "white" are set to TRUE. Thus "_wht"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 * 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
1781 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1782 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 init ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 register char *sp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 register int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 for (i = 0; i < CHARS; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 iswhite(i) = notinname(i) = begtoken(i) = intoken(i) = endtoken(i) = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 for (sp = white; *sp != '\0'; sp++) iswhite (*sp) = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 for (sp = nonam; *sp != '\0'; sp++) notinname (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1792 notinname('\0') = notinname('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 for (sp = begtk; *sp != '\0'; sp++) begtoken (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1794 begtoken('\0') = begtoken('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 for (sp = midtk; *sp != '\0'; sp++) intoken (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1796 intoken('\0') = intoken('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 for (sp = endtk; *sp != '\0'; sp++) endtoken (*sp) = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 endtoken('\0') = endtoken('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 * This routine opens the specified file and calls the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 * which finds the function and type definitions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1805 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1806 find_entries (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 FILE *inf;
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 char *cp;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1810 language *lang = curfdp->lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1811 Lang_function *parser = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 /* If user specified a language, use it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 if (lang != NULL && lang->function != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1816 parser = lang->function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1819 /* 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
1820 if (parser == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1822 lang = get_language_from_filename (curfdp->infname, TRUE);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1823 if (lang != NULL && lang->function != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1824 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1825 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1826 parser = lang->function;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1827 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1830 /* 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
1831 if (parser == NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1832 && readline_internal (&lb, inf) > 0
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 && lb.len >= 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 && lb.buffer[0] == '#'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 && lb.buffer[1] == '!')
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 char *lp;
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 /* 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
1840 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
1841 the first successive blank and terminate the string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 lp = etags_strrchr (lb.buffer+2, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 if (lp != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 lp = skip_spaces (lb.buffer + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 cp = skip_non_spaces (lp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 *cp = '\0';
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 (strlen (lp) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 lang = get_language_from_interpreter (lp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 if (lang != NULL && lang->function != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1855 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1856 parser = lang->function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1860
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 /* 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
1862 length of the first line is longer than the pipe block size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 which is unlikely. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 rewind (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1866 /* 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
1867 if (parser == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1868 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1869 lang = get_language_from_filename (curfdp->infname, FALSE);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1870 if (lang != NULL && lang->function != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1871 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1872 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1873 parser = lang->function;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1874 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1875 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1876
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1877 /* Else try Fortran or C. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1878 if (parser == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1880 node *old_last_node = last_node;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1881
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1882 curfdp->lang = get_language_from_langname ("fortran");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1883 find_entries (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1884
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1885 if (old_last_node == last_node)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1886 /* No Fortran entries found. Try C. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1887 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1888 /* We do not tag if rewind fails.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1889 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
1890 rewind (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1891 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
1892 find_entries (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1893 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1894 return;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1896
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1897 if (!no_line_directive
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1898 && curfdp->lang != NULL && curfdp->lang->metasource)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1899 /* 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
1900 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
1901 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
1902 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
1903 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
1904 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1905 fdesc **fdpp = &fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1906 while (*fdpp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1907 if (*fdpp != curfdp
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1908 && streq ((*fdpp)->taggedfname, curfdp->taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1909 /* 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
1910 and all tags referring to it. */
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 fdesc *badfdp = *fdpp;
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 /* Delete the tags referring to badfdp->taggedfname
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1915 that were obtained from badfdp->infname. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1916 invalidate_nodes (badfdp, &nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1917
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1918 *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
1919 free_fdesc (badfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1920 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1921 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1922 fdpp = &(*fdpp)->next; /* advance the list pointer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1923 }
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 assert (parser != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1926
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1927 /* Generic initialisations before reading from file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1928 linebuffer_setlen (&filebuf, 0); /* reset the file buffer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1929
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1930 /* Generic initialisations before parsing file with readline. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1931 lineno = 0; /* reset global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1932 charno = 0; /* reset global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1933 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
1934
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1935 parser (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1936
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1937 #ifdef ETAGS_REGEXPS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1938 regex_tag_multiline ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1939 #endif /* ETAGS_REGEXPS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1941
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1943 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1944 * 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
1945 * then call `pfnote'.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1946 * 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
1947 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1948 * TAGS format specification
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1949 * 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
1950 * 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
1951 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1952 * 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
1953 * 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
1954 * 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
1955 * 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
1956 * one character, substring;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1957 * 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
1958 * be a character in NONAM;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1959 * 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
1960 * also be a character in NONAM.
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 * 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
1963 * characters stored in the string `nonam'.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1964 * 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
1965 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1966 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1967 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
1968 char *name; /* tag name, or NULL if unnamed */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1969 int namelen; /* tag length */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1970 bool is_func; /* tag is a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1971 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
1972 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
1973 int lno; /* line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1974 long cno; /* character number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1975 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1976 bool named = (name != NULL && namelen > 0);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1977
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1978 if (!CTAGS && named) /* maybe set named to false */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1979 /* 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
1980 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
1981 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1982 int i;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1983 register char *cp = name;
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 for (i = 0; i < namelen; i++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1986 if (notinname (*cp++))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1987 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1988 if (i == namelen) /* rule #1 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1989 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1990 cp = linestart + linelen - namelen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1991 if (notinname (linestart[linelen-1]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1992 cp -= 1; /* rule #4 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1993 if (cp >= linestart /* rule #2 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1994 && (cp == linestart
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1995 || notinname (cp[-1])) /* rule #3 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1996 && strneq (name, cp, namelen)) /* rule #2 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1997 named = FALSE; /* use implicit tag name */
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 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2000
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2001 if (named)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2002 name = savenstr (name, namelen);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2003 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2004 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2005 pfnote (name, is_func, linestart, linelen, lno, cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2006 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2007
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 /* Record a tag. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2009 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 pfnote (name, is_func, linestart, linelen, lno, cno)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 char *name; /* tag name, or NULL if unnamed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 bool is_func; /* tag is a function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 char *linestart; /* start of the line where tag is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 int linelen; /* length of the line where tag is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 int lno; /* line number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 long cno; /* character number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2020 assert (name == NULL || name[0] != '\0');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 if (CTAGS && name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 np = xnew (1, node);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 /* If ctags mode, change name "main" to M<thisfilename>. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 if (CTAGS && !cxref_style && streq (name, "main"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2029 register char *fp = etags_strrchr (curfdp->taggedfname, '/');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2030 np->name = concat ("M", fp == NULL ? curfdp->taggedfname : fp + 1, "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 fp = etags_strrchr (np->name, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 if (fp != NULL && fp[1] != '\0' && fp[2] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 fp[0] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 np->name = name;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2037 np->valid = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 np->been_warned = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2039 np->fdp = curfdp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 np->is_func = is_func;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 np->lno = lno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2042 if (np->fdp->usecharno)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2043 /* 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
2044 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
2045 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
2046 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
2047 uncomment the +1 below. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2048 np->cno = cno /* + 1 */ ;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2049 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2050 np->cno = invalidcharno;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 np->left = np->right = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 if (CTAGS && !cxref_style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 if (strlen (linestart) < 50)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2055 np->regex = concat (linestart, "$", "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2057 np->regex = savenstr (linestart, 50);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2060 np->regex = savenstr (linestart, linelen);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2061
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2062 add_node (np, &nodehead);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 * free_tree ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 * recurse on left children, iterate on right children.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2069 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 free_tree (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 while (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 register node *node_right = np->right;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 free_tree (np->left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 if (np->name != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 free (np->name);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2079 free (np->regex);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 free (np);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 np = node_right;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2086 * free_fdesc ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2087 * delete a file description
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2088 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2089 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2090 free_fdesc (fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2091 register fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2092 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2093 if (fdp->infname != NULL) free (fdp->infname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2094 if (fdp->infabsname != NULL) free (fdp->infabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2095 if (fdp->infabsdir != NULL) free (fdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2096 if (fdp->taggedfname != NULL) free (fdp->taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2097 if (fdp->prop != NULL) free (fdp->prop);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2098 free (fdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2099 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2100
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2101 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 * add_node ()
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2103 * 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
2104 * 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
2105 * balancing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 * 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
2108 * maintain state.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2110 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 add_node (np, cur_node_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 node *np, **cur_node_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 register int dif;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 register node *cur_node = *cur_node_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 if (cur_node == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 *cur_node_p = np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 last_node = np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2125 /* Etags Mode */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2127 /* 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
2128 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
2129 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
2130 used sublist. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2131 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
2132 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2133 /* 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
2134 assert (last_node->right == NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2135 last_node->right = np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2136 last_node = np;
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 else if (cur_node->fdp == np->fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2139 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2140 /* 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
2141 good for us. Let's scan this sublist. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2142 add_node (np, &cur_node->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2143 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2144 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2145 /* 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
2146 next one. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2147 add_node (np, &cur_node->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2148 } /* if ETAGS mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2149
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 /* Ctags Mode */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 dif = strcmp (np->name, cur_node->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154
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 * If this tag name matches an existing one, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 * do not add the node, but maybe print a warning.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 if (!dif)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2161 if (np->fdp == cur_node->fdp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 if (!no_warnings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 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
2166 np->fdp->infname, lineno, np->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 fprintf (stderr, "Second entry ignored\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 else if (!cur_node->been_warned && !no_warnings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 fprintf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 "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
2175 np->fdp->infname, cur_node->fdp->infname, np->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 cur_node->been_warned = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 /* Actually add the node */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 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
2183 } /* if CTAGS mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2184 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2185
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2186 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2187 * invalidate_nodes ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2188 * 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
2189 * 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
2190 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2191 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2192 invalidate_nodes (badfdp, npp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2193 fdesc *badfdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2194 node **npp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2195 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2196 node *np = *npp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2197
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2198 if (np == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2199 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2200
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2201 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2202 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2203 if (np->left != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2204 invalidate_nodes (badfdp, &np->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2205 if (np->fdp == badfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2206 np->valid = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2207 if (np->right != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2208 invalidate_nodes (badfdp, &np->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2209 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2210 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2211 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2212 assert (np->fdp != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2213 if (np->fdp == badfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2214 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2215 *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
2216 np->left = NULL; /* isolate it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2217 free_tree (np); /* free it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2218 invalidate_nodes (badfdp, npp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2219 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2220 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2221 invalidate_nodes (badfdp, &np->left);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2224
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2226 static int total_size_of_entries __P((node *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2227 static int number_len __P((long));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2228
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2229 /* Length of a non-negative number's decimal representation. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 number_len (num)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 long num;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 int len = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 while ((num /= 10) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 len += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 * 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
2242 * 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
2243 * 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
2244 * but is still supplied for backward compatibility.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2246 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 total_size_of_entries (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2250 register int total = 0;
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 for (; np != NULL; np = np->right)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2253 if (np->valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2254 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2255 total += strlen (np->regex) + 1; /* pat\177 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2256 if (np->name != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2257 total += strlen (np->name) + 1; /* name\001 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2258 total += number_len ((long) np->lno) + 1; /* lno, */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2259 if (np->cno != invalidcharno) /* cno */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2260 total += number_len (np->cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2261 total += 1; /* newline */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2262 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2263
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2264 return total;
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
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2267 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2268 put_entries (np)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2269 register node *np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2270 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2271 register char *sp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2272 static fdesc *fdp = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 if (np == NULL)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2275 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2276
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2277 /* Output subentries that precede this one */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2278 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2279 put_entries (np->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2280
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2281 /* Output this entry */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2282 if (np->valid)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2284 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2285 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2286 /* Etags mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2287 if (fdp != np->fdp)
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 fdp = np->fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2290 fprintf (tagf, "\f\n%s,%d\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2291 fdp->taggedfname, total_size_of_entries (np));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2292 fdp->written = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2293 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2294 fputs (np->regex, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2295 fputc ('\177', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2296 if (np->name != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2297 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2298 fputs (np->name, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2299 fputc ('\001', tagf);
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 fprintf (tagf, "%d,", np->lno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2302 if (np->cno != invalidcharno)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2303 fprintf (tagf, "%ld", np->cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2304 fputs ("\n", tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2305 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2306 else
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 /* Ctags mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2309 if (np->name == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2310 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
2311
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2312 if (cxref_style)
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 if (vgrind_style)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2315 fprintf (stdout, "%s %s %d\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2316 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
2317 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2318 fprintf (stdout, "%-16s %3d %-16s %s\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2319 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
2320 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2321 else
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 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
2324
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2325 if (np->is_func)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2326 { /* function or #define macro with args */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2327 putc (searchar, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2328 putc ('^', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2329
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2330 for (sp = np->regex; *sp; sp++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2331 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2332 if (*sp == '\\' || *sp == searchar)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2333 putc ('\\', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2334 putc (*sp, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2335 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2336 putc (searchar, 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 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2339 { /* anything else; text pattern inadequate */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2340 fprintf (tagf, "%d", np->lno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2341 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2342 putc ('\n', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2343 }
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 } /* if this node contains a valid tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2346
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2347 /* Output subentries that follow this one */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2348 put_entries (np->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2349 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2350 put_entries (np->left);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2352
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2354 /* C extensions. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2355 #define C_EXT 0x00fff /* C extensions */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2356 #define C_PLAIN 0x00000 /* C */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2357 #define C_PLPL 0x00001 /* C++ */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2358 #define C_STAR 0x00003 /* C* */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2359 #define C_JAVA 0x00005 /* JAVA */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2360 #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
2361 #define YACC 0x10000 /* yacc file */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2362
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 * The C symbol tables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 enum sym_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 st_none,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 st_C_objprot, st_C_objimpl, st_C_objend,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 st_C_gnumacro,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 st_C_ignore,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 st_C_javastruct,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 st_C_operator,
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2374 st_C_class, st_C_template,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2378 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
2379 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
2380 static enum sym_type C_symtype __P((char *, int, int));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2381
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 /* Feed stuff between (but not including) %[ and %] lines to:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 gperf -c -k 1,3 -o -p -r -t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 %[
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 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
2386 %%
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 if, 0, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 for, 0, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 while, 0, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 switch, 0, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 return, 0, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 @interface, 0, st_C_objprot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 @protocol, 0, st_C_objprot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 @implementation,0, st_C_objimpl
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 @end, 0, st_C_objend
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 import, C_JAVA, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 package, C_JAVA, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 friend, C_PLPL, st_C_ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 extends, C_JAVA, st_C_javastruct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 implements, C_JAVA, st_C_javastruct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 interface, C_JAVA, st_C_struct
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2402 class, 0, st_C_class
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 namespace, C_PLPL, st_C_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 domain, C_STAR, st_C_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 union, 0, st_C_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 struct, 0, st_C_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 extern, 0, st_C_extern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 enum, 0, st_C_enum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 typedef, 0, st_C_typedef
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 define, 0, st_C_define
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 operator, C_PLPL, st_C_operator
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2412 template, 0, st_C_template
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 bool, C_PLPL, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 long, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 short, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 int, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 char, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 float, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 double, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 signed, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 unsigned, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 auto, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 void, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 static, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 const, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 volatile, 0, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 explicit, C_PLPL, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 mutable, C_PLPL, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 typename, C_PLPL, st_C_typespec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 # DEFUN used in emacs, the next three used in glibc (SYSCALL only for mach).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 DEFUN, 0, st_C_gnumacro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 SYSCALL, 0, st_C_gnumacro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 ENTRY, 0, st_C_gnumacro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 PSEUDO, 0, st_C_gnumacro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 # These are defined inside C functions, so currently they are not met.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 # EXFUN used in glibc, DEFVAR_* in emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 #EXFUN, 0, st_C_gnumacro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 #DEFVAR_, 0, st_C_gnumacro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 %]
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2440 and replace lines between %< and %> with its output,
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2441 then make in_word_set and C_stab_entry static. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 /*%<*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 /* C code produced by gperf version 2.7.1 (19981006 egcs) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 /* Command-line: gperf -c -k 1,3 -o -p -r -t */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 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
2446
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2447 #define TOTAL_KEYWORDS 47
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 #define MIN_WORD_LENGTH 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 #define MAX_WORD_LENGTH 15
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2450 #define MIN_HASH_VALUE 18
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2451 #define MAX_HASH_VALUE 138
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2452 /* maximum key range = 121, duplicates = 0 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 __inline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 hash (str, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 register const char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 register unsigned int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 static unsigned char asso_values[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 {
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2464 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2465 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2466 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2467 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2468 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2469 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2470 139, 139, 139, 139, 63, 139, 139, 139, 33, 44,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2471 62, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2472 42, 139, 139, 12, 32, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2473 139, 139, 139, 139, 139, 139, 139, 34, 59, 37,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2474 24, 58, 33, 3, 139, 16, 139, 139, 42, 60,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2475 18, 11, 39, 139, 23, 57, 4, 63, 6, 20,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2476 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2477 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2478 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2479 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2480 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2481 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2482 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2483 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2484 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2485 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2486 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2487 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2488 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2489 139, 139, 139, 139, 139, 139
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 register int hval = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 switch (hval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 case 3:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 hval += asso_values[(unsigned char)str[2]];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 case 2:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 case 1:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 hval += asso_values[(unsigned char)str[0]];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 return hval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 __inline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 static struct C_stab_entry *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 in_word_set (str, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 register const char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 register unsigned int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 static struct C_stab_entry wordlist[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2517 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2518 {"if", 0, st_C_ignore},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2519 {""}, {""}, {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2520 {"int", 0, st_C_typespec},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 {""}, {""},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2522 {"void", 0, st_C_typespec},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2523 {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2524 {"interface", C_JAVA, st_C_struct},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2525 {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2526 {"SYSCALL", 0, st_C_gnumacro},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2527 {""},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2528 {"return", 0, st_C_ignore},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2529 {""}, {""}, {""}, {""}, {""}, {""}, {""},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2530 {"while", 0, st_C_ignore},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2531 {"auto", 0, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2532 {""}, {""}, {""}, {""}, {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2533 {"float", 0, st_C_typespec},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2534 {"typedef", 0, st_C_typedef},
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2535 {"typename", C_PLPL, st_C_typespec},
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2536 {""}, {""}, {""},
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2537 {"friend", C_PLPL, st_C_ignore},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2538 {"volatile", 0, st_C_typespec},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2539 {""}, {""},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2540 {"for", 0, st_C_ignore},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2541 {"const", 0, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2542 {"import", C_JAVA, st_C_ignore},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2543 {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2544 {"define", 0, st_C_define},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2545 {"long", 0, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2546 {"implements", C_JAVA, st_C_javastruct},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2547 {"signed", 0, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2548 {""},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 {"extern", 0, st_C_extern},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 {"extends", C_JAVA, st_C_javastruct},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2551 {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2552 {"mutable", C_PLPL, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2553 {"template", 0, st_C_template},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2554 {"short", 0, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2555 {"bool", C_PLPL, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2556 {"char", 0, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2557 {"class", 0, st_C_class},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2558 {"operator", C_PLPL, st_C_operator},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2559 {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2560 {"switch", 0, st_C_ignore},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2561 {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2562 {"ENTRY", 0, st_C_gnumacro},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2563 {""},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 {"package", C_JAVA, st_C_ignore},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2565 {"union", 0, st_C_struct},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2566 {"@end", 0, st_C_objend},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2567 {"struct", 0, st_C_struct},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2568 {"namespace", C_PLPL, st_C_struct},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2569 {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2570 {"domain", C_STAR, st_C_struct},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2571 {"@interface", 0, st_C_objprot},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2572 {"PSEUDO", 0, st_C_gnumacro},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2573 {"double", 0, st_C_typespec},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2574 {""},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2575 {"@protocol", 0, st_C_objprot},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2576 {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2577 {"static", 0, st_C_typespec},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 {""}, {""},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2579 {"DEFUN", 0, st_C_gnumacro},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2580 {""}, {""}, {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2581 {"explicit", C_PLPL, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2582 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2583 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2584 {""},
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2585 {"enum", 0, st_C_enum},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 {""}, {""},
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2587 {"unsigned", 0, st_C_typespec},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2588 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2589 {"@implementation",0, st_C_objimpl}
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 register int key = hash (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 if (key <= MAX_HASH_VALUE && key >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 register const char *s = wordlist[key].name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 if (*str == *s && !strncmp (str + 1, s + 1, len - 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 return &wordlist[key];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 /*%>*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 static enum sym_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609 C_symtype (str, len, c_ext)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 int c_ext;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 register struct C_stab_entry *se = in_word_set (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 if (se == NULL || (se->c_ext && !(c_ext & se->c_ext)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 return st_none;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 return se->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2620
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2622 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2623 * C functions and variables are recognized using a simple
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2624 * finite automaton. fvdef is its state variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2625 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2626 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 fvnone, /* nothing seen */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2629 fdefunkey, /* Emacs DEFUN keyword seen */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2630 fdefunname, /* Emacs DEFUN name seen */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 foperator, /* func: operator keyword seen (cplpl) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 fvnameseen, /* function or variable name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 fstartlist, /* func: just after open parenthesis */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634 finlist, /* func: in parameter list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 flistseen, /* func: after parameter list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 fignore, /* func: before open brace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 vignore /* var-like: ignore until ';' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 } fvdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2640 static bool fvextern; /* func or var: extern keyword seen; */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2642 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2643 * typedefs are recognized using a simple finite automaton.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2644 * typdef is its state variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2645 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2646 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 tnone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 tkeyseen, /* typedef keyword seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 ttypeseen, /* defined type seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 tinbody, /* inside typedef body */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 tend, /* just before typedef tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 tignore /* junk after typedef tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 } typdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2656 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2657 * struct-like structures (enum, struct and union) are recognized
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2658 * using another simple finite automaton. `structdef' is its state
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2659 * variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2660 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2661 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2663 snone, /* nothing seen yet,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2664 or in struct body if cblev > 0 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 skeyseen, /* struct-like keyword seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 stagseen, /* struct-like tag seen */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2667 sintemplate, /* inside template (ignore) */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2668 scolonseen /* colon seen after struct-like tag */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 } structdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 * 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
2673 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2674 static char *objtag = "<uninited>";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 * Yet another little state machine to deal with preprocessor lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2679 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 dnone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 dsharpseen, /* '#' seen as first char on line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 ddefineseen, /* '#' and 'define' seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 dignorerest /* ignore rest of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 } definedef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686
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 * State machine for Objective C protocols and implementations.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2689 * Idea by Tom R.Hageman <tom@basil.icce.rug.nl> (1995)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2691 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693 onone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 oprotocol, /* @interface or @protocol seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 oimplementation, /* @implementations seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696 otagseen, /* class name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 oparenseen, /* parenthesis before category seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 ocatseen, /* category name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 oinbody, /* in @implementation body */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 omethodsign, /* in @implementation body, after +/- */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 omethodtag, /* after method name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 omethodcolon, /* after method colon */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 omethodparm, /* after method parameter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704 oignore /* wait for @end */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 } objdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 * 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
2710 * 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
2711 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2712 static struct tok
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2714 char *line; /* string containing the token */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2715 int offset; /* where the token starts in LINE */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2716 int length; /* token length */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2717 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2718 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
2719 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
2720 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
2721 tag.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2722 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2723 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
2724 invalidated whenever a state machine is
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2725 reset prematurely */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2726 bool named; /* create a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2727 int lineno; /* source line number of tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2728 long linepos; /* source char number of tag */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2729 } token; /* latest token read */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2732 * Variables and functions for dealing with nested structures.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2733 * Idea by Mykola Dzyuba <mdzyuba@yahoo.com> (2001)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2735 static void pushclass_above __P((int, char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2736 static void popclass_above __P((int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2737 static void write_classname __P((linebuffer *, char *qualifier));
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2738
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2739 static struct {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2740 char **cname; /* nested class names */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2741 int *cblev; /* nested class curly brace level */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2742 int nl; /* class nesting level (elements used) */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2743 int size; /* length of the array */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2744 } cstack; /* stack for nested declaration tags */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2745 /* Current struct nesting depth (namespace, class, struct, union, enum). */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2746 #define nestlev (cstack.nl)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2747 /* 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
2748 #define instruct (structdef == snone && nestlev > 0 \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2749 && cblev == cstack.cblev[nestlev-1] + 1)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2750
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2751 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2752 pushclass_above (cblev, str, len)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2753 int cblev;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2754 char *str;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2755 int len;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2756 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2757 int nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2758
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2759 popclass_above (cblev);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2760 nl = cstack.nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2761 if (nl >= cstack.size)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2762 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2763 int size = cstack.size *= 2;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2764 xrnew (cstack.cname, size, char *);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2765 xrnew (cstack.cblev, size, int);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2766 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2767 assert (nl == 0 || cstack.cblev[nl-1] < cblev);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2768 cstack.cname[nl] = (str == NULL) ? NULL : savenstr (str, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2769 cstack.cblev[nl] = cblev;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2770 cstack.nl = nl + 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2771 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2772
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2773 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2774 popclass_above (cblev)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2775 int cblev;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2776 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2777 int nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2778
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2779 for (nl = cstack.nl - 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2780 nl >= 0 && cstack.cblev[nl] >= cblev;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2781 nl--)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2782 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2783 if (cstack.cname[nl] != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2784 free (cstack.cname[nl]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2785 cstack.nl = nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2786 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2787 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2788
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2789 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2790 write_classname (cn, qualifier)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2791 linebuffer *cn;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2792 char *qualifier;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2793 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2794 int i, len;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2795 int qlen = strlen (qualifier);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2796
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2797 if (cstack.nl == 0 || cstack.cname[0] == NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2798 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2799 len = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2800 cn->len = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2801 cn->buffer[0] = '\0';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2802 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2803 else
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 len = strlen (cstack.cname[0]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2806 linebuffer_setlen (cn, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2807 strcpy (cn->buffer, cstack.cname[0]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2808 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2809 for (i = 1; i < cstack.nl; i++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2810 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2811 char *s;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2812 int slen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2813
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2814 s = cstack.cname[i];
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2815 if (s == NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2816 continue;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2817 slen = strlen (s);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2818 len += slen + qlen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2819 linebuffer_setlen (cn, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2820 strncat (cn->buffer, qualifier, qlen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2821 strncat (cn->buffer, s, slen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2822 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2823 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2824
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2825
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2826 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
2827 static void make_C_tag __P((bool));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2828
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 * consider_token ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 * 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
2832 * function or variable, or corresponds to a typedef, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 * is a struct/union/enum tag, or #define, or an enum constant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 * *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
2836 * 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
2837 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 * Globals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 * fvdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 * structdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 * definedef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 * typdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 * objdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 static bool
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2847 consider_token (str, len, c, c_extp, cblev, parlev, is_func_or_var)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 register char *str; /* IN: token pointer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 register int len; /* IN: token length */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2850 register int c; /* IN: first char after the token */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2851 int *c_extp; /* IN, OUT: C extensions mask */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 int cblev; /* IN: curly brace level */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 int parlev; /* IN: parenthesis level */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 bool *is_func_or_var; /* OUT: function or variable found */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2856 /* When structdef is stagseen, scolonseen, or snone with cblev > 0,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2857 structtype is the type of the preceding struct-like keyword, and
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2858 structcblev is the curly brace level where it has been seen. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2859 static enum sym_type structtype;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2860 static int structcblev;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2861 static enum sym_type toktype;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2862
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2863
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2864 toktype = C_symtype (str, len, *c_extp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 * Advance the definedef state machine.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869 switch (definedef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 case dnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 /* We're not on a preprocessor line. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2873 if (toktype == st_C_gnumacro)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2874 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2875 fvdef = fdefunkey;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2876 return FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2877 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 case dsharpseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 if (toktype == st_C_define)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882 definedef = ddefineseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 definedef = dignorerest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 case ddefineseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 * Make a tag for any macro, unless it is a constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 * and constantypedefs is FALSE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 definedef = dignorerest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 *is_func_or_var = (c == '(');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 if (!*is_func_or_var && !constantypedefs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 case dignorerest:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 error ("internal error: definedef value.", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 * Now typedefs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 switch (typdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 case tnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 if (toktype == st_C_typedef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 if (typedefs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 typdef = tkeyseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 fvextern = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 case tkeyseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 switch (toktype)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 case st_none:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 case st_C_typespec:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2926 case st_C_class:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 case st_C_struct:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 case st_C_enum:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 typdef = ttypeseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2932 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2933 case ttypeseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2934 if (structdef == snone && fvdef == fvnone)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2935 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2936 fvdef = fvnameseen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2937 return TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2938 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 case tend:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 switch (toktype)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 case st_C_typespec:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2944 case st_C_class:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 case st_C_struct:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 case st_C_enum:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 * This structdef business is NOT invoked when we are ctags and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 * file is plain C. This is because a struct tag may have the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 * name as another tag, and this loses with ctags.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 switch (toktype)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 case st_C_javastruct:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 if (structdef == stagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 structdef = scolonseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 return FALSE;
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2963 case st_C_template:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2964 case st_C_class:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2965 if ((*c_extp & C_AUTO) /* automatic detection of C++ language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2966 && cblev == 0
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2967 && definedef == dnone && structdef == snone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2968 && typdef == tnone && fvdef == fvnone)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2969 *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2970 if (toktype == st_C_template)
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2971 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2972 /* FALLTHRU */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 case st_C_struct:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 case st_C_enum:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2975 if (parlev == 0
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2976 && fvdef != vignore
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2977 && (typdef == tkeyseen
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2978 || (typedefs_or_cplusplus && structdef == snone)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 structdef = skeyseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981 structtype = toktype;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2982 structcblev = cblev;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 if (structdef == skeyseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 structdef = stagseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 if (typdef != tnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 definedef = dnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 /* Detect Objective C constructs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 case onone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 switch (toktype)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 case st_C_objprot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 objdef = oprotocol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 case st_C_objimpl:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 objdef = oimplementation;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 case oimplementation:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 /* Save the class tag for functions or variables defined inside. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 objtag = savenstr (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 objdef = oinbody;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 case oprotocol:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 /* Save the class tag for categories. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 objtag = savenstr (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 objdef = otagseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 *is_func_or_var = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 case oparenseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 objdef = ocatseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 *is_func_or_var = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 case oinbody:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 case omethodsign:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 if (parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 objdef = omethodtag;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3031 linebuffer_setlen (&token_name, len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 strncpy (token_name.buffer, str, len);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3033 token_name.buffer[len] = '\0';
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 case omethodcolon:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 if (parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 objdef = omethodparm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 if (parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 objdef = omethodtag;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3045 linebuffer_setlen (&token_name, token_name.len + len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 strncat (token_name.buffer, str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 case oignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 if (toktype == st_C_objend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 /* Memory leakage here: the string pointed by objtag is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 never released, because many tests would be needed to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 avoid breaking on incorrect input code. The amount of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056 memory leaked here is the sum of the lengths of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 class tags.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 free (objtag); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 objdef = onone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064 /* A function, variable or enum constant? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 switch (toktype)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 case st_C_extern:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068 fvextern = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070 case st_C_typespec:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3071 switch (fvdef)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3072 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3073 case finlist:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3074 case flistseen:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3075 case fignore:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3076 case vignore:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3077 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3078 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3079 fvdef = fvnone;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3080 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 case st_C_ignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 fvextern = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 fvdef = vignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 case st_C_operator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 fvdef = foperator;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 *is_func_or_var = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 case st_none:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3091 if (constantypedefs
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3092 && structdef == snone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3093 && structtype == st_C_enum && cblev > structcblev)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3094 return TRUE; /* enum constant */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3095 switch (fvdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3097 case fdefunkey:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3098 if (cblev > 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3099 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3100 fvdef = fdefunname; /* GNU macro */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 *is_func_or_var = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 return TRUE;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3103 case fvnone:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3104 if ((strneq (str, "asm", 3) && endtoken (str[3]))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3105 || (strneq (str, "__asm__", 7) && endtoken (str[7])))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3106 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3107 fvdef = vignore;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3108 return FALSE;
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 (len >= 10 && strneq (str+len-10, "::operator", 10))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3111 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3112 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
3113 *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3114 fvdef = foperator;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3115 *is_func_or_var = TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3116 return TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3117 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3118 if (cblev > 0 && !instruct)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3119 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 fvdef = fvnameseen; /* function or variable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 *is_func_or_var = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 return TRUE;
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 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 }
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 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 }
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
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3132 * 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
3133 * the line currently read. By keeping two line buffers, and switching
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3134 * 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
3135 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3136 static struct
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3137 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3138 long linepos;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3139 linebuffer lb;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3140 } lbs[2];
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3141
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 #define current_lb_is_new (newndx == curndx)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 #define switch_line_buffers() (curndx = 1 - curndx)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 #define curlb (lbs[curndx].lb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 #define newlb (lbs[newndx].lb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 #define curlinepos (lbs[curndx].linepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 #define newlinepos (lbs[newndx].linepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3150 #define plainc ((c_ext & C_EXT) == C_PLAIN)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3151 #define cplpl (c_ext & C_PLPL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3152 #define cjava ((c_ext & C_JAVA) == C_JAVA)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3153
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 #define CNL_SAVE_DEFINEDEF() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 curlinepos = charno; \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3157 readline (&curlb, inf); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 lp = curlb.buffer; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 quotednl = FALSE; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 newndx = curndx; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 #define CNL() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 CNL_SAVE_DEFINEDEF(); \
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3166 if (savetoken.valid) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 { \
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3168 token = savetoken; \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3169 savetoken.valid = FALSE; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 definedef = dnone; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 make_C_tag (isfun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 bool isfun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3179 /* 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
3180 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
3181 if (!DEBUG && !token.valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3182 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3183
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3184 if (token.valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3185 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
3186 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
3187 else /* this case is optimised away if !DEBUG */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3188 make_tag (concat ("INVALID TOKEN:-->", token_name.buffer, ""),
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3189 token_name.len + 17, isfun, token.line,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3190 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
3191
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3192 token.valid = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3196 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3197 * C_entries ()
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3198 * This routine finds functions, variables, typedefs,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3199 * #define's, enum constants and struct/union/enum definitions in
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3200 * C syntax and adds them to the list.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3201 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3202 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 C_entries (c_ext, inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 int c_ext; /* extension of C */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 FILE *inf; /* input file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 register char c; /* latest char read; '\0' for end of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 register char *lp; /* pointer one beyond the character `c' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 int curndx, newndx; /* indices for current and new lb */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 register int tokoff; /* offset in line of start of current token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 register int toklen; /* length of current token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212 char *qualifier; /* string used to qualify names */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 int qlen; /* length of qualifier */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 int cblev; /* current curly brace level */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 int parlev; /* current parenthesis level */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3216 int typdefcblev; /* cblev where a typedef struct body begun */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 bool incomm, inquote, inchar, quotednl, midtoken;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3218 bool yacc_rules; /* in the rules part of a yacc file */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3219 struct tok savetoken; /* token saved during preprocessor handling */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3220
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3221
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3222 linebuffer_init (&lbs[0].lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3223 linebuffer_init (&lbs[1].lb);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3224 if (cstack.size == 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3225 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3226 cstack.size = (DEBUG) ? 1 : 4;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3227 cstack.nl = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3228 cstack.cname = xnew (cstack.size, char *);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3229 cstack.cblev = xnew (cstack.size, int);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3230 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3232 tokoff = toklen = typdefcblev = 0; /* keep compiler quiet */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 curndx = newndx = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 lp = curlb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 *lp = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 fvdef = fvnone; fvextern = FALSE; typdef = tnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 structdef = snone; definedef = dnone; objdef = onone;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3239 yacc_rules = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 midtoken = inquote = inchar = incomm = quotednl = FALSE;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3241 token.valid = savetoken.valid = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 cblev = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 parlev = 0;
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 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 /* If we're at the end of the line, the next character is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 '\0'; don't skip it, because it's the thing that tells us
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 case '"':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 inquote = TRUE;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3320 switch (fvdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3322 case fdefunkey:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3323 case fstartlist:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3324 case finlist:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3325 case fignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3326 case vignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3327 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3328 default:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 fvextern = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333 case '\'':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 inchar = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 if (fvdef != finlist && fvdef != fignore && fvdef !=vignore)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 fvextern = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 case '/':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 if (*lp == '*')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345 incomm = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3346 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3348 else if (/* cplpl && */ *lp == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3349 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3350 c = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 case '%':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 if ((c_ext & YACC) && *lp == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3358 /* Entering or exiting rules section in yacc file. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359 lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 definedef = dnone; fvdef = fvnone; fvextern = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 typdef = tnone; structdef = snone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 midtoken = inquote = inchar = incomm = quotednl = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 cblev = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 yacc_rules = !yacc_rules;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 case '#':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 if (definedef == dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 bool cpptoken = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 /* Look back on this line. If all blanks, or nonblanks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 followed by an end of comment, this is a preprocessor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 token. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 for (cp = newlb.buffer; cp < lp-1; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 if (!iswhite (*cp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 if (*cp == '*' && *(cp+1) == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3383 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384 cpptoken = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 cpptoken = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 if (cpptoken)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 definedef = dsharpseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 } /* if (definedef == dnone) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3393 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394 } /* switch (c) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3397 /* Consider token only if some involved conditions are satisfied. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3398 if (typdef != tignore
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 && definedef != dignorerest
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3400 && fvdef != finlist
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3401 && structdef != sintemplate
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3402 && (definedef != dnone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3403 || structdef != scolonseen))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405 if (midtoken)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 if (endtoken (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3409 if (c == ':' && *lp == ':' && begtoken (lp[1]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3410 /* This handles :: in the middle,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3411 but not at the beginning of an identifier.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3412 Also, space-separated :: is not recognised. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3413 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3414 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
3415 c_ext = (c_ext | C_PLPL) & ~C_AUTO;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 lp += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417 toklen += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 c = lp[-1];
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3419 goto still_in_token;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3423 bool funorvar = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3424
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 if (yacc_rules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 || consider_token (newlb.buffer + tokoff, toklen, c,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3427 &c_ext, cblev, parlev, &funorvar))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429 if (fvdef == foperator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431 char *oldlp = lp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 lp = skip_spaces (lp-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 if (*lp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435 while (*lp != '\0'
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3436 && !iswhite (*lp) && *lp != '(')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 c = *lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 toklen += lp - oldlp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3441 token.named = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3442 if (!plainc
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3443 && nestlev > 0 && definedef == dnone)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3444 /* in struct body */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3446 write_classname (&token_name, qualifier);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3447 linebuffer_setlen (&token_name,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3448 token_name.len+qlen+toklen);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 strcat (token_name.buffer, qualifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 strncat (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 newlb.buffer + tokoff, toklen);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3452 token.named = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 else if (objdef == ocatseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 /* Objective C category */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457 int len = strlen (objtag) + 2 + toklen;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3458 linebuffer_setlen (&token_name, len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 strcpy (token_name.buffer, objtag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 strcat (token_name.buffer, "(");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 strncat (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 newlb.buffer + tokoff, toklen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 strcat (token_name.buffer, ")");
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3464 token.named = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466 else if (objdef == omethodtag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 || objdef == omethodparm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468 /* Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3470 token.named = TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3471 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3472 else if (fvdef == fdefunname)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3473 /* GNU DEFUN and similar macros */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3474 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3475 bool defun = (newlb.buffer[tokoff] == 'F');
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3476 int off = tokoff;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3477 int len = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3478
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3479 /* Rewrite the tag so that emacs lisp DEFUNs
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3480 can be found by their elisp name */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3481 if (defun)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3482 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3483 off += 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3484 len -= 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3485 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3486 len = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3487 linebuffer_setlen (&token_name, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3488 strncpy (token_name.buffer,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3489 newlb.buffer + off, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3490 token_name.buffer[len] = '\0';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3491 if (defun)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3492 while (--len >= 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3493 if (token_name.buffer[len] == '_')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3494 token_name.buffer[len] = '-';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3495 token.named = defun;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3499 linebuffer_setlen (&token_name, toklen);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 strncpy (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501 newlb.buffer + tokoff, toklen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3502 token_name.buffer[toklen] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503 /* Name macros and members. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3504 token.named = (structdef == stagseen
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3505 || typdef == ttypeseen
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3506 || typdef == tend
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3507 || (funorvar
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3508 && definedef == dignorerest)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3509 || (funorvar
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3510 && definedef == dnone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3511 && structdef == snone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3512 && cblev > 0));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3514 token.lineno = lineno;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3515 token.offset = tokoff;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3516 token.length = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3517 token.line = newlb.buffer;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3518 token.linepos = newlinepos;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3519 token.valid = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 if (definedef == dnone
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 && (fvdef == fvnameseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 || fvdef == foperator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 || structdef == stagseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525 || typdef == tend
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3526 || typdef == ttypeseen
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 || objdef != onone))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3528 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529 if (current_lb_is_new)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 switch_line_buffers ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3531 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3532 else if (definedef != dnone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3533 || fvdef == fdefunname
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3534 || instruct)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 make_C_tag (funorvar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 midtoken = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 } /* if (endtoken (c)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 else if (intoken (c))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3541 still_in_token:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543 toklen++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 } /* if (midtoken) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 else if (begtoken (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 switch (definedef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 case dnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 case fstartlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555 fvdef = finlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 case flistseen:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3558 if (plainc || declarations)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3559 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3560 make_C_tag (TRUE); /* a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3561 fvdef = fignore;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3562 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564 case fvnameseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 if (structdef == stagseen && !cjava)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3569 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3570 popclass_above (cblev);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3571 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3572 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574 case dsharpseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3575 savetoken = token;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3576 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 if (!yacc_rules || lp == newlb.buffer + 1)
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 tokoff = lp - 1 - newlb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 toklen = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 midtoken = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 } /* if (begtoken) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 } /* if must look at token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 /* Detect end of line, colon, comma, semicolon and various braces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 after having handled a token.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 case ':':
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3594 if (yacc_rules && token.offset == 0 && token.valid)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3595 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3596 make_C_tag (FALSE); /* a yacc function */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3597 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3598 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 case otagseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 objdef = omethodcolon;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3610 linebuffer_setlen (&token_name, token_name.len + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611 strcat (token_name.buffer, ":");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614 if (structdef == stagseen)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3615 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3616 structdef = scolonseen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3617 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3618 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3619 /* 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
3620 if (cplpl && fvdef == flistseen)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3621 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3622 make_C_tag (TRUE); /* a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3623 fvdef = fignore;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3624 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3625 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627 case ';':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3628 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3629 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3630 switch (typdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3632 case tend:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3633 case ttypeseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3634 make_C_tag (FALSE); /* a typedef */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3635 typdef = tnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3636 fvdef = fvnone;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3638 case tnone:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3639 case tinbody:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3640 case tignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3641 switch (fvdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3642 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3643 case fignore:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3644 if (typdef == tignore || cplpl)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3645 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3646 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3647 case fvnameseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3648 if ((globals && cblev == 0 && (!fvextern || declarations))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3649 || (members && instruct))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3650 make_C_tag (FALSE); /* a variable */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3651 fvextern = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3652 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3653 token.valid = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3654 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3655 case flistseen:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3656 if (declarations
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3657 && (typdef == tnone || (typdef != tignore && instruct)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3658 make_C_tag (TRUE); /* a function declaration */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3659 /* FALLTHRU */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3660 default:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3661 fvextern = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3662 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3663 if (declarations
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3664 && cplpl && structdef == stagseen)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3665 make_C_tag (FALSE); /* forward declaration */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3666 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3667 token.valid = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3668 } /* switch (fvdef) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 default:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3671 if (!instruct)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3672 typdef = tnone;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 if (structdef == stagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 structdef = snone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 case ',':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684 make_C_tag (TRUE); /* an Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 objdef = oinbody;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3690 case fdefunkey:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3691 case foperator:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3692 case fstartlist:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3697 case fdefunname:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3698 fvdef = fignore;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3699 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3700 case fvnameseen: /* a variable */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3701 if ((globals && cblev == 0 && (!fvextern || declarations))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3702 || (members && instruct))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3703 make_C_tag (FALSE);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3704 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3705 case flistseen: /* a function */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3706 if ((declarations && typdef == tnone && !instruct)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3707 || (members && typdef != tignore && instruct))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3708 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3709 make_C_tag (TRUE); /* a function declaration */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3710 fvdef = fvnameseen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3711 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3712 else if (!declarations)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3713 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3714 token.valid = FALSE;
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 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 if (structdef == stagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720 structdef = snone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 case '[':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3725 if (structdef == stagseen)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3726 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3727 switch (typdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3729 case ttypeseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3730 case tend:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 typdef = tignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 make_C_tag (FALSE); /* a typedef */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3734 case tnone:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3735 case tinbody:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3736 switch (fvdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3737 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3738 case foperator:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3739 case finlist:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3740 case fignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3741 case vignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3742 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3743 case fvnameseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3744 if ((members && cblev == 1)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3745 || (globals && cblev == 0
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3746 && (!fvextern || declarations)))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3747 make_C_tag (FALSE); /* a variable */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3748 /* FALLTHRU */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3749 default:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3750 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3751 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3752 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 case '(':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3758 if (objdef == otagseen && parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3759 objdef = oparenseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 case fvnameseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763 if (typdef == ttypeseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 && *lp != '*'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3765 && !instruct)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 /* This handles constructs like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 typedef void OperatorFun (int fun); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769 make_C_tag (FALSE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770 typdef = tignore;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3771 fvdef = fignore;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3772 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 fvdef = fstartlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3777 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778 case flistseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 fvdef = finlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782 parlev++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784 case ')':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787 if (objdef == ocatseen && parlev == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 make_C_tag (TRUE); /* an Objective C category */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 if (--parlev == 0)
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 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 case fstartlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3797 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3798 fvdef = flistseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3799 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3801 if (!instruct
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3802 && (typdef == tend
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3803 || typdef == ttypeseen))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 typdef = tignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 make_C_tag (FALSE); /* a typedef */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 else if (parlev < 0) /* can happen due to ill-conceived #if's. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810 parlev = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 case '{':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 if (typdef == ttypeseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3816 {
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3817 /* Whenever typdef is set to tinbody (currently only
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3818 here), typdefcblev should be set to cblev. */
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3819 typdef = tinbody;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3820 typdefcblev = cblev;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 case flistseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3825 make_C_tag (TRUE); /* a function */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3827 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830 case fvnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3831 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3832 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3833 case otagseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3834 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3836 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 make_C_tag (TRUE); /* an Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840 objdef = oinbody;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3843 /* Neutralize `extern "C" {' grot. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3844 if (cblev == 0 && structdef == snone && nestlev == 0
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3845 && typdef == tnone)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 cblev = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3848 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3850 switch (structdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3851 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3852 case skeyseen: /* unnamed struct */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3853 pushclass_above (cblev, NULL, 0);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3854 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3855 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3856 case stagseen: /* named struct or enum */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3857 case scolonseen: /* a class */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3858 pushclass_above (cblev, token.line+token.offset, token.length);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3859 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3860 make_C_tag (FALSE); /* a struct or enum */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3861 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3862 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863 cblev++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3864 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3865 case '*':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3868 if (fvdef == fstartlist)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3869 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3870 fvdef = fvnone; /* avoid tagging `foo' in `foo (*bar()) ()' */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3871 token.valid = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3872 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874 case '}':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3876 break;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3877 if (!ignoreindent && lp == newlb.buffer + 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3879 if (cblev != 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3880 token.valid = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881 cblev = 0; /* reset curly brace level if first column */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 parlev = 0; /* also reset paren level, just in case... */
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 else if (cblev > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 cblev--;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3886 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3887 token.valid = FALSE; /* something gone amiss, token unreliable */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3888 popclass_above (cblev);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3889 structdef = snone;
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3890 /* Only if typdef == tinbody is typdefcblev significant. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3891 if (typdef == tinbody && cblev <= typdefcblev)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3893 assert (cblev == typdefcblev);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3894 typdef = tend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3895 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3896 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3897 case '=':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3898 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3899 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3900 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3901 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3902 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3903 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3904 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3905 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3906 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3907 case fvnameseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3908 if ((members && cblev == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3909 || (globals && cblev == 0 && (!fvextern || declarations)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3910 make_C_tag (FALSE); /* a variable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3911 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3912 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3913 fvdef = vignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3914 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3915 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3916 case '<':
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3917 if (cplpl && structdef == stagseen)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3918 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3919 structdef = sintemplate;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3920 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3921 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3922 goto resetfvdef;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3923 case '>':
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3924 if (structdef == sintemplate)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3925 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3926 structdef = stagseen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3927 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3928 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3929 goto resetfvdef;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3930 case '+':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3931 case '-':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3932 if (objdef == oinbody && cblev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3933 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934 objdef = omethodsign;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3935 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3936 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3937 /* FALLTHRU */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3938 resetfvdef:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3939 case '#': case '~': case '&': case '%': case '/': case '|':
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3940 case '^': case '!': case '.': case '?': case ']':
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3941 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3942 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3943 /* These surely cannot follow a function tag in C. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3944 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3945 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3946 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949 case vignore:
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 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3954 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3955 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956 if (objdef == otagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3957 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3958 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3959 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3960 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3961 /* If a macro spans multiple lines don't reset its state. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962 if (quotednl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3963 CNL_SAVE_DEFINEDEF ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3964 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3965 CNL ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3966 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3967 } /* switch (c) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3969 } /* while not eof */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3970
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3971 free (lbs[0].lb.buffer);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3972 free (lbs[1].lb.buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3973 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3975 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3976 * 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
3977 * of a global flag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3978 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3979 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3980 default_C_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3981 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3982 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3983 C_entries (cplusplus ? C_PLPL : C_AUTO, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3984 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3985
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3986 /* Always do plain C. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3987 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 plain_C_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3990 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3991 C_entries (0, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3992 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994 /* Always do C++. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3995 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 Cplusplus_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999 C_entries (C_PLPL, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 /* Always do Java. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4003 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004 Cjava_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 C_entries (C_JAVA, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4008 }
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 /* Always do C*. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4011 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 Cstar_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015 C_entries (C_STAR, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 /* Always do Yacc. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4019 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 Yacc_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4022 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023 C_entries (YACC, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4024 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4025
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4027 /* Useful macros. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 #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
4029 for (; /* loop initialization */ \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030 !feof (file_pointer) /* loop test */ \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4031 && /* instructions at start of loop */ \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4032 (readline (&line_buffer, file_pointer), \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4033 char_pointer = line_buffer.buffer, \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034 TRUE); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4035 )
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4036 #define LOOKING_AT(cp, keyword) /* keyword is a constant string */ \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4037 (strneq ((cp), keyword, sizeof(keyword)-1) /* cp points at keyword */ \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4038 && notinname ((cp)[sizeof(keyword)-1]) /* end of keyword */ \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4039 && ((cp) = skip_spaces((cp)+sizeof(keyword)-1))) /* skip spaces */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4041 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 * 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
4043 * matching on files that have no language defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4045 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 just_read_file (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 register char *dummy;
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 LOOP_ON_INPUT_LINES (inf, lb, dummy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4053 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4054
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 /* Fortran parsing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4058 static void F_takeprec __P((void));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4059 static void F_getit __P((FILE *));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4061 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4062 F_takeprec ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065 if (*dbp != '*')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069 if (strneq (dbp, "(*)", 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071 dbp += 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4074 if (!ISDIGIT (*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 --dbp; /* force failure */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4077 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4079 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 dbp++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4081 while (ISDIGIT (*dbp));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4082 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4084 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4085 F_getit (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4088 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4090 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4091 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4093 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4094 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 if (dbp[5] != '&')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4097 dbp += 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4099 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4100 if (!ISALPHA (*dbp) && *dbp != '_' && *dbp != '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4101 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 for (cp = dbp + 1; *cp != '\0' && intoken (*cp); cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4103 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4104 make_tag (dbp, cp-dbp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4105 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4109 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4110 Fortran_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4111 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4112 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4113 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4114 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4115 if (*dbp == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116 dbp++; /* Ratfor escape to fortran */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4117 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4118 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4119 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120 switch (lowcase (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4122 case 'i':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4123 if (nocase_tail ("integer"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4124 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 case 'r':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4127 if (nocase_tail ("real"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4128 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130 case 'l':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4131 if (nocase_tail ("logical"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4132 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4133 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4134 case 'c':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4135 if (nocase_tail ("complex") || nocase_tail ("character"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4136 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 case 'd':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4139 if (nocase_tail ("double"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4141 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4143 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4144 if (nocase_tail ("precision"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4145 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4146 continue;
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 break;
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 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4153 switch (lowcase (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4154 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4156 if (nocase_tail ("function"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4157 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 case 's':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4160 if (nocase_tail ("subroutine"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4161 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 case 'e':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4164 if (nocase_tail ("entry"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4165 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167 case 'b':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4168 if (nocase_tail ("blockdata") || nocase_tail ("block data"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4169 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 if (*dbp == '\0') /* assume un-named */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4172 make_tag ("blockdata", 9, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4173 lb.buffer, dbp - lb.buffer, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4175 F_getit (inf); /* look for name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4180 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4181
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4183 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4184 * Ada parsing
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4185 * Original code by
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4186 * Philippe Waroquiers (1998)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4188
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4189 static void Ada_getit __P((FILE *, char *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4190
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191 /* Once we are positioned after an "interesting" keyword, let's get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192 the real tag value necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4194 Ada_getit (inf, name_qualifier)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4196 char *name_qualifier;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199 char *name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 while (!feof (inf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 if (*dbp == '\0'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 || (dbp[0] == '-' && dbp[1] == '-'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4207 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4208 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4211 switch (lowcase(*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213 case 'b':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4214 if (nocase_tail ("body"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4216 /* Skipping body of procedure body or package body or ....
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4217 resetting qualifier to body instead of spec. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218 name_qualifier = "/b";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4220 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4221 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4222 case 't':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223 /* 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
4224 if (nocase_tail ("type"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4225 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228 if (*dbp == '"')
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 += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 for (cp = dbp; *cp != '\0' && *cp != '"'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4235 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 for (cp = dbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 (*cp != '\0'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4239 && (ISALPHA (*cp) || ISDIGIT (*cp) || *cp == '_' || *cp == '.'));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4241 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4242 if (cp == dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4243 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4245 c = *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4246 *cp = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 name = concat (dbp, name_qualifier, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4248 *cp = c;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4249 make_tag (name, strlen (name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4250 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4251 free (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 if (c == '"')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253 dbp = cp + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4254 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4258 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 Ada_funcs (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260 FILE *inf;
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 bool inquote = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4263 bool skip_till_semicolumn = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 while (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 /* Skip a string i.e. "abcd". */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270 if (inquote || (*dbp == '"'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272 dbp = etags_strchr ((inquote) ? dbp : dbp+1, '"');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 if (dbp != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 else
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 inquote = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 break; /* advance line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4284 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 /* Skip comments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 if (dbp[0] == '-' && dbp[1] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 break; /* advance line */
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 /* Skip character enclosed in single quote i.e. 'a'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 and skip single quote starting an attribute i.e. 'Image. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292 if (*dbp == '\'')
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 dbp++ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4295 if (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4296 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4297 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4299
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4300 if (skip_till_semicolumn)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4301 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4302 if (*dbp == ';')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4303 skip_till_semicolumn = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4304 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4305 continue; /* advance char */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4306 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4307
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4308 /* Search for beginning of a token. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4309 if (!begtoken (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4311 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4312 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315 /* 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
4316 switch (lowcase(*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4318 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4319 if (!packages_only && nocase_tail ("function"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4320 Ada_getit (inf, "/f");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4323 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324 case 'p':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4325 if (!packages_only && nocase_tail ("procedure"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4326 Ada_getit (inf, "/p");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4327 else if (nocase_tail ("package"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4328 Ada_getit (inf, "/s");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4329 else if (nocase_tail ("protected")) /* protected type */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4330 Ada_getit (inf, "/t");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4333 continue; /* advance char */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4334
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4335 case 'u':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4336 if (typedefs && !packages_only && nocase_tail ("use"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4337 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4338 /* 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
4339 for this, we will skip everything till a ; */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4340 skip_till_semicolumn = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4341 continue; /* advance char */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4342 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4343
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 case 't':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4345 if (!packages_only && nocase_tail ("task"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4346 Ada_getit (inf, "/k");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4347 else if (typedefs && !packages_only && nocase_tail ("type"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4349 Ada_getit (inf, "/t");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 while (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358 /* Look for the end of the token. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 while (!endtoken (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4360 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 } /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363 } /* advance line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4365
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4367 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 * Unix and microcontroller assembly tag handling
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4369 * 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
4370 * Idea by Bob Weiner, Motorola Inc. (1994)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4372 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373 Asm_labels (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 register char *cp;
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 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4379 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4380 /* If first char is alphabetic or one of [_.$], test for colon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 following identifier. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4382 if (ISALPHA (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4383 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 /* Read past label. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4385 cp++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4386 while (ISALNUM (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4387 cp++;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4388 if (*cp == ':' || iswhite (*cp))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4389 /* 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
4390 make_tag (lb.buffer, cp - lb.buffer, TRUE,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4394 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4395
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4397 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4398 * Perl support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4399 * Perl sub names: /^sub[ \t\n]+[^ \t\n{]+/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400 * Perl variable names: /^(my|local).../
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4401 * 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
4402 * 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
4403 * 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
4404 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4405 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4406 Perl_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4407 FILE *inf;
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 char *package = savestr ("main"); /* current package name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4410 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4412 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4414 skip_spaces(cp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4415
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4416 if (LOOKING_AT (cp, "package"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4417 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4418 free (package);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4419 get_tag (cp, &package);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4420 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4421 else if (LOOKING_AT (cp, "sub"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4422 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4423 char *pos;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4424 char *sp = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4425
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4426 while (!notinname (*cp))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4427 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4428 if (cp == sp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4429 continue; /* nothing found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4430 if ((pos = etags_strchr (sp, ':')) != NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4431 && pos < cp && pos[1] == ':')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4432 /* The name is already qualified. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4433 make_tag (sp, cp - sp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4434 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4435 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4436 /* Qualify it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4437 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4438 char savechar, *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4439
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4440 savechar = *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4441 *cp = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4442 name = concat (package, "::", sp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4443 *cp = savechar;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4444 make_tag (name, strlen(name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4445 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4446 free (name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4447 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4448 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4449 else if (globals) /* only if we are tagging global vars */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4450 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4451 /* Skip a qualifier, if any. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4452 bool qual = LOOKING_AT (cp, "my") || LOOKING_AT (cp, "local");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453 /* 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
4454 char *varstart = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4455
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4456 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
4457 && (*cp == '$' || *cp == '@' || *cp == '%'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4458 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4459 varstart += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4460 do
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4461 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4462 while (ISALNUM (*cp) || *cp == '_');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4463 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4464 else if (qual)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4465 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 /* Should be examining a variable list at this point;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 could insist on seeing an open parenthesis. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468 while (*cp != '\0' && *cp != ';' && *cp != '=' && *cp != ')')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4469 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4471 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4472 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4473
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4474 make_tag (varstart, cp - varstart, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4475 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4479
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4480
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4481 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4482 * Python support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4483 * 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
4484 * 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
4485 * More ideas by seb bacon <seb@jamkit.com> (2002)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4487 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488 Python_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4491 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493 LOOP_ON_INPUT_LINES (inf, lb, cp)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4494 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4495 cp = skip_spaces (cp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4496 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
4497 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4498 char *name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4499 while (!notinname (*cp) && *cp != ':')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4500 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4501 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4502 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4503 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4504 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4505 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4506
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4507
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4508 /*
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4509 * PHP support
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4510 * Look for:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4511 * - /^[ \t]*function[ \t\n]+[^ \t\n(]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4512 * - /^[ \t]*class[ \t\n]+[^ \t\n]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4513 * - /^[ \t]*define\(\"[^\"]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4514 * Only with --members:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4515 * - /^[ \t]*var[ \t\n]+\$[^ \t\n=;]/
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4516 * Idea by Diez B. Roggisch (2001)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4517 */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4518 static void
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4519 PHP_functions (inf)
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4520 FILE *inf;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4521 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4522 register char *cp, *name;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4523 bool search_identifier = FALSE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4524
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4525 LOOP_ON_INPUT_LINES (inf, lb, cp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4527 cp = skip_spaces (cp);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4528 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4529 if (search_identifier
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4530 && *cp != '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4531 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4532 while (!notinname (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4534 make_tag (name, cp - name, TRUE,
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);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4536 search_identifier = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4538 else if (LOOKING_AT (cp, "function"))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4539 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4540 if(*cp == '&')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4541 cp = skip_spaces (cp+1);
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4542 if(*cp != '\0')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4543 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4544 name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4545 while (!notinname (*cp))
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4546 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4547 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4548 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
4549 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4550 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4551 search_identifier = TRUE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4552 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4553 else if (LOOKING_AT (cp, "class"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4554 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4555 if (*cp != '\0')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4556 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4557 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4558 while (*cp != '\0' && !iswhite (*cp))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4559 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4560 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4561 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
4562 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4563 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4564 search_identifier = TRUE;
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 else if (strneq (cp, "define", 6)
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4567 && (cp = skip_spaces (cp+6))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4568 && *cp++ == '('
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4569 && (*cp == '"' || *cp == '\''))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4570 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4571 char quote = *cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4572 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4573 while (*cp != quote && *cp != '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4574 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4575 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4576 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
4577 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4578 else if (members
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4579 && LOOKING_AT (cp, "var")
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4580 && *cp == '$')
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 name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4583 while (!notinname(*cp))
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4584 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4585 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4586 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4587 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4588 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4589 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4590
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 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 * Cobol tag functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4594 * We could look for anything that could be a paragraph name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4595 * 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
4596 * Idea by Corny de Souza (1993)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4597 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4598 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4599 Cobol_paragraphs (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4600 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4601 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4602 register char *bp, *ep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4604 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4605 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4606 if (lb.len < 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4607 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4608 bp += 8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4610 /* If eoln, compiler option or comment ignore whole line. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4611 if (bp[-1] != ' ' || !ISALNUM (bp[0]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4612 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4613
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4614 for (ep = bp; ISALNUM (*ep) || *ep == '-'; ep++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616 if (*ep++ == '.')
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4617 make_tag (bp, ep - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4618 lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4619 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4620 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4621
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4622
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4623 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4624 * Makefile support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4625 * Ideas by Assar Westerlund <assar@sics.se> (2001)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4626 */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4627 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4628 Makefile_targets (inf)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4629 FILE *inf;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4630 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4631 register char *bp;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4632
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4633 LOOP_ON_INPUT_LINES (inf, lb, bp)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4634 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4635 if (*bp == '\t' || *bp == '#')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4636 continue;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4637 while (*bp != '\0' && *bp != '=' && *bp != ':')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4638 bp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4639 if (*bp == ':' || (globals && *bp == '='))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4640 make_tag (lb.buffer, bp - lb.buffer, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4641 lb.buffer, bp - lb.buffer + 1, lineno, linecharno);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4642 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4643 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4644
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4646 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4647 * Pascal parsing
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4648 * Original code by Mosur K. Mohan (1989)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4649 *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4650 * Locates tags for procedures & functions. Doesn't do any type- or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4651 * var-definitions. It does look for the keyword "extern" or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4652 * "forward" immediately following the procedure statement; if found,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4653 * the tag is skipped.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4655 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4656 Pascal_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4657 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4658 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4659 linebuffer tline; /* mostly copied from C_entries */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4660 long save_lcno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4661 int save_lineno, namelen, taglen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4662 char c, *name;
428
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 bool /* each of these flags is TRUE iff: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 incomment, /* point is inside a comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666 inquote, /* point is inside '..' string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667 get_tagname, /* point is after PROCEDURE/FUNCTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4668 keyword, so next item = potential tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669 found_tag, /* point is after a potential tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670 inparms, /* point is within parameter-list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4671 verify_tag; /* point has passed the parm-list, so the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 next token will determine whether this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4673 is a FORWARD/EXTERN to be ignored, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4674 whether it is a real tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4676 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
4677 name = NULL; /* keep compiler quiet */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4678 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4679 *dbp = '\0';
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4680 linebuffer_init (&tline);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4682 incomment = inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4683 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
4684 get_tagname = FALSE; /* found "procedure" keyword */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4685 inparms = FALSE; /* found '(' after "proc" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4686 verify_tag = FALSE; /* check if "extern" is ahead */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4689 while (!feof (inf)) /* long main loop to get next char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4690 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4691 c = *dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4692 if (c == '\0') /* if end of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4693 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4694 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4695 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4696 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4698 if (!((found_tag && verify_tag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4699 || get_tagname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4700 c = *dbp++; /* only if don't need *dbp pointing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4701 to the beginning of the name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4702 the procedure or function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4703 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4704 if (incomment)
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 if (c == '}') /* within { } comments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4707 incomment = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4708 else if (c == '*' && *dbp == ')') /* within (* *) comments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4709 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711 incomment = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4715 else if (inquote)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717 if (c == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4721 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4722 switch (c)
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 case '\'':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4725 inquote = TRUE; /* found first quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 case '{': /* found open { comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728 incomment = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 case '(':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 if (*dbp == '*') /* found open (* comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733 incomment = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4734 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736 else if (found_tag) /* found '(' after tag, i.e., parm-list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4737 inparms = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 case ')': /* end of parms list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4740 if (inparms)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741 inparms = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 case ';':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4744 if (found_tag && !inparms) /* end of proc or fn stmt */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746 verify_tag = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4747 break;
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 continue;
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 if (found_tag && verify_tag && (*dbp != ' '))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4753 /* Check if this is an "extern" declaration. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4754 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4756 if (lowcase (*dbp == 'e'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4758 if (nocase_tail ("extern")) /* superfluous, really! */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4760 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4761 verify_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4762 }
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 else if (lowcase (*dbp) == 'f')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4766 if (nocase_tail ("forward")) /* check for forward reference */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4767 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769 verify_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772 if (found_tag && verify_tag) /* not external proc, so make tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4773 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4774 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4775 verify_tag = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4776 make_tag (name, namelen, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4777 tline.buffer, taglen, save_lineno, save_lcno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4778 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779 }
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 if (get_tagname) /* grab name of proc or fn */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4783 char *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4784
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 if (*dbp == '\0')
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
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4788 /* Find block name. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4789 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
4790 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4791
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4792 /* Save all values for later tagging. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4793 linebuffer_setlen (&tline, lb.len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794 strcpy (tline.buffer, lb.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 save_lineno = lineno;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 save_lcno = linecharno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4797 name = tline.buffer + (dbp - lb.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4798 namelen = cp - dbp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4799 taglen = cp - lb.buffer + 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4800
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 dbp = cp; /* set dbp to e-o-token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802 get_tagname = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 found_tag = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4806 /* And proceed to check for "extern". */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4808 else if (!incomment && !inquote && !found_tag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4810 /* Check for proc/fn keywords. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4811 switch (lowcase (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4812 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4813 case 'p':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4814 if (nocase_tail ("rocedure")) /* c = 'p', dbp has advanced */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 get_tagname = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4818 if (nocase_tail ("unction"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819 get_tagname = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4821 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4823 } /* while not eof */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4825 free (tline.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4827
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4829 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4830 * Lisp tag functions
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4831 * look for (def or (DEF, quote or QUOTE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4833
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4834 static void L_getit __P((void));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4835
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837 L_getit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 if (*dbp == '\'') /* Skip prefix quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841 else if (*dbp == '(')
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 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4844 /* Try to skip "(quote " */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4845 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
4846 /* Ok, then skip "(" before name in (defstruct (foo)) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4847 dbp = skip_spaces (dbp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4848 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4849 get_tag (dbp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4850 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4851
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4852 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4853 Lisp_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4857 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4858 if (dbp[0] != '(')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4859 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4860
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4861 if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4863 dbp = skip_non_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4864 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4865 L_getit ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4866 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4867 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4868 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4869 /* Check for (foo::defmumble name-defined ... */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4870 do
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4871 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4872 while (!notinname (*dbp) && *dbp != ':');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4873 if (*dbp == ':')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4876 dbp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4877 while (*dbp == ':');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4878
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4879 if (strneq (dbp, "def", 3) || strneq (dbp, "DEF", 3))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4881 dbp = skip_non_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4882 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4883 L_getit ();
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4889
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4890
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4891 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892 * Postscript tag functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4893 * Just look for lines where the first character is '/'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4894 * Also look at "defineps" for PSWrap
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4895 * Ideas by:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4896 * Richard Mlynarik <mly@adoc.xerox.com> (1997)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4897 * Masatake Yamato <masata-y@is.aist-nara.ac.jp> (1999)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4899 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4900 PS_functions (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4901 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4902 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4903 register char *bp, *ep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4905 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4906 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4907 if (bp[0] == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909 for (ep = bp+1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910 *ep != '\0' && *ep != ' ' && *ep != '{';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911 ep++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4912 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4913 make_tag (bp, ep - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4914 lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4915 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4916 else if (LOOKING_AT (bp, "defineps"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4917 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4918 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4919 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4922 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4923 * Scheme tag functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4924 * look for (def... xyzzy
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4925 * (def... (xyzzy
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4926 * (def ... ((...(xyzzy ....
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4927 * (set! xyzzy
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4928 * Original code by Ken Haase (1985?)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4929 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4930
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4931 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4932 Scheme_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4933 FILE *inf;
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 register char *bp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4937 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4938 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4939 if (strneq (bp, "(def", 4) || strneq (bp, "(DEF", 4))
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 bp = skip_non_spaces (bp+4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4942 /* Skip over open parens and white space */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4943 while (notinname (*bp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4944 bp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4945 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4946 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4947 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
4948 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4951
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4953 /* Find tags in TeX and LaTeX input files. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4955 /* 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
4956 * Each entry records one such control sequence.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4957 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4958 * Original code from who knows whom.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4959 * Ideas by:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4960 * Stefan Monnier (2002)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4961 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4962
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4963 static linebuffer *TEX_toktab = NULL; /* Table with tag tokens */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4965 /* Default set of control sequences to put into TEX_toktab.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4966 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
4967 static char *TEX_defenv = "\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4968 :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
4969 :part:appendix:entry:index:def\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4970 :newcommand:renewcommand:newenvironment:renewenvironment";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4971
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4972 static void TEX_mode __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4973 static void TEX_decode_env __P((char *, char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4974
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4975 static char TEX_esc = '\\';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4976 static char TEX_opgrp = '{';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4977 static char TEX_clgrp = '}';
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4980 * TeX/LaTeX scanning loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4982 static void
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4983 TeX_commands (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4986 char *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4987 linebuffer *key;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4989 /* Select either \ or ! as escape character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990 TEX_mode (inf);
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 /* Initialize token table once from environment. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4993 if (TEX_toktab == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4994 TEX_decode_env ("TEXTAGS", TEX_defenv);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4997 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4998 /* Look at each TEX keyword in line. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4999 for (;;)
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 /* Look for a TEX escape. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5002 while (*cp++ != TEX_esc)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5003 if (cp[-1] == '\0' || cp[-1] == '%')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5004 goto tex_next_line;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5005
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5006 for (key = TEX_toktab; key->buffer != NULL; key++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5007 if (strneq (cp, key->buffer, key->len))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5008 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5009 register char *p;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5010 int namelen, linelen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5011 bool opgrp = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5012
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5013 cp = skip_spaces (cp + key->len);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5014 if (*cp == TEX_opgrp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5015 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5016 opgrp = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5017 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5018 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5019 for (p = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5020 (!iswhite (*p) && *p != '#' &&
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5021 *p != TEX_opgrp && *p != TEX_clgrp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5022 p++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5023 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5024 namelen = p - cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5025 linelen = lb.len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5026 if (!opgrp || *p == TEX_clgrp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5027 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5028 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
5029 *p++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5030 linelen = p - lb.buffer + 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5031 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5032 make_tag (cp, namelen, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5033 lb.buffer, linelen, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5034 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
5035 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5036 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5037 tex_next_line:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5038 ;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5039 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5040 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5042 #define TEX_LESC '\\'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5043 #define TEX_SESC '!'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045 /* Figure out whether TeX's escapechar is '\\' or '!' and set grouping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046 chars accordingly. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5047 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5048 TEX_mode (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5051 int c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 while ((c = getc (inf)) != EOF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055 /* 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
5056 if (c == '%')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057 while (c != '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 c = getc (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059 else if (c == TEX_LESC || c == TEX_SESC )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063 if (c == TEX_LESC)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5064 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065 TEX_esc = TEX_LESC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066 TEX_opgrp = '{';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 TEX_clgrp = '}';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5069 else
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 TEX_esc = TEX_SESC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5072 TEX_opgrp = '<';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073 TEX_clgrp = '>';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075 /* 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
5076 No attempt is made to correct the situation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077 rewind (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5079
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5080 /* Read environment and prepend it to the default string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5081 Build token table. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5082 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5083 TEX_decode_env (evarname, defenv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5084 char *evarname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5085 char *defenv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5086 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087 register char *env, *p;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5088 int i, len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5090 /* Append default string to environment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5091 env = getenv (evarname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092 if (!env)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5093 env = defenv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5094 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5095 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5096 char *oldenv = env;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5097 env = concat (oldenv, defenv, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5098 }
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 /* Allocate a token table */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5101 for (len = 1, p = env; p;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102 if ((p = etags_strchr (p, ':')) && *++p != '\0')
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5103 len++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5104 TEX_toktab = xnew (len, linebuffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5106 /* Unpack environment string into token table. Be careful about */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5107 /* zero-length strings (leading ':', "::" and trailing ':') */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5108 for (i = 0; *env != '\0';)
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 p = etags_strchr (env, ':');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5111 if (!p) /* End of environment string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5112 p = env + strlen (env);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5113 if (p - env > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5114 { /* Only non-zero strings. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5115 TEX_toktab[i].buffer = savenstr (env, p - env);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5116 TEX_toktab[i].len = p - env;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5117 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5118 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5119 if (*p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5120 env = p + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5121 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5122 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5123 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
5124 TEX_toktab[i].len = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5125 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5126 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5127 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5129
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5130
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5131 /* Texinfo support. Dave Love, Mar. 2000. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5132 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5133 Texinfo_nodes (inf)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5134 FILE * inf;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5135 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5136 char *cp, *start;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5137 LOOP_ON_INPUT_LINES (inf, lb, cp)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5138 if (LOOKING_AT (cp, "@node"))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5139 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5140 start = cp;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5141 while (*cp != '\0' && *cp != ',')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5142 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5143 make_tag (start, cp - start, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5144 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5145 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5146 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5147
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 /* Similar to LOOKING_AT but does not use notinname, does not skip */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5150 #define LOOKING_AT_NOCASE(cp, kw) /* kw is a constant string */ \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5151 (strncaseeq ((cp), kw, sizeof(kw)-1) /* cp points at kw */ \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5152 && ((cp) += sizeof(kw)-1)) /* skip spaces */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5153
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5154 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5155 * HTML support.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5156 * Contents of <title>, <h1>, <h2>, <h3> are tags.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5157 * 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
5158 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5159 * Francesco Potort́, 2002.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5160 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5161 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5162 HTML_labels (inf)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5163 FILE * inf;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5164 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5165 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
5166 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
5167 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
5168 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
5169 char *end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5170
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5171
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5172 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
5173
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5174 LOOP_ON_INPUT_LINES (inf, lb, dbp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5175 for (;;) /* loop on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5176 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5177 if (skiptag) /* skip HTML tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5178 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5179 while (*dbp != '\0' && *dbp != '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5180 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5181 if (*dbp == '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5182 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5183 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5184 skiptag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5185 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5186 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5187 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5188 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5189
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5190 else if (intag) /* look for "name=" or "id=" */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5191 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5192 while (*dbp != '\0' && *dbp != '>'
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5193 && lowcase (*dbp) != 'n' && lowcase (*dbp) != 'i')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5194 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5195 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5196 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5197 if (*dbp == '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5198 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5199 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5200 intag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5201 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5202 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5203 if ((inanchor && LOOKING_AT_NOCASE (dbp, "name="))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5204 || LOOKING_AT_NOCASE (dbp, "id="))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5205 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5206 bool quoted = (dbp[0] == '"');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5207
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5208 if (quoted)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5209 for (end = ++dbp; *end != '\0' && *end != '"'; end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5210 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5211 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5212 for (end = dbp; *end != '\0' && intoken (*end); end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5213 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5214 linebuffer_setlen (&token_name, end - dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5215 strncpy (token_name.buffer, dbp, end - dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5216 token_name.buffer[end - dbp] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5217
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5218 dbp = end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5219 intag = FALSE; /* we found what we looked for */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5220 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
5221 getnext = TRUE; /* then grab the text */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5222 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5223 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5224 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5225 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5226
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5227 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
5228 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5229 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5230 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5231 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5232 if (*dbp == '<')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5233 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5234 intag = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5235 inanchor = (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5236 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5237 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5238
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5239 for (end = dbp + 1; *end != '\0' && *end != '<'; end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5240 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5241 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
5242 dbp, end - dbp, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5243 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
5244 getnext = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5245 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5246 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5247
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5248 else /* look for an interesting HTML tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5249 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5250 while (*dbp != '\0' && *dbp != '<')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5251 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5252 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5253 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5254 intag = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5255 if (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5256 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5257 inanchor = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5258 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5259 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5260 else if (LOOKING_AT_NOCASE (dbp, "<title>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5261 || LOOKING_AT_NOCASE (dbp, "<h1>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5262 || LOOKING_AT_NOCASE (dbp, "<h2>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5263 || LOOKING_AT_NOCASE (dbp, "<h3>"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5264 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5265 intag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5266 getnext = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5267 continue; /* look on the same line */
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 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5270 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5271 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5272 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5273
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5275 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5276 * Prolog support
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5277 *
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5278 * 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
5279 * 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
5280 * Original code by Sunichirou Sugou (1989)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5281 * Rewritten by Anders Lindgren (1996)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5282 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5283 static int prolog_pr __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5284 static void prolog_skip_comment __P((linebuffer *, FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5285 static int prolog_atom __P((char *, int));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5286
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5287 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5288 Prolog_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5289 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5290 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5291 char *cp, *last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5292 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5293 int allocated;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5295 allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5296 len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5297 last = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5299 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5300 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5301 if (cp[0] == '\0') /* Empty line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5302 continue;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5303 else if (iswhite (cp[0])) /* Not a predicate */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5304 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5305 else if (cp[0] == '/' && cp[1] == '*') /* comment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5306 prolog_skip_comment (&lb, inf);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5307 else if ((len = prolog_pr (cp, last)) > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5308 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5309 /* 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
5310 only generate a tag for the first clause. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5311 if (last == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5312 last = xnew(len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5313 else if (len + 1 > allocated)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5314 xrnew (last, len + 1, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5315 allocated = len + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5316 strncpy (last, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5317 last[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5318 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5319 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5320 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5322
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5323 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5324 prolog_skip_comment (plb, inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5325 linebuffer *plb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5326 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5327 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5328 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5330 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5332 for (cp = plb->buffer; *cp != '\0'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5333 if (cp[0] == '*' && cp[1] == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5334 return;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5335 readline (plb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5336 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5337 while (!feof(inf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5338 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5340 /*
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5341 * A predicate or rule definition is added if it matches:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5342 * <beginning of line><Prolog Atom><whitespace>(
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5343 * or <beginning of line><Prolog Atom><whitespace>:-
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5344 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5345 * 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
5346 * name of the previous clause header.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5347 *
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5348 * 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
5349 * header was found.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5350 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5351 static int
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5352 prolog_pr (s, last)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5353 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5354 char *last; /* Name of last clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5355 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5356 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5357 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5359 pos = prolog_atom (s, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5360 if (pos < 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5361 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5363 len = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5364 pos = skip_spaces (s + pos) - s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5365
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5366 if ((s[pos] == '.'
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5367 || (s[pos] == '(' && (pos += 1))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5368 || (s[pos] == ':' && s[pos + 1] == '-' && (pos += 2)))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5369 && (last == NULL /* save only the first clause */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5370 || len != strlen (last)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5371 || !strneq (s, last, len)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5372 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5373 make_tag (s, len, TRUE, s, pos, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5374 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5375 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5376 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5377 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5378 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5380 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5381 * Consume a Prolog atom.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5382 * 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
5383 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5384 * A prolog atom, in this context, could be one of:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5385 * - An alphanumeric sequence, starting with a lower case letter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5386 * - A quoted arbitrary string. Single quotes can escape themselves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5387 * Backslash quotes everything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5388 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5389 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5390 prolog_atom (s, pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5391 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5392 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5393 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5394 int origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5396 origpos = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5397
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5398 if (ISLOWER(s[pos]) || (s[pos] == '_'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5399 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5400 /* The atom is unquoted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5401 pos++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5402 while (ISALNUM(s[pos]) || (s[pos] == '_'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5403 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5404 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5405 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5406 return pos - origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5407 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5408 else if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5409 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5410 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5411
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5412 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5413 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5414 if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5416 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5417 if (s[pos] != '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5418 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5419 pos++; /* A double quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5420 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5421 else if (s[pos] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5422 /* Multiline quoted atoms are ignored. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5423 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5424 else if (s[pos] == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5425 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5426 if (s[pos+1] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5427 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5428 pos += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5429 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5430 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5431 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5432 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5433 return pos - origpos;
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5436 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5437 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5438
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5440 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5441 * Support for Erlang
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5442 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5443 * Generates tags for functions, defines, and records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5444 * 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
5445 * Original code by Anders Lindgren (1996)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5446 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5447 static int erlang_func __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5448 static void erlang_attribute __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5449 static int erlang_atom __P((char *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5450
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5451 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5452 Erlang_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5453 FILE *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 char *cp, *last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5456 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5457 int allocated;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5459 allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5460 len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5461 last = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5463 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5464 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5465 if (cp[0] == '\0') /* Empty line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5466 continue;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5467 else if (iswhite (cp[0])) /* Not function nor attribute */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5468 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5469 else if (cp[0] == '%') /* comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5470 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5471 else if (cp[0] == '"') /* Sometimes, strings start in column one */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5472 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5473 else if (cp[0] == '-') /* attribute, e.g. "-define" */
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 erlang_attribute (cp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5476 last = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5477 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5478 else if ((len = erlang_func (cp, last)) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5480 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5481 * Function. Store the function name so that we only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5482 * generates a tag for the first clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5483 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5484 if (last == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5485 last = xnew (len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5486 else if (len + 1 > allocated)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5487 xrnew (last, len + 1, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5488 allocated = len + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5489 strncpy (last, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5490 last[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5491 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5492 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5493 }
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 * A function definition is added if it matches:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5498 * <beginning of line><Erlang Atom><whitespace>(
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 * 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
5501 * name of the previous clause header.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5502 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5503 * 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
5504 * was found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5505 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5506 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5507 erlang_func (s, last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5508 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5509 char *last; /* Name of last clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5510 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5511 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5512 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5513
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5514 pos = erlang_atom (s);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5515 if (pos < 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5516 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5518 len = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5519 pos = skip_spaces (s + pos) - s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5521 /* Save only the first clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5522 if (s[pos++] == '('
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5523 && (last == NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5524 || len != (int)strlen (last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5525 || !strneq (s, last, len)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5526 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5527 make_tag (s, len, TRUE, s, pos, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5528 return len;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5531 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5532 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5535 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5536 * Handle attributes. Currently, tags are generated for defines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5537 * and records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5538 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5539 * They are on the form:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5540 * -define(foo, bar).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5541 * -define(Foo(M, N), M+N).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5542 * -record(graph, {vtab = notable, cyclic = true}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5543 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5544 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5545 erlang_attribute (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5546 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5547 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5548 char *cp = s;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5549
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5550 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
5551 && *cp++ == '(')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5552 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5553 int len = erlang_atom (skip_spaces (cp));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5554 if (len > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5555 make_tag (cp, len, TRUE, s, cp + len - s, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5556 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5557 return;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5561 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5562 * Consume an Erlang atom (or variable).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5563 * 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
5564 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5565 static int
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5566 erlang_atom (s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5567 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5568 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5569 int pos = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5570
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5571 if (ISALPHA (s[pos]) || s[pos] == '_')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5572 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5573 /* The atom is unquoted. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5574 do
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5575 pos++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5576 while (ISALNUM (s[pos]) || s[pos] == '_');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5577 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5578 else if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5579 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5580 for (pos++; s[pos] != '\''; pos++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5581 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
5582 || (s[pos] == '\\' && s[++pos] == '\0'))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5583 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5584 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5585 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5586
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5587 return pos;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5588 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5589
428
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 #ifdef ETAGS_REGEXPS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5592
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5593 static char *scan_separators __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5594 static void add_regex __P((char *, language *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5595 static char *substitute __P((char *, char *, struct re_registers *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5596
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5597 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5598 * 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
5599 * 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
5600 * 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
5601 * 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
5602 * 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
5603 * Returns pointer to terminating separator, or NULL for
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5604 * unterminated regexps.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5605 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5606 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5607 scan_separators (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5608 char *name;
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 char sep = name[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5611 char *copyto = name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5612 bool quoted = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5614 for (++name; *name != '\0'; ++name)
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 if (quoted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5617 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5618 switch (*name)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5619 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5620 case 'a': *copyto++ = '\007'; break; /* BEL (bell) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5621 case 'b': *copyto++ = '\b'; break; /* BS (back space) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5622 case 'd': *copyto++ = 0177; break; /* DEL (delete) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5623 case 'e': *copyto++ = 033; break; /* ESC (delete) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5624 case 'f': *copyto++ = '\f'; break; /* FF (form feed) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5625 case 'n': *copyto++ = '\n'; break; /* NL (new line) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5626 case 'r': *copyto++ = '\r'; break; /* CR (carriage return) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5627 case 't': *copyto++ = '\t'; break; /* TAB (horizontal tab) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5628 case 'v': *copyto++ = '\v'; break; /* VT (vertical tab) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5629 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5630 if (*name == sep)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5631 *copyto++ = sep;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5632 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5633 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5634 /* Something else is quoted, so preserve the quote. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5635 *copyto++ = '\\';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5636 *copyto++ = *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5637 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5638 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5639 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5640 quoted = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5641 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5642 else if (*name == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5643 quoted = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5644 else if (*name == sep)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5645 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5646 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5647 *copyto++ = *name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5648 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5649 if (*name != sep)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5650 name = NULL; /* signal unterminated regexp */
428
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 /* Terminate copied string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5653 *copyto = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5654 return name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5655 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5657 /* 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
5658 thing. Same for each line of a regexp file. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5659 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5660 analyse_regex (regex_arg)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5661 char *regex_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5662 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5663 if (regex_arg == NULL)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5664 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5665 free_regexps (); /* --no-regex: remove existing regexps */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5666 return;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5667 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5669 /* A real --regexp option or a line in a regexp file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5670 switch (regex_arg[0])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5671 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5672 /* Comments in regexp file or null arg to --regex. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5673 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5674 case ' ':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5675 case '\t':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5676 break;
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 /* Read a regex file. This is recursive and may result in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5679 loop, which will stop when the file descriptors are exhausted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5680 case '@':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5681 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5682 FILE *regexfp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5683 linebuffer regexbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5684 char *regexfile = regex_arg + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5685
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5686 /* regexfile is a file containing regexps, one per line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5687 regexfp = fopen (regexfile, "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5688 if (regexfp == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5689 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5690 pfatal (regexfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5691 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5692 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5693 linebuffer_init (&regexbuf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5694 while (readline_internal (&regexbuf, regexfp) > 0)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5695 analyse_regex (regexbuf.buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5696 free (regexbuf.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5697 fclose (regexfp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5698 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5699 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5701 /* Regexp to be used for a specific language only. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5702 case '{':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5703 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5704 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5705 char *lang_name = regex_arg + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5706 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5708 for (cp = lang_name; *cp != '}'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5709 if (*cp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5710 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5711 error ("unterminated language name in regex: %s", regex_arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5712 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5713 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5714 *cp++ = '\0';
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5715 lang = get_language_from_langname (lang_name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5716 if (lang == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5717 return;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5718 add_regex (cp, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5719 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5720 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5722 /* Regexp to be used for any language. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5723 default:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5724 add_regex (regex_arg, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5725 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5726 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5727 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5728
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5729 /* Separate the regexp pattern, compile it,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5730 and care for optional name and modifiers. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5731 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5732 add_regex (regexp_pattern, lang)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5733 char *regexp_pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5734 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5735 {
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5736 static struct re_pattern_buffer zeropattern;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5737 char sep, *pat, *name, *modifiers;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5738 const char *err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5739 struct re_pattern_buffer *patbuf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5740 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5741 bool
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5742 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
5743 ignore_case = FALSE, /* case is significant */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5744 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
5745 single_line = FALSE; /* dot does not match newline */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5746
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5747
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5748 if (strlen(regexp_pattern) < 3)
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 error ("null regexp", (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5751 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5752 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5753 sep = regexp_pattern[0];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5754 name = scan_separators (regexp_pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5755 if (name == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5756 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5757 error ("%s: unterminated regexp", regexp_pattern);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5758 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5759 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5760 if (name[1] == sep)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5761 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5762 error ("null name for regexp \"%s\"", regexp_pattern);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5763 return;
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 modifiers = scan_separators (name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5766 if (modifiers == NULL) /* no terminating separator --> no name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5767 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5768 modifiers = name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5769 name = "";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5770 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5771 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5772 modifiers += 1; /* skip separator */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5773
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5774 /* Parse regex modifiers. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5775 for (; modifiers[0] != '\0'; modifiers++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5776 switch (modifiers[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5777 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5778 case 'N':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5779 if (modifiers == name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5780 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
5781 force_explicit_name = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5782 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5783 case 'i':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5784 ignore_case = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5785 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5786 case 's':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5787 single_line = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5788 /* FALLTHRU */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5789 case 'm':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5790 multi_line = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5791 need_filebuf = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5792 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5793 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5794 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5795 char wrongmod [2];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5796 wrongmod[0] = modifiers[0];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5797 wrongmod[1] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5798 error ("invalid regexp modifier `%s', ignoring", wrongmod);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5799 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5800 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5801 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5803 patbuf = xnew (1, struct re_pattern_buffer);
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5804 *patbuf = zeropattern;
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5805 if (ignore_case)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5806 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5807 static char lc_trans[CHARS];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5808 int i;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5809 for (i = 0; i < CHARS; i++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5810 lc_trans[i] = lowcase (i);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5811 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
5812 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5813
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5814 if (multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5815 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
5816 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5817 pat = regexp_pattern;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5818
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5819 if (single_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5820 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
5821 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5822 re_set_syntax (RE_SYNTAX_EMACS);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5823
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5824 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
5825 if (multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5826 free (pat);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5827 if (err != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5828 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5829 error ("%s while compiling pattern", err);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5830 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5831 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5832
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5833 rp = p_head;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5834 p_head = xnew (1, regexp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5835 p_head->pattern = savestr (regexp_pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5836 p_head->p_next = rp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5837 p_head->lang = lang;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5838 p_head->pat = patbuf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5839 p_head->name = savestr (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5840 p_head->error_signaled = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5841 p_head->force_explicit_name = force_explicit_name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5842 p_head->ignore_case = ignore_case;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5843 p_head->multi_line = multi_line;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5844 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5846 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5847 * Do the substitutions indicated by the regular expression and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5848 * arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5849 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5850 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5851 substitute (in, out, regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5852 char *in, *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5853 struct re_registers *regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5854 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5855 char *result, *t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5856 int size, dig, diglen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5858 result = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5859 size = strlen (out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5861 /* 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
5862 if (out[size - 1] == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5863 fatal ("pattern error in \"%s\"", out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5864 for (t = etags_strchr (out, '\\');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5865 t != NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5866 t = etags_strchr (t + 2, '\\'))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5867 if (ISDIGIT (t[1]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5868 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5869 dig = t[1] - '0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5870 diglen = regs->end[dig] - regs->start[dig];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5871 size += diglen - 2;
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5874 size -= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5875
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5876 /* Allocate space and do the substitutions. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5877 assert (size >= 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5878 result = xnew (size + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5879
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5880 for (t = result; *out != '\0'; out++)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5881 if (*out == '\\' && ISDIGIT (*++out))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5882 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5883 dig = *out - '0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5884 diglen = regs->end[dig] - regs->start[dig];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5885 strncpy (t, in + regs->start[dig], diglen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5886 t += diglen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5888 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5889 *t++ = *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5890 *t = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5891
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5892 assert (t <= result + size);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5893 assert (t - result == (int)strlen (result));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5894
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5895 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5896 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5897
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5898 /* Deallocate all regexps. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5899 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5900 free_regexps ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5901 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5902 regexp *rp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5903 while (p_head != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5904 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5905 rp = p_head->p_next;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5906 free (p_head->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5907 free (p_head->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5908 free (p_head);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5909 p_head = rp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5910 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5911 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5912 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5913
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5914 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5915 * 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
5916 * multi-line regular expressions, creating tags on matches.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5917 * readline already dealt with normal regexps.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5918 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5919 * Idea by Ben Wing <ben@666.com> (2002).
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5920 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5921 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5922 regex_tag_multiline ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5923 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5924 char *buffer = filebuf.buffer;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5925 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5926 char *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5927
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5928 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
5929 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5930 int match = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5931
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5932 if (!rp->multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5933 continue; /* skip normal regexps */
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 /* Generic initialisations before parsing file from memory. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5936 lineno = 1; /* reset global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5937 charno = 0; /* reset global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5938 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
5939
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5940 /* 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
5941 if (rp->lang != NULL && rp->lang != curfdp->lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5942 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5943
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5944 while (match >= 0 && match < filebuf.len)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5945 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5946 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
5947 filebuf.len - match, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5948 switch (match)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5949 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5950 case -2:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5951 /* Some error. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5952 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5953 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5954 error ("regexp stack overflow while matching \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5955 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5956 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5957 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5958 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5959 case -1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5960 /* No match. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5961 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5962 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5963 if (match == rp->regs.end[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5964 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5965 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5966 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5967 error ("regexp matches the empty string: \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5968 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5969 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5970 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5971 match = -3; /* exit from while loop */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5972 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5973 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5974
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5975 /* Match occurred. Construct a tag. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5976 while (charno < rp->regs.end[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5977 if (buffer[charno++] == '\n')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5978 lineno++, linecharno = charno;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5979 name = rp->name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5980 if (name[0] == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5981 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5982 else /* make a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5983 name = substitute (buffer, rp->name, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5984 if (rp->force_explicit_name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5985 /* 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
5986 pfnote (name, TRUE, buffer + linecharno,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5987 charno - linecharno + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5988 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5989 make_tag (name, strlen (name), TRUE, buffer + linecharno,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5990 charno - linecharno + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5991 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5992 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5993 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5994 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5995 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5996
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5997 #endif /* ETAGS_REGEXPS */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5998
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5999
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6000 static bool
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6001 nocase_tail (cp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6002 char *cp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6003 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6004 register int len = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6005
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6006 while (*cp != '\0' && lowcase (*cp) == lowcase (dbp[len]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6007 cp++, len++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6008 if (*cp == '\0' && !intoken (dbp[len]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6009 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6010 dbp += len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6011 return TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6012 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6013 return FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6014 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6015
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6016 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6017 get_tag (bp, namepp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6018 register char *bp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6019 char **namepp;
428
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 register char *cp = bp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6022
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6023 if (*bp != '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6024 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6025 /* 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
6026 for (cp = bp + 1; !notinname (*cp); cp++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6027 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6028 make_tag (bp, cp - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6029 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
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
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6032 if (namepp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6033 *namepp = savenstr (bp, cp - bp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6034 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6035
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6036 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6037 * Read a line of text from `stream' into `lbp', excluding the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6038 * 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
6039 * `stream', which is the length of the line including the newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6040 *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6041 * 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
6042 * 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
6043 * 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
6044 * file).
2225
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 * 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
6047 * appended to `filebuf'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6048 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6049 static long
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6050 readline_internal (lbp, stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6051 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6052 register FILE *stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6053 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6054 char *buffer = lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6055 register char *p = lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6056 register char *pend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6057 int chars_deleted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6059 pend = p + lbp->size; /* Separate to avoid 386/IX compiler bug. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6060
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6061 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6062 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6063 register int c = getc (stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6064 if (p == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6065 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6066 /* We're at the end of linebuffer: expand it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6067 lbp->size *= 2;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6068 xrnew (buffer, lbp->size, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6069 p += buffer - lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6070 pend = buffer + lbp->size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6071 lbp->buffer = buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6072 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6073 if (c == EOF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6074 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6075 *p = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6076 chars_deleted = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6077 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6078 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6079 if (c == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6080 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6081 if (p > buffer && p[-1] == '\r')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6082 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6083 p -= 1;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6084 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6085 /* Assume CRLF->LF translation will be performed by Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6086 when loading this file, so CRs won't appear in the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6087 It would be cleaner to compensate within Emacs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6088 however, Emacs does not know how many CRs were deleted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6089 before any given point in the file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6090 chars_deleted = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6091 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6092 chars_deleted = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6093 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6094 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6095 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6096 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6097 chars_deleted = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6098 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6099 *p = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6100 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6101 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6102 *p++ = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6103 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6104 lbp->len = p - buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6105
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6106 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
6107 && chars_deleted > 0) /* not at EOF */
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 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
6110 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6111 /* Expand filebuf. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6112 filebuf.size *= 2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6113 xrnew (filebuf.buffer, filebuf.size, char);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6114 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6115 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
6116 filebuf.len += lbp->len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6117 filebuf.buffer[filebuf.len++] = '\n';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6118 filebuf.buffer[filebuf.len] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6119 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6120
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6121 return lbp->len + chars_deleted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6122 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6124 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6125 * 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
6126 * 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
6127 * directives.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6128 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6129 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6130 readline (lbp, stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6131 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6132 FILE *stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6133 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6134 long result;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6135
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6136 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
6137 result = readline_internal (lbp, stream); /* read line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6138 lineno += 1; /* increment global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6139 charno += result; /* increment global char number */
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 /* Honour #line directives. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6142 if (!no_line_directive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6143 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6144 static bool discard_until_line_directive;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6145
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6146 /* Check whether this is a #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6147 if (result > 12 && strneq (lbp->buffer, "#line ", 6))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6148 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6149 int start, lno;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6150
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6151 if (DEBUG) start = 0; /* shut up the compiler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6152 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
6153 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6154 char *endp = lbp->buffer + start;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6155
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6156 assert (start > 0);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6157 while ((endp = etags_strchr (endp, '"')) != NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6158 && endp[-1] == '\\')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6159 endp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6160 if (endp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6161 /* 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
6162 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6163 char *taggedabsname; /* absolute name of original file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6164 char *taggedfname; /* name of original file as given */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6165 char *name; /* temp var */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6166
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6167 discard_until_line_directive = FALSE; /* found it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6168 name = lbp->buffer + start;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6169 *endp = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6170 canonicalize_filename (name); /* for DOS */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6171 taggedabsname = absolute_filename (name, curfdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6172 if (filename_is_absolute (name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6173 || filename_is_absolute (curfdp->infname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6174 taggedfname = savestr (taggedabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6175 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6176 taggedfname = relative_filename (taggedabsname,tagfiledir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6177
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6178 if (streq (curfdp->taggedfname, taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6179 /* 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
6180 deal with this afterwards. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6181 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6182 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6183 /* The tags following this #line directive should be
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6184 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
6185 curfdp accordingly. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6186 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6187 fdesc *fdp; /* file description pointer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6188
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6189 /* 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
6190 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
6191 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
6192 directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6193 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6194 if (streq (fdp->infname, curfdp->infname)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6195 && streq (fdp->taggedfname, taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6196 /* 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
6197 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
6198 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
6199 entries pertaining to the same file but generated
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6200 from different files (via #line directives) will
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6201 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
6202 alternatives look equivalent. The first one
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6203 destroys some apparently useless information. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6204 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6205 curfdp = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6206 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6207 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6208 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6209 /* 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
6210 input lines until the next #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6211 if (fdp == NULL) /* not found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6212 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6213 if (streq (fdp->infabsname, taggedabsname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6214 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6215 discard_until_line_directive = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6216 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6217 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6218 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6219 /* 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
6220 now on, until the next #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6221 if (fdp == NULL) /* not found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6222 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6223 fdp = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6224 fdhead = xnew (1, fdesc);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6225 *fdhead = *curfdp; /* copy curr. file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6226 fdhead->next = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6227 fdhead->infname = savestr (curfdp->infname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6228 fdhead->infabsname = savestr (curfdp->infabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6229 fdhead->infabsdir = savestr (curfdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6230 fdhead->taggedfname = taggedfname;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6231 fdhead->usecharno = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6232 fdhead->prop = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6233 fdhead->written = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6234 curfdp = fdhead;
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 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6237 free (taggedabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6238 lineno = lno - 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6239 readline (lbp, stream);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6240 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6241 } /* if a real #line directive */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6242 } /* if #line is followed by a a number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6243 } /* if line begins with "#line " */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6244
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6245 /* 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
6246 if (discard_until_line_directive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6247 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6248 if (result > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6249 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6250 /* 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
6251 of the line buffer. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6252 readline (lbp, stream);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6253 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6254 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6255 /* End of file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6256 discard_until_line_directive = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6257 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6258 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6259 } /* if #line directives should be considered */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6260
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6261 #ifdef ETAGS_REGEXPS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6262 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6263 int match;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6264 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6265 char *name;
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 /* Match against relevant regexps. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6268 if (lbp->len > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6269 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
6270 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6271 /* 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
6272 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
6273 regex_tag_multiline. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6274 if ((rp->lang != NULL && rp->lang != fdhead->lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6275 || rp->multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6276 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6277
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6278 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
6279 switch (match)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6280 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6281 case -2:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6282 /* Some error. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6283 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6284 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6285 error ("regexp stack overflow while matching \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6286 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6287 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6288 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6289 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6290 case -1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6291 /* No match. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6292 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6293 case 0:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6294 /* Empty string matched. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6295 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6296 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6297 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
6298 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6299 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6300 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6301 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6302 /* Match occurred. Construct a tag. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6303 name = rp->name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6304 if (name[0] == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6305 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6306 else /* make a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6307 name = substitute (lbp->buffer, rp->name, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6308 if (rp->force_explicit_name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6309 /* 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
6310 pfnote (name, TRUE, lbp->buffer, match, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6311 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6312 make_tag (name, strlen (name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6313 lbp->buffer, match, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6314 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6315 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6316 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6317 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6318 #endif /* ETAGS_REGEXPS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6319 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6320
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6322 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6323 * Return a pointer to a space of size strlen(cp)+1 allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6324 * with xnew where the string CP has been copied.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6325 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6326 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6327 savestr (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6328 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6329 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6330 return savenstr (cp, strlen (cp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6331 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6333 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6334 * 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
6335 * 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
6336 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6337 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6338 savenstr (cp, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6339 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6340 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6341 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6342 register char *dp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6344 dp = xnew (len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6345 strncpy (dp, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6346 dp[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6347 return dp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6348 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6350 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6351 * Return the ptr in sp at which the character c last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6352 * appears; NULL if not found
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6353 *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6354 * Identical to POSIX strrchr, included for portability.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6355 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6356 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6357 etags_strrchr (sp, c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6358 register const char *sp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6359 register int c;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6360 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 432
diff changeset
6361 register const char *r;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6363 r = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6364 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6365 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6366 if (*sp == c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6367 r = sp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6368 } while (*sp++);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6369 return (char *)r;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6370 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6372 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6373 * Return the ptr in sp at which the character c first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6374 * appears; NULL if not found
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6375 *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6376 * Identical to POSIX strchr, included for portability.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6377 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6378 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6379 etags_strchr (sp, c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6380 register const char *sp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6381 register int c;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6382 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6383 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6384 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6385 if (*sp == c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6386 return (char *)sp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6387 } while (*sp++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6388 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6389 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6390
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6391 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6392 * Compare two strings, ignoring case for alphabetic characters.
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 * Same as BSD's strcasecmp, included for portability.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6395 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6396 static int
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6397 etags_strcasecmp (s1, s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6398 register const char *s1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6399 register const char *s2;
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 while (*s1 != '\0'
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6402 && (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6403 ? lowcase (*s1) == lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6404 : *s1 == *s2))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6405 s1++, s2++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6406
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6407 return (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6408 ? lowcase (*s1) - lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6409 : *s1 - *s2);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6410 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6411
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 * Compare two strings, ignoring case for alphabetic characters.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6414 * Stop after a given number of characters
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 * Same as BSD's strncasecmp, included for portability.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6417 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6418 static int
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6419 etags_strncasecmp (s1, s2, n)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6420 register const char *s1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6421 register const char *s2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6422 register int n;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6423 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6424 while (*s1 != '\0' && n-- > 0
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6425 && (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6426 ? lowcase (*s1) == lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6427 : *s1 == *s2))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6428 s1++, s2++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6429
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6430 if (n < 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6431 return 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6432 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6433 return (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6434 ? lowcase (*s1) - lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6435 : *s1 - *s2);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6436 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6437
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6438 /* Skip spaces, return new pointer. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6439 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6440 skip_spaces (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6441 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6442 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6443 while (iswhite (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6444 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6445 return cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6446 }
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 /* Skip non spaces, return new pointer. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6449 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6450 skip_non_spaces (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6451 char *cp;
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 while (*cp != '\0' && !iswhite (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6454 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6455 return cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6456 }
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 /* Print error message and exit. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6459 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6460 fatal (s1, s2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6461 char *s1, *s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6462 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6463 error (s1, s2);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6464 exit (EXIT_FAILURE);
428
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
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6467 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6468 pfatal (s1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6469 char *s1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6470 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6471 perror (s1);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6472 exit (EXIT_FAILURE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6473 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6474
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6475 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6476 suggest_asking_for_help ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6477 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6478
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6479 #ifdef LONG_OPTIONS
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6480 fprintf (stderr, "\tTry `%s %s' for a complete list of options.\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6481 progname, "--help");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6482 #else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6483 fprintf (stderr, "\tTry `%s %s' for a complete list of options.\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6484 progname, "-h");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6485 #endif
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6486 exit (EXIT_FAILURE);
428
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 /* 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
6490 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6491 error (s1, s2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6492 const char *s1, *s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6493 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6494 fprintf (stderr, "%s: ", progname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6495 fprintf (stderr, s1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6496 fprintf (stderr, "\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6497 }
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 /* Return a newly-allocated string whose contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6500 concatenate those of s1, s2, s3. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6501 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6502 concat (s1, s2, s3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6503 char *s1, *s2, *s3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6504 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6505 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6506 char *result = xnew (len1 + len2 + len3 + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6508 strcpy (result, s1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6509 strcpy (result + len1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6510 strcpy (result + len1 + len2, s3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6511 result[len1 + len2 + len3] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6513 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6514 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6515
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6516
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6517 /* 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
6518 guess the buffer size in advance. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6519 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6520 etags_getcwd ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6521 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6522 #ifdef HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6523 int bufsize = 200;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6524 char *path = xnew (bufsize, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6526 while (getcwd (path, bufsize) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6527 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6528 if (errno != ERANGE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6529 pfatal ("getcwd");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6530 bufsize *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6531 free (path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6532 path = xnew (bufsize, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6533 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6535 canonicalize_filename (path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6536 return path;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6538 #else /* not HAVE_GETCWD */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6539 #if MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6540
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6541 char *p, path[MAXPATHLEN + 1]; /* Fixed size is safe on MSDOS. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6542
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6543 getwd (path);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6544
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6545 for (p = path; *p != '\0'; p++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6546 if (*p == '\\')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6547 *p = '/';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6548 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6549 *p = lowcase (*p);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6550
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6551 return strdup (path);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6552 #else /* not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6553 linebuffer path;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6554 FILE *pipe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6555
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6556 linebuffer_init (&path);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6557 pipe = (FILE *) popen ("pwd 2>/dev/null", "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6558 if (pipe == NULL || readline_internal (&path, pipe) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6559 pfatal ("pwd");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6560 pclose (pipe);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6562 return path.buffer;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6563 #endif /* not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6564 #endif /* not HAVE_GETCWD */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6565 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6567 /* Return a newly allocated string containing the file name of FILE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6568 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
6569 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6570 relative_filename (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6571 char *file, *dir;
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 char *fp, *dp, *afn, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6574 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6576 /* Find the common root of file and dir (with a trailing slash). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6577 afn = absolute_filename (file, cwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6578 fp = afn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6579 dp = dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6580 while (*fp++ == *dp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6581 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6582 fp--, dp--; /* back to the first differing char */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6583 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6584 if (fp == afn && afn[0] != '/') /* cannot build a relative name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6585 return afn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6586 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6587 do /* look at the equal chars until '/' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6588 fp--, dp--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6589 while (*fp != '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6591 /* Build a sequence of "../" strings for the resulting relative file name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6592 i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6593 while ((dp = etags_strchr (dp + 1, '/')) != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6594 i += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6595 res = xnew (3*i + strlen (fp + 1) + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6596 res[0] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6597 while (i-- > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6598 strcat (res, "../");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6600 /* 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
6601 strcat (res, fp + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6602 free (afn);
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 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6605 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6607 /* Return a newly allocated string containing the absolute file name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6608 of FILE given DIR (which should end with a slash). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6609 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6610 absolute_filename (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6611 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6612 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6613 char *slashp, *cp, *res;
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 if (filename_is_absolute (file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6616 res = savestr (file);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6617 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6618 /* We don't support non-absolute file names with a drive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6619 letter, like `d:NAME' (it's too much hassle). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6620 else if (file[1] == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6621 fatal ("%s: relative file names with drive letters not supported", file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6622 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6623 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6624 res = concat (dir, file, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6626 /* Delete the "/dirname/.." and "/." substrings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6627 slashp = etags_strchr (res, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6628 while (slashp != NULL && slashp[0] != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6629 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6630 if (slashp[1] == '.')
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 if (slashp[2] == '.'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6633 && (slashp[3] == '/' || slashp[3] == '\0'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6634 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6635 cp = slashp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6636 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6637 cp--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6638 while (cp >= res && !filename_is_absolute (cp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6639 if (cp < res)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6640 cp = slashp; /* the absolute name begins with "/.." */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6641 #ifdef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6642 /* Under MSDOS and NT we get `d:/NAME' as absolute
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6643 file name, so the luser could say `d:/../NAME'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6644 We silently treat this as `d:/NAME'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6645 else if (cp[0] != '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6646 cp = slashp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6647 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6648 strcpy (cp, slashp + 3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6649 slashp = cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6650 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6651 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6652 else if (slashp[2] == '/' || slashp[2] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6654 strcpy (slashp, slashp + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6655 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6656 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6657 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6659 slashp = etags_strchr (slashp + 1, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6660 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6662 if (res[0] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6663 return savestr ("/");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6664 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6665 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6668 /* Return a newly allocated string containing the absolute
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6669 file name of dir where FILE resides given DIR (which should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6670 end with a slash). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6671 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6672 absolute_dirname (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6673 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6674 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6675 char *slashp, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6676 char save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6678 canonicalize_filename (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6679 slashp = etags_strrchr (file, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6680 if (slashp == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6681 return savestr (dir);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6682 save = slashp[1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6683 slashp[1] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6684 res = absolute_filename (file, dir);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6685 slashp[1] = save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6687 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6688 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6690 /* Whether the argument string is an absolute file name. The argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6691 string must have been canonicalized with canonicalize_filename. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6692 static bool
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6693 filename_is_absolute (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6694 char *fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6695 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6696 return (fn[0] == '/'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6697 #ifdef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6698 || (ISALPHA(fn[0]) && fn[1] == ':' && fn[2] == '/')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6699 #endif
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6703 /* Translate backslashes into slashes. Works in place. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6704 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6705 canonicalize_filename (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6706 register char *fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6707 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6708 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6709 /* Canonicalize drive letter case. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6710 if (fn[0] != '\0' && fn[1] == ':' && ISLOWER (fn[0]))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6711 fn[0] = upcase (fn[0]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6712 /* Convert backslashes to slashes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6713 for (; *fn != '\0'; fn++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6714 if (*fn == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6715 *fn = '/';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6716 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6717 /* No action. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6718 fn = NULL; /* shut up the compiler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6719 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6720 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6721
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6722
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6723 /* Initialize a linebuffer for use */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6724 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6725 linebuffer_init (lbp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6726 linebuffer *lbp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6727 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6728 lbp->size = (DEBUG) ? 3 : 200;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6729 lbp->buffer = xnew (lbp->size, char);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6730 lbp->buffer[0] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6731 lbp->len = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6732 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6733
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6734 /* 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
6735 static void
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6736 linebuffer_setlen (lbp, toksize)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6737 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6738 int toksize;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6739 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6740 while (lbp->size <= toksize)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6741 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6742 lbp->size *= 2;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6743 xrnew (lbp->buffer, lbp->size, char);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6744 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6745 lbp->len = toksize;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6746 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6747
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6748 /* 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
6749 static PTR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6750 xmalloc (size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6751 unsigned int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6752 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6753 PTR result = (PTR) malloc (size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6754 if (result == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6755 fatal ("virtual memory exhausted", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6756 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6758
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6759 static PTR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6760 xrealloc (ptr, size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6761 char *ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6762 unsigned int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6763 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6764 PTR result = (PTR) realloc (ptr, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6765 if (result == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6766 fatal ("virtual memory exhausted", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6767 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6768 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6769
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6770 /*
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6771 * Local Variables:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6772 * c-indentation-style: gnu
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6773 * indent-tabs-mode: t
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6774 * tab-width: 8
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6775 * fill-column: 79
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6776 * 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
6777 * End:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6778 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6779
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6780 /* arch-tag: 8a9b748d-390c-4922-99db-2eeefa921051
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6781 (do not change this comment) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6782
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6783 /* etags.c ends here */