annotate lib-src/etags.c @ 5697:40fbceabaafd

menubar-items.el (default-menubar): Reorganize. Add PROBLEMS to toplevel. New "More about XEmacs" submenu for NEWS, licensing, etc. New "Recent History" menu for messages, lossage, etc. Get rid of ugly and unexpressive ellipses.
author Stephen J. Turnbull <stephen@xemacs.org>
date Mon, 24 Dec 2012 03:08:33 +0900
parents 061f4f90f874
children
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 -*-
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
2
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
3 Copyright (C) 1984 The Regents of the University of California
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
4
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
5 Redistribution and use in source and binary forms, with or without
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
6 modification, are permitted provided that the following conditions are
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
7 met:
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
8 1. Redistributions of source code must retain the above copyright
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
9 notice, this list of conditions and the following disclaimer.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
10 2. Redistributions in binary form must reproduce the above copyright
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
11 notice, this list of conditions and the following disclaimer in the
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
12 documentation and/or other materials provided with the
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
13 distribution.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
14 3. Neither the name of the University nor the names of its
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
15 contributors may be used to endorse or promote products derived
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
16 from this software without specific prior written permission.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
17
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
18 THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
19 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
20 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
21 PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
22 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
23 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
24 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
25 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
26 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
27 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
28 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
29
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
30
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
31 Copyright (C) 1984, 1987, 1988, 1989, 1993, 1994, 1995, 1998, 1999,
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
32 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
33 Free Software Foundation, Inc.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
34
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
35 This file is not considered part of GNU Emacs.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
36
5406
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
37 This program is free software: you can redistribute it and/or modify it
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
38 under the terms of the GNU General Public License as published by the
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
39 Free Software Foundation, either version 3 of the License, or (at your
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
40 option) any later version.
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
41
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
42 This program is distributed in the hope that it will be useful, but WITHOUT
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
43 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
44 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
45 for more details.
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
46
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
47 You should have received a copy of the GNU General Public License
5406
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4768
diff changeset
48 along with this program. If not, see <http://www.gnu.org/licenses/>. */
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
49
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
50
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
51 /* NB To comply with the above BSD license, copyright information is
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
52 reproduced in etc/ETAGS.README. That file should be updated when the
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
53 above notices are.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
54
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
55 To the best of our knowledge, this code was originally based on the
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
56 ctags.c distributed with BSD4.2, which was copyrighted by the
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
57 University of California, as described above. */
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
58
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 * Authors:
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
62 * 1983 Ctags originally by Ken Arnold.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
63 * 1984 Fortran added by Jim Kleckner.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
64 * 1984 Ed Pelegri-Llopart added C typedefs.
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
65 * 1985 Emacs TAGS format by Richard Stallman.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
66 * 1989 Sam Kendall added C++.
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
67 * 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
68 * 1993 Francesco Potort́ reorganised C and C++.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
69 * 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
70 * 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
71 * 2002 #line directives by Francesco Potort́.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
73 * Francesco Potort́ <pot@gnu.org> has maintained and improved it since 1993.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
76 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
77 * If you want to add support for a new language, start by looking at the LUA
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
78 * language, which is the simplest. Alternatively, consider shipping a
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
79 * configuration file containing regexp definitions for etags.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
80 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
81
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
82 char pot_etags_version[] = "@(#) pot revision number is 17.33";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 #define TRUE 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 #define FALSE 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
87 #ifdef DEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
88 # undef DEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
89 # define DEBUG TRUE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
90 #else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
91 # define DEBUG FALSE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
92 # define NDEBUG /* disable assert */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 #ifdef HAVE_CONFIG_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 # include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 /* On some systems, Emacs defines static as nothing for the sake
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 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
99 # undef static
3524
0a57cc6116d1 [xemacs-hg @ 2006-07-21 16:36:50 by stephent]
stephent
parents: 3517
diff changeset
100 # ifndef PTR /* for XEmacs */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
101 # define PTR void *
715
add5a821a048 [xemacs-hg @ 2001-12-24 07:44:55 by yoshiki]
yoshiki
parents: 709
diff changeset
102 # endif
3524
0a57cc6116d1 [xemacs-hg @ 2006-07-21 16:36:50 by stephent]
stephent
parents: 3517
diff changeset
103 # ifndef __P /* for XEmacs */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
104 # define __P(args) args
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
105 # endif
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
106 #else /* no config.h */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
107 # if defined(__STDC__) && (__STDC__ || defined(__SUNPRO_C))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
108 # define __P(args) args /* use prototypes */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
109 # define PTR void * /* for generic pointers */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
110 # else /* not standard C */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
111 # define __P(args) () /* no prototypes */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
112 # define const /* remove const for old compilers' sake */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
113 # define PTR long * /* don't use void* */
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
114 # endif
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
115 #endif /* !HAVE_CONFIG_H */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
432
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
117 #ifndef _GNU_SOURCE
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
118 # define _GNU_SOURCE 1 /* enables some compiler checks on GNU */
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
119 #endif
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
120
3524
0a57cc6116d1 [xemacs-hg @ 2006-07-21 16:36:50 by stephent]
stephent
parents: 3517
diff changeset
121 /* WIN32_NATIVE is for XEmacs.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
122 MSDOS, WINDOWSNT, DOS_NT are for Emacs. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
123 #ifdef WIN32_NATIVE
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
124 # undef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
125 # undef WINDOWSNT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
126 # define WINDOWSNT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
127 #endif /* WIN32_NATIVE */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
128
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
129 #ifdef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
130 # undef MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
131 # define MSDOS TRUE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
132 # include <fcntl.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
133 # include <sys/param.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
134 # include <io.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
135 # ifndef HAVE_CONFIG_H
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
136 # define DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
137 # include <sys/config.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
138 # endif
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
139 #else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
140 # define MSDOS FALSE
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
141 #endif /* MSDOS */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
142
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
143 #ifdef WINDOWSNT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 # include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 # include <fcntl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 # include <string.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
147 # include <direct.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 # include <io.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 # define MAXPATHLEN _MAX_PATH
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
150 # undef HAVE_NTGUI
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
151 # undef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
152 # define DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 # ifndef HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 # define HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 # endif /* undef HAVE_GETCWD */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
156 #else /* not WINDOWSNT */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
157 # ifdef STDC_HEADERS
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
158 # include <stdlib.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
159 # include <string.h>
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
160 # else /* no standard C headers */
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
161 extern char *getenv ();
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
162 extern char *strcpy ();
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
163 extern char *strncpy ();
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
164 extern char *strcat ();
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
165 extern char *strncat ();
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
166 extern unsigned long strlen ();
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
167 extern PTR malloc ();
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
168 extern PTR realloc ();
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
169 # ifdef VMS
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
170 # define EXIT_SUCCESS 1
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
171 # define EXIT_FAILURE 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
172 # else /* no VMS */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
173 # define EXIT_SUCCESS 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
174 # define EXIT_FAILURE 1
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
175 # endif
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
176 # endif
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
177 #endif /* !WINDOWSNT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 #ifdef HAVE_UNISTD_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 # include <unistd.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 #else
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
182 # if defined (HAVE_GETCWD) && !defined (WINDOWSNT)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
183 extern char *getcwd (char *buf, size_t size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 #endif /* HAVE_UNISTD_H */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 #include <ctype.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 #include <errno.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
190 #ifndef errno
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
191 extern int errno;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
192 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 #include <sys/stat.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
196 #include <assert.h>
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
197 #ifdef NDEBUG
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
198 # undef assert /* some systems have a buggy assert.h */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
199 # define assert(x) ((void) 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
200 #endif
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
201
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 #if !defined (S_ISREG) && defined (S_IFREG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
206 #ifdef NO_LONG_OPTIONS /* define this if you don't have GNU getopt */
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
207 # define NO_LONG_OPTIONS TRUE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 # define getopt_long(argc,argv,optstr,lopts,lind) getopt (argc, argv, optstr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 extern char *optarg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 extern int optind, opterr;
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
211 #else
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
212 # define NO_LONG_OPTIONS FALSE
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
213 # include <getopt.h>
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
214 #endif /* NO_LONG_OPTIONS */
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
215
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
216 #ifndef HAVE_CONFIG_H /* this is a standalone compilation */
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
217 # ifdef __CYGWIN__ /* compiling on Cygwin */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
218 !!! NOTICE !!!
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
219 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
220 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
221 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
222 # endif
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
223 #endif
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
224 #include <regex.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 /* Define CTAGS to make the program "ctags" compatible with the usual one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 Leave it undefined to make the program "etags", which makes emacs-style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 tag tables and tags typedefs, #defines and struct/union/enum by default. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 #ifdef CTAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 # undef CTAGS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 # define CTAGS TRUE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 # define CTAGS FALSE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
236 #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
237 #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
238 #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
239 #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
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 #define CHARS 256 /* 2^sizeof(char) */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
242 #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
243 #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
244 #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
245 #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
246 #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
247 #define endtoken(c) (_etk[CHAR(c)]) /* c ends tokens (see endtk) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
249 #define ISALNUM(c) isalnum (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
250 #define ISALPHA(c) isalpha (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
251 #define ISDIGIT(c) isdigit (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
252 #define ISLOWER(c) islower (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
253
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
254 #define lowcase(c) tolower (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
255 #define upcase(c) toupper (CHAR(c))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
256
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 * xnew, xrnew -- allocate, reallocate storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 * SYNOPSIS: Type *xnew (int n, Type);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
262 * void xrnew (OldPointer, int n, Type);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
264 #if DEBUG
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 # include "chkmalloc.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 # define xnew(n,Type) ((Type *) trace_malloc (__FILE__, __LINE__, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (n) * sizeof (Type)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
268 # define xrnew(op,n,Type) ((op) = (Type *) trace_realloc (__FILE__, __LINE__, \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
269 (char *) (op), (n) * sizeof (Type)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 # define xnew(n,Type) ((Type *) xmalloc ((n) * sizeof (Type)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
272 # define xrnew(op,n,Type) ((op) = (Type *) xrealloc ( \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
273 (char *) (op), (n) * sizeof (Type)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
276 #define bool int
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
277
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
278 typedef void Lang_function __P((FILE *));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
282 char *suffix; /* file name suffix for this compressor */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
283 char *command; /* takes one arg and decompresses to stdout */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 } compressor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
288 char *name; /* language name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
289 char *help; /* detailed help for the language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
290 Lang_function *function; /* parse function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
291 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
292 char **filenames; /* names of this language's files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
293 char **interpreters; /* interpreters for this language */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
294 bool metasource; /* source used to generate other sources */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 } language;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
297 typedef struct fdesc
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 fdesc *next; /* for the linked list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
300 char *infname; /* uncompressed input file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
301 char *infabsname; /* absolute uncompressed input file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
302 char *infabsdir; /* absolute dir of input file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
303 char *taggedfname; /* file name to write in tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
304 language *lang; /* language of file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
305 char *prop; /* file properties to write in tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
306 bool usecharno; /* etags tags shall contain char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
307 bool written; /* entry written in the tags file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
308 } fdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
309
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 typedef struct node_st
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
311 { /* sorting structure */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
312 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
313 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
314 char *name; /* tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
315 char *regex; /* search regexp */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
316 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
317 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
318 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
319 int lno; /* line number tag is on */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 long cno; /* character number line starts on */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 } node;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 * A `linebuffer' is a structure which holds a line of text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 * `readline_internal' reads a line from a stream into a linebuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 * and works regardless of the length of the line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 * 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
328 * BUFFER after readline reads it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 long size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 char *buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 } linebuffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
337 /* 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
338 typedef struct
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
339 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
340 enum {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
341 at_language, /* a language specification */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
342 at_regexp, /* a regular expression */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
343 at_filename, /* a file name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
344 at_stdin, /* read from stdin here */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
345 at_end /* stop parsing the list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
346 } arg_type; /* argument type */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
347 language *lang; /* language associated with the argument */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
348 char *what; /* the argument itself */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
349 } argument;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
350
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
351 /* Structure defining a regular expression. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
352 typedef struct regexp
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
353 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
354 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
355 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
356 char *pattern; /* the regexp pattern */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
357 char *name; /* tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
358 struct re_pattern_buffer *pat; /* the compiled pattern */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
359 struct re_registers regs; /* re registers */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
360 bool error_signaled; /* already signaled for this regexp */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
361 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
362 bool ignore_case; /* ignore case when matching */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
363 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
364 } regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
365
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
366
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 /* Many compilers barf on this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 Lang_function Ada_funcs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 so let's write it this way */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
370 static void Ada_funcs __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
371 static void Asm_labels __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
372 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
373 static void default_C_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
374 static void plain_C_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
375 static void Cjava_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
376 static void Cobol_paragraphs __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
377 static void Cplusplus_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
378 static void Cstar_entries __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
379 static void Erlang_functions __P((FILE *));
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
380 static void Forth_words __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
381 static void Fortran_functions __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
382 static void HTML_labels __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
383 static void Lisp_functions __P((FILE *));
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
384 static void Lua_functions __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
385 static void Makefile_targets __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
386 static void Pascal_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
387 static void Perl_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
388 static void PHP_functions __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
389 static void PS_functions __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
390 static void Prolog_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
391 static void Python_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
392 static void Scheme_functions __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
393 static void TeX_commands __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
394 static void Texinfo_nodes __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
395 static void Yacc_entries __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
396 static void just_read_file __P((FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
397
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
398 static void print_language_names __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
399 static void print_version __P((void));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
400 static void print_help __P((argument *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
401 int main __P((int, char **));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
402
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
403 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
404 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
405 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
406 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
407 static void readline __P((linebuffer *, FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
408 static long readline_internal __P((linebuffer *, FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
409 static bool nocase_tail __P((char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
410 static void get_tag __P((char *, char **));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
412 static void analyse_regex __P((char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
413 static void free_regexps __P((void));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
414 static void regex_tag_multiline __P((void));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
415 static void error __P((const char *, const char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
416 static void suggest_asking_for_help __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
417 void fatal __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
418 static void pfatal __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
419 static void add_node __P((node *, node **));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
420
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
421 static void init __P((void));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
422 static void process_file_name __P((char *, language *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
423 static void process_file __P((FILE *, char *, language *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
424 static void find_entries __P((FILE *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
425 static void free_tree __P((node *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
426 static void free_fdesc __P((fdesc *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
427 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
428 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
429 static void invalidate_nodes __P((fdesc *, node **));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
430 static void put_entries __P((node *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
431
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
432 static char *concat __P((char *, char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
433 static char *skip_spaces __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
434 static char *skip_non_spaces __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
435 static char *savenstr __P((char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
436 static char *savestr __P((char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
437 static char *etags_strchr __P((const char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
438 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
439 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
440 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
441 static char *etags_getcwd __P((void));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
442 static char *relative_filename __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
443 static char *absolute_filename __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
444 static char *absolute_dirname __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
445 static bool filename_is_absolute __P((char *f));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
446 static void canonicalize_filename __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
447 static void linebuffer_init __P((linebuffer *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
448 static void linebuffer_setlen __P((linebuffer *, int));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
449 static PTR xmalloc __P((unsigned int));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
450 static PTR xrealloc __P((char *, unsigned int));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
453 static char searchar = '/'; /* use /.../ searches */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
454
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
455 static char *tagfile; /* output file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
456 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
457 static char *cwd; /* current working directory */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
458 static char *tagfiledir; /* directory of tagfile */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
459 static FILE *tagf; /* ioptr for tags file */
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 static fdesc *fdhead; /* head of file description list */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
462 static fdesc *curfdp; /* current file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
463 static int lineno; /* line number of current line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
464 static long charno; /* current character number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
465 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
466 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
467
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
468 static const int invalidcharno = -1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
469
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
470 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
471 static node *last_node; /* the last node created */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
472
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
473 static linebuffer lb; /* the current line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
474 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
475 static linebuffer token_name; /* a buffer containing a tag name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 /* boolean "functions" (see init) */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
478 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
479 static char
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 /* white chars */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
481 *white = " \f\t\n\r\v",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 /* not in a name */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
483 *nonam = " \f\t\n\r()=,;", /* look at make_tag before modifying! */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 /* token ending chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 *endtk = " \t\n\r\"'#()[]{}=-+%*/&|^~!<>;,.:?",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 /* token starting chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$~@",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 /* valid in-token chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 *midtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
491 static bool append_to_tagfile; /* -a: append to tags */
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
492 /* The next five default to TRUE for etags, but to FALSE for ctags. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
493 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
494 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
495 /* 0 struct/enum/union decls, and C++ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 /* member functions. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
497 static bool constantypedefs; /* -d: create tags for C #define, enum */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 /* constants and variables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 /* -D: opposite of -d. Default under ctags. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
500 static bool globals; /* create tags for global variables */
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
501 static bool members; /* create tags for C member variables */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
502 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
503 static bool no_line_directive; /* ignore #line directives (undocumented) */
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
504 static bool no_duplicates; /* no duplicate tags for ctags (undocumented) */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
505 static bool update; /* -u: update tags */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
506 static bool vgrind_style; /* -v: create vgrind style index output */
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
507 static bool no_warnings; /* -w: suppress warnings (undocumented) */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
508 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
509 static bool cplusplus; /* .[hc] means C++, not C */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
510 static bool ignoreindent; /* -I: ignore indentation in C */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
511 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
512
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
513 /* STDIN is defined in LynxOS system headers */
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
514 #ifdef STDIN
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
515 # undef STDIN
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
516 #endif
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
517
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
518 #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
519 static bool parsing_stdin; /* --parse-stdin used */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
520
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
521 static regexp *p_head; /* list of all regexps */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
522 static bool need_filebuf; /* some regexes are multi-line */
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
523
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
524 static struct option longopts[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 {
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
526 { "append", no_argument, NULL, 'a' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
527 { "packages-only", no_argument, &packages_only, TRUE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
528 { "c++", no_argument, NULL, 'C' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
529 { "declarations", no_argument, &declarations, TRUE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
530 { "no-line-directive", no_argument, &no_line_directive, TRUE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
531 { "no-duplicates", no_argument, &no_duplicates, TRUE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
532 { "help", no_argument, NULL, 'h' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
533 { "help", no_argument, NULL, 'H' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
534 { "ignore-indentation", no_argument, NULL, 'I' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
535 { "language", required_argument, NULL, 'l' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
536 { "members", no_argument, &members, TRUE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
537 { "no-members", no_argument, &members, FALSE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
538 { "output", required_argument, NULL, 'o' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
539 { "regex", required_argument, NULL, 'r' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
540 { "no-regex", no_argument, NULL, 'R' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
541 { "ignore-case-regex", required_argument, NULL, 'c' },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
542 { "parse-stdin", required_argument, NULL, STDIN },
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
543 { "version", no_argument, NULL, 'V' },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
544
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
545 #if CTAGS /* Ctags options */
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
546 { "backward-search", no_argument, NULL, 'B' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
547 { "cxref", no_argument, NULL, 'x' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
548 { "defines", no_argument, NULL, 'd' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
549 { "globals", no_argument, &globals, TRUE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
550 { "typedefs", no_argument, NULL, 't' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
551 { "typedefs-and-c++", no_argument, NULL, 'T' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
552 { "update", no_argument, NULL, 'u' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
553 { "vgrind", no_argument, NULL, 'v' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
554 { "no-warn", no_argument, NULL, 'w' },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
555
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
556 #else /* Etags options */
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
557 { "no-defines", no_argument, NULL, 'D' },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
558 { "no-globals", no_argument, &globals, FALSE },
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
559 { "include", required_argument, NULL, 'i' },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
560 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 { NULL }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
564 static compressor compressors[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 { "z", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 { "Z", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 { "gz", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 { "GZ", "gzip -d -c"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 { "bz2", "bzip2 -d -c" },
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 { NULL }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 * Language stuff.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 /* Ada code */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
579 static char *Ada_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 { "ads", "adb", "ada", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
581 static char Ada_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
582 "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
583 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
584 packages only.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
585 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
586 Entity type: Qualifier:\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
587 ------------ ----------\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
588 function /f\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
589 procedure /p\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
590 package spec /s\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
591 package body /b\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
592 type /t\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
593 task /k\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
594 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
595 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
596 will just search for any tag `bidule'.";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 /* Assembly code */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
599 static char *Asm_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
600 { "a", /* Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
601 "asm", /* Microcontroller assembly */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
602 "def", /* BSO/Tasking definition includes */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
603 "inc", /* Microcontroller include files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
604 "ins", /* Microcontroller include files */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
605 "s", "sa", /* Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
606 "S", /* cpp-processed Unix assembler */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
607 "src", /* BSO/Tasking C compiler output */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
608 NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
609 };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
610 static char Asm_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
611 "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
612 followed by a colon, are tags.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
613
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 /* 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
616 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
617 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
618 static char *default_C_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 { "c", "h", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
620 static char default_C_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
621 "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
622 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
623 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
624 `--no-defines'. Global variables are tags unless you specify\n\
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
625 `--no-globals' and so are struct members unless you specify\n\
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
626 `--no-members'. Use of `--no-globals', `--no-defines' and\n\
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
627 `--no-members' can make the tags table file much smaller.\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
628 You can tag function declarations and external variables by\n\
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
629 using `--declarations'.";
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
630
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
631 static char *Cplusplus_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
632 { "C", "c++", "cc", "cpp", "cxx", "H", "h++", "hh", "hpp", "hxx",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 "M", /* Objective C++ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 "pdb", /* Postscript with C syntax */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
636 static char Cplusplus_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
637 "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
638 --help --lang=c --lang=c++ for full help.)\n\
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
639 In addition to C tags, member functions are also recognized. Member\n\
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
640 variables are recognized unless you use the `--no-members' option.\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
641 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
642 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
643 `operator+'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
644
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
645 static char *Cjava_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 { "java", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
647 static char Cjava_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
648 "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
649 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
650
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
651
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
652 static char *Cobol_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 { "COB", "cob", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
654 static char Cobol_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
655 "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
656 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
657
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
658 static char *Cstar_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 { "cs", "hs", NULL };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
661 static char *Erlang_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 { "erl", "hrl", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
663 static char Erlang_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
664 "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
665 defined in the file.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
666
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
667 char *Forth_suffixes [] =
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
668 { "fth", "tok", NULL };
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
669 static char Forth_help [] =
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
670 "In Forth code, tags are words defined by `:',\n\
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
671 constant, code, create, defer, value, variable, buffer:, field.";
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
672
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
673 static char *Fortran_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 { "F", "f", "f90", "for", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
675 static char Fortran_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
676 "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
677
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
678 static char *HTML_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
679 { "htm", "html", "shtml", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
680 static char HTML_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
681 "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
682 `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
683 occurrences of `id='.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
684
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
685 static char *Lisp_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
686 { "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
687 static char Lisp_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
688 "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
689 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
690 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
691 is a tag.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
692
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
693 static char *Lua_suffixes [] =
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
694 { "lua", "LUA", NULL };
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
695 static char Lua_help [] =
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
696 "In Lua scripts, all functions are tags.";
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
697
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
698 static char *Makefile_filenames [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
699 { "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
700 static char Makefile_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
701 "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
702 unless you specify `--no-globals'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
703
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
704 static char *Objc_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
705 { "lm", /* Objective lex file */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 "m", /* Objective C file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
708 static char Objc_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
709 "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
710 class categories, methods and protocols. Tags for variables and\n\
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
711 functions in classes are named `CLASS::VARIABLE' and `CLASS::FUNCTION'.\n\
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
712 (Use --help --lang=c --lang=objc --lang=java for full help.)";
2225
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 *Pascal_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
715 { "p", "pas", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
716 static char Pascal_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
717 "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
718 in the file.";
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
719 /* " // this is for working around an Emacs highlighting bug... */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
720
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
721 static char *Perl_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
722 { "pl", "pm", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
723 static char *Perl_interpreters [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
724 { "perl", "@PERL@", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
725 static char Perl_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
726 "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
727 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
728 `--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
729 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
730 defined in the default package is `main::SUB'.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
731
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
732 static char *PHP_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
733 { "php", "php3", "php4", NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
734 static char PHP_help [] =
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
735 "In PHP code, tags are functions, classes and defines. Unless you use\n\
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
736 the `--no-members' option, vars are tags too.";
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
737
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
738 static char *plain_C_suffixes [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
739 { "pc", /* Pro*C file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
740 NULL };
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
741
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
742 static char *PS_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 { "ps", "psw", NULL }; /* .psw is for PSWrap */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
744 static char PS_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
745 "In PostScript code, the tags are the functions.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
746
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
747 static char *Prolog_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 { "prolog", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
749 static char Prolog_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
750 "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
751 line.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
752
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
753 static char *Python_suffixes [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 { "py", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
755 static char Python_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
756 "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
757 generate a tag.";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 /* 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
760 static char *Scheme_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
761 { "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
762 static char Scheme_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
763 "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
764 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
765 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
766
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
767 static char *TeX_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
768 { "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
769 static char TeX_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
770 "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
771 `\\section', `\\subsection', `\\subsubsection', `\\eqno', `\\label',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
772 `\\ref', `\\cite', `\\bibitem', `\\part', `\\appendix', `\\entry',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
773 `\\index', `\\def', `\\newcommand', `\\renewcommand',\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
774 `\\newenvironment' or `\\renewenvironment' is a tag.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
775 \n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
776 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
777 `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
778 TEXTAGS=\"mycommand:myothercommand\".";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
779
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
780
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
781 static char *Texinfo_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
782 { "texi", "texinfo", "txi", NULL };
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
783 static char Texinfo_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
784 "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
785
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
786 static char *Yacc_suffixes [] =
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
787 { "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
788 static char Yacc_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
789 "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
790 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
791 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
792 for full help).";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
793
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
794 static char auto_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
795 "`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
796 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
797
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
798 static char none_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
799 "`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
800 regexp processing on files.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
801
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
802 static char no_lang_help [] =
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
803 "No detailed help available for this language.";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
804
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 * Table of languages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 * 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
810 * name. I just didn't.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
813 static language lang_names [] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
815 { "ada", Ada_help, Ada_funcs, Ada_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
816 { "asm", Asm_help, Asm_labels, Asm_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
817 { "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
818 { "c++", Cplusplus_help, Cplusplus_entries, Cplusplus_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
819 { "c*", no_lang_help, Cstar_entries, Cstar_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
820 { "cobol", Cobol_help, Cobol_paragraphs, Cobol_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
821 { "erlang", Erlang_help, Erlang_functions, Erlang_suffixes },
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
822 { "forth", Forth_help, Forth_words, Forth_suffixes },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
823 { "fortran", Fortran_help, Fortran_functions, Fortran_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
824 { "html", HTML_help, HTML_labels, HTML_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
825 { "java", Cjava_help, Cjava_entries, Cjava_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
826 { "lisp", Lisp_help, Lisp_functions, Lisp_suffixes },
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
827 { "lua", Lua_help, Lua_functions, Lua_suffixes },
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
828 { "makefile", Makefile_help,Makefile_targets,NULL,Makefile_filenames},
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
829 { "objc", Objc_help, plain_C_entries, Objc_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
830 { "pascal", Pascal_help, Pascal_functions, Pascal_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
831 { "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
832 { "php", PHP_help, PHP_functions, PHP_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
833 { "postscript",PS_help, PS_functions, PS_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
834 { "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
835 { "prolog", Prolog_help, Prolog_functions, Prolog_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
836 { "python", Python_help, Python_functions, Python_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
837 { "scheme", Scheme_help, Scheme_functions, Scheme_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
838 { "tex", TeX_help, TeX_commands, TeX_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
839 { "texinfo", Texinfo_help, Texinfo_nodes, Texinfo_suffixes },
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
840 { "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
841 { "auto", auto_help }, /* default guessing scheme */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
842 { "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
843 { NULL } /* end of list */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 };
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
845
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 print_language_names ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 language *lang;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
851 char **name, **ext;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 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
854 default file names and dot suffixes:");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
857 printf (" %-*s", 10, lang->name);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
858 if (lang->filenames != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
859 for (name = lang->filenames; *name != NULL; name++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
860 printf (" %s", *name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 if (lang->suffixes != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 for (ext = lang->suffixes; *ext != NULL; ext++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 printf (" .%s", *ext);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 puts ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
866 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
867 name suffix, and `none' means only do regexp processing on files.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 If no language is specified and no matching suffix is found,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 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
870 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
871 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
872 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
873 switches to C++.");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
874 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
875 \n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
876 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
877 etags --help --lang=ada.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
880 #ifndef EMACS_NAME
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
881 # define EMACS_NAME "standalone"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 #endif
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
883 #ifndef VERSION
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
884 # define VERSION "17.33"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 print_version ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 {
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
889 printf ("%s (%s %s)\n", (CTAGS) ? "ctags" : "etags", EMACS_NAME, VERSION);
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
890 puts ("Copyright (C) 2007 Free Software Foundation, Inc.");
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
891 puts ("This program is distributed under the terms in ETAGS.README");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
893 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
896 #ifndef PRINT_UNDOCUMENTED_OPTIONS_HELP
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
897 # define PRINT_UNDOCUMENTED_OPTIONS_HELP FALSE
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
898 #endif
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
899
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
901 print_help (argbuffer)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
902 argument *argbuffer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
904 bool help_for_lang = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
905
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
906 for (; argbuffer->arg_type != at_end; argbuffer++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
907 if (argbuffer->arg_type == at_language)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
908 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
909 if (help_for_lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
910 puts ("");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
911 puts (argbuffer->lang->help);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
912 help_for_lang = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
913 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
914
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
915 if (help_for_lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
916 exit (EXIT_SUCCESS);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
917
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 printf ("Usage: %s [options] [[regex-option ...] file-name] ...\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 \n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 These are the options accepted by %s.\n", progname, progname);
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
921 if (NO_LONG_OPTIONS)
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
922 puts ("WARNING: long option names do not work with this executable,\n\
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
923 as it is not linked with GNU getopt.");
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
924 else
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
925 puts ("You may use unambiguous abbreviations for the long option names.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
926 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
927 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
928 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
929
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
930 puts ("-a, --append\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 Append tag entries to existing tags file.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 puts ("--packages-only\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
934 For Ada files, only generate tags for packages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 puts ("-B, --backward-search\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 Write the search commands for the tag entries using '?', the\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 backward-search command instead of '/', the forward-search command.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
941 /* This option is mostly obsolete, because etags can now automatically
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
942 detect C++. Retained for backward compatibility and for debugging and
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
943 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
944 before any "class" or "template" keyword.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 puts ("-C, --c++\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 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
947 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 puts ("--declarations\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 In C and derived languages, create tags for function declarations,");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 puts ("\tand create tags for extern variables if --globals is used.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 puts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 ("\tand create tags for extern variables unless --no-globals is used.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 puts ("-d, --defines\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 Create tag entries for C #define constants and enum constants, too.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 puts ("-D, --no-defines\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 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
963 This makes the tags file smaller.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
966 puts ("-i FILE, --include=FILE\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 Include a note in tag file indicating that, when searching for\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 a tag, one should also consult the tags file FILE after\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 checking the current file.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
970
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
971 puts ("-l LANG, --language=LANG\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 Force the following files to be considered as written in the\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 named language up to the next --language=LANG option.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 puts ("--globals\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 Create tag entries for global variables in some languages.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 puts ("--no-globals\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 Do not create tag entries for global variables in some\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 languages. This makes the tags file smaller.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
982
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
983 if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
984 puts ("--no-line-directive\n\
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
985 Ignore #line preprocessor directives in C and derived languages.");
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
986
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
987 if (CTAGS)
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
988 puts ("--members\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
989 Create tag entries for members of structures in some languages.");
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
990 else
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
991 puts ("--no-members\n\
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
992 Do not create tag entries for members of structures\n\
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
993 in some languages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
995 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
996 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
997 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
998 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
999 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
1000 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
1001 puts (" If TAGNAME/ is present, the tags created are named.\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 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
1003 --regex=\"/proc[ \\t]+\\([^ \\t]+\\)/\\1/.\".\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1004 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
1005 `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
1006 causes dot to match any character, including newline.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1007
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 puts ("-R, --no-regex\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 Don't create tags from regexps for the following files.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1010
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1011 puts ("-I, --ignore-indentation\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1012 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
1013 column is the final brace of a function or structure definition.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1014
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 puts ("-o FILE, --output=FILE\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 Write the tags to FILE.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1017
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1018 puts ("--parse-stdin=NAME\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1019 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
1020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 if (CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 puts ("-t, --typedefs\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 Generate tag entries for C and Ada typedefs.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 puts ("-T, --typedefs-and-c++\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 Generate tag entries for C typedefs, C struct/enum/union tags,\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 and C++ member functions.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1028 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1029
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1030 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1031 puts ("-u, --update\n\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 Update the tag entries for the given files, leaving tag\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 entries for other files in place. Currently, this is\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 implemented by deleting the existing entries for the given\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 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
1036 tags file. It is often faster to simply rebuild the entire\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 tag file than to use this.");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1038
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1039 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1040 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 puts ("-v, --vgrind\n\
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1042 Print on the standard output an index of items intended for\n\
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1043 human consumption, similar to the output of vgrind. The index\n\
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1044 is sorted, and gives the page number of each item.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1045
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1046 if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1047 puts ("-w, --no-duplicates\n\
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1048 Do not create duplicate tag entries, for compatibility with\n\
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1049 traditional ctags.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1050
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1051 if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1052 puts ("-w, --no-warn\n\
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1053 Suppress warning messages about duplicate tag entries.");
3993
9bab7e657255 [xemacs-hg @ 2007-05-29 14:14:49 by stephent]
stephent
parents: 3972
diff changeset
1054
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 puts ("-x, --cxref\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 Like --vgrind, but in the style of cxref, rather than vgrind.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 The output uses line numbers instead of page numbers, but\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 beyond that the differences are cosmetic; try both to see\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 which you like.");
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 puts ("-V, --version\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 Print the version of the program.\n\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 -h, --help\n\
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1065 Print this help message.\n\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1066 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
1067 help about tag generation for the specified languages.");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 print_language_names ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 puts ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 puts ("Report bugs to bug-gnu-emacs@gnu.org");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1074 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 #ifdef VMS /* VMS specific functions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 #define EOS '\0'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 /* This is a BUG! ANY arbitrary limit is a BUG!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 Won't someone please fix this? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 #define MAX_FILE_SPEC_LEN 255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 typedef struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 short curlen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 char body[MAX_FILE_SPEC_LEN + 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 } vspec;
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 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 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
1092 returning in each successive call the next file name matching the input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 spec. The function expects that each in_spec passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 to it will be processed to completion; in particular, up to and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 including the call following that in which the last matching name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 is returned, the function ignores the value of in_spec, and will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 only start processing a new spec with the following call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 If an error occurs, on return out_spec contains the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 of in_spec when the error occurred.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 With each successive file name returned in out_spec, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 function's return value is one. When there are no more matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 names the function returns zero. If on the first call no file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 matches in_spec, or there is any other error, -1 is returned.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 #include <rmsdef.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 #include <descrip.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 #define OUTSIZE MAX_FILE_SPEC_LEN
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1110 static short
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 fn_exp (out, in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 vspec *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 char *in;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 static long context = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 static struct dsc$descriptor_s o;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 static struct dsc$descriptor_s i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 static bool pass1 = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 long status;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 short retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 if (pass1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 pass1 = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 o.dsc$a_pointer = (char *) out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 o.dsc$w_length = (short)OUTSIZE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 i.dsc$a_pointer = in;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 i.dsc$w_length = (short)strlen(in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 i.dsc$b_dtype = DSC$K_DTYPE_T;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 i.dsc$b_class = DSC$K_CLASS_S;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 o.dsc$b_dtype = DSC$K_DTYPE_VT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 o.dsc$b_class = DSC$K_CLASS_VS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 if ((status = lib$find_file(&i, &o, &context, 0, 0)) == RMS$_NORMAL)
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 out->body[out->curlen] = EOS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 else if (status == RMS$_NMF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 retval = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 strcpy(out->body, in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 retval = -1;
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 lib$find_file_end(&context);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 pass1 = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 }
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 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 v1.01 nmm 19-Aug-85 gfnames - return in successive calls the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 name of each file specified by the provided arg expanding wildcards.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1155 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 gfnames (arg, p_error)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 char *arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 bool *p_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 static vspec filename = {MAX_FILE_SPEC_LEN, "\0"};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 switch (fn_exp (&filename, arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 case 1:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 *p_error = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 return filename.body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 case 0:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 *p_error = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 *p_error = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 return filename.body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 #ifndef OLD /* Newer versions of VMS do provide `system'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 system (cmd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 char *cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 error ("%s", "system() function not implemented under VMS");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 #define VERSION_DELIM ';'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 char *massage_name (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 char *start = s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 for ( ; *s; s++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 if (*s == VERSION_DELIM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 *s = EOS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 *s = lowcase (*s);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 return start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 #endif /* VMS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 main (argc, argv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 int argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 char *argv[];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 unsigned int nincluded_files;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 char **included_files;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 argument *argbuffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 int current_arg, file_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 linebuffer filename_lb;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1214 bool help_asked = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 bool got_err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 #endif
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1218 char *optstring;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1219 int opt;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1220
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1222 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 _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
1224 #endif /* DOS_NT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 progname = argv[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 nincluded_files = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 included_files = xnew (argc, char *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 current_arg = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 file_count = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 /* Allocate enough no matter what happens. Overkill, but each one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 is small. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 argbuffer = xnew (argc, argument);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 * If etags, always find typedefs and structure tags. Why not?
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
1238 * Also default to find macro constants, enum constants, struct
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
1239 * members and global variables.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 if (!CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1243 typedefs = typedefs_or_cplusplus = constantypedefs = TRUE;
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
1244 globals = members = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1247 /* When the optstring begins with a '-' getopt_long does not rearrange the
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1248 non-options arguments to be at the end, but leaves them alone. */
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
1249 optstring = concat (NO_LONG_OPTIONS ? "" : "-",
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
1250 "ac:Cf:Il:o:r:RSVhH",
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1251 (CTAGS) ? "BxdtTuvw" : "Di:");
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1252
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1253 while ((opt = getopt_long (argc, argv, optstring, longopts, NULL)) != EOF)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1254 switch (opt)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1255 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1256 case 0:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1257 /* 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
1258 long-named option. We should do nothing. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1261 case 1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1262 /* 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
1263 argbuffer[current_arg].arg_type = at_filename;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1264 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1265 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1266 ++file_count;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1267 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1268
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1269 case STDIN:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1270 /* 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
1271 argbuffer[current_arg].arg_type = at_stdin;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1272 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1273 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1274 ++file_count;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1275 if (parsing_stdin)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1276 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
1277 parsing_stdin = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1278 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1279
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1280 /* Common options. */
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1281 case 'a': append_to_tagfile = TRUE; break;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1282 case 'C': cplusplus = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1283 case 'f': /* for compatibility with old makefiles */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1284 case 'o':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1285 if (tagfile)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1287 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
1288 suggest_asking_for_help ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1289 /* NOTREACHED */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1291 tagfile = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1292 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1293 case 'I':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1294 case 'S': /* for backward compatibility */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1295 ignoreindent = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1296 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1297 case 'l':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1298 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1299 language *lang = get_language_from_langname (optarg);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1300 if (lang != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1301 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1302 argbuffer[current_arg].lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1303 argbuffer[current_arg].arg_type = at_language;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1304 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1305 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1307 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1308 case 'c':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1309 /* Backward compatibility: support obsolete --ignore-case-regexp. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1310 optarg = concat (optarg, "i", ""); /* memory leak here */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1311 /* FALLTHRU */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1312 case 'r':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1313 argbuffer[current_arg].arg_type = at_regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1314 argbuffer[current_arg].what = optarg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1315 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1316 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1317 case 'R':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1318 argbuffer[current_arg].arg_type = at_regexp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1319 argbuffer[current_arg].what = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1320 ++current_arg;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1321 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1322 case 'V':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1323 print_version ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1324 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1325 case 'h':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1326 case 'H':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1327 help_asked = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1328 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1329
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1330 /* Etags options */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1331 case 'D': constantypedefs = FALSE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1332 case 'i': included_files[nincluded_files++] = optarg; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1333
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1334 /* Ctags options. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1335 case 'B': searchar = '?'; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1336 case 'd': constantypedefs = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1337 case 't': typedefs = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1338 case 'T': typedefs = typedefs_or_cplusplus = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1339 case 'u': update = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1340 case 'v': vgrind_style = TRUE; /*FALLTHRU*/
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1341 case 'x': cxref_style = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1342 case 'w': no_warnings = TRUE; break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1343 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1344 suggest_asking_for_help ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1345 /* NOTREACHED */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1346 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1347
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
1348 /* No more options. Store the rest of arguments. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1349 for (; optind < argc; optind++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 argbuffer[current_arg].arg_type = at_filename;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 argbuffer[current_arg].what = argv[optind];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 ++current_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 ++file_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1357 argbuffer[current_arg].arg_type = at_end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1358
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1359 if (help_asked)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1360 print_help (argbuffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1361 /* NOTREACHED */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1362
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 if (nincluded_files == 0 && file_count == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 error ("no input files specified.", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 suggest_asking_for_help ();
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1367 /* NOTREACHED */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 if (tagfile == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 tagfile = CTAGS ? "tags" : "TAGS";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 cwd = etags_getcwd (); /* the current working directory */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 if (cwd[strlen (cwd) - 1] != '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 char *oldcwd = cwd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 cwd = concat (oldcwd, "/", "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 free (oldcwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
1379 /* Relative file names are made relative to the current directory. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
1380 if (streq (tagfile, "-")
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
1381 || strneq (tagfile, "/dev/", 5))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 tagfiledir = cwd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 tagfiledir = absolute_dirname (tagfile, cwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 init (); /* set up boolean "functions" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1388 linebuffer_init (&lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1389 linebuffer_init (&filename_lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1390 linebuffer_init (&filebuf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1391 linebuffer_init (&token_name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 if (!CTAGS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 if (streq (tagfile, "-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 tagf = stdout;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1398 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 /* Switch redirected `stdout' to binary mode (setting `_fmode'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 doesn't take effect until after `stdout' is already open). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 if (!isatty (fileno (stdout)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 setmode (fileno (stdout), O_BINARY);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1403 #endif /* DOS_NT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 if (tagf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 pfatal (tagfile);
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
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 * Loop through files finding functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1414 for (i = 0; i < current_arg; i++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1416 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
1417 char *this_file;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1418
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 switch (argbuffer[i].arg_type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 case at_language:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1422 lang = argbuffer[i].lang;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 case at_regexp:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1425 analyse_regex (argbuffer[i].what);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 case at_filename:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 while ((this_file = gfnames (argbuffer[i].what, &got_err)) != NULL)
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 if (got_err)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 error ("can't find file %s\n", this_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 argc--, argv++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 this_file = massage_name (this_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 this_file = argbuffer[i].what;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 /* Input file named "-" means read file names from stdin
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 (one per line) and use them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 if (streq (this_file, "-"))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1446 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1447 if (parsing_stdin)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1448 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
1449 (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1450 while (readline_internal (&filename_lb, stdin) > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1451 process_file_name (filename_lb.buffer, lang);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1452 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1454 process_file_name (this_file, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 break;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1459 case at_stdin:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1460 this_file = argbuffer[i].what;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1461 process_file (stdin, this_file, lang);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1462 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1466 free_regexps ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1467 free (lb.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1468 free (filebuf.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1469 free (token_name.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1470
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1471 if (!CTAGS || cxref_style)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 {
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1473 /* Write the remaining tags to tagf (ETAGS) or stdout (CXREF). */
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1474 put_entries (nodehead);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1475 free_tree (nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1476 nodehead = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1477 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1478 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1479 fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1480
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1481 /* Output file entries that have no tags. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1482 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1483 if (!fdp->written)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1484 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
1485
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1486 while (nincluded_files-- > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1487 fprintf (tagf, "\f\n%s,include\n", *included_files++);
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1488
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1489 if (fclose (tagf) == EOF)
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1490 pfatal (tagfile);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1491 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1492
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1493 exit (EXIT_SUCCESS);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 if (update)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 char cmd[BUFSIZ];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 for (i = 0; i < current_arg; ++i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1501 switch (argbuffer[i].arg_type)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1502 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1503 case at_filename:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1504 case at_stdin:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1505 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1506 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1507 continue; /* the for loop */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1508 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 sprintf (cmd,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 tagfile, argbuffer[i].what, tagfile);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1512 if (system (cmd) != EXIT_SUCCESS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 fatal ("failed to execute shell command", (char *)NULL);
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 append_to_tagfile = TRUE;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 if (tagf == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 pfatal (tagfile);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1521 put_entries (nodehead); /* write all the tags (CTAGS) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1522 free_tree (nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1523 nodehead = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1524 if (fclose (tagf) == EOF)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1525 pfatal (tagfile);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1527 if (CTAGS)
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1528 if (append_to_tagfile || update)
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1529 {
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1530 char cmd[2*BUFSIZ+20];
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1531 /* Maybe these should be used:
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1532 setenv ("LC_COLLATE", "C", 1);
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1533 setenv ("LC_ALL", "C", 1); */
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
1534 sprintf (cmd, "sort -u -o %.*s %.*s", BUFSIZ, tagfile, BUFSIZ, tagfile);
3090
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1535 exit (system (cmd));
95be8ad778e3 [xemacs-hg @ 2005-11-24 12:37:59 by malcolmp]
malcolmp
parents: 2554
diff changeset
1536 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1537 return EXIT_SUCCESS;
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 * Return a compressor given the file name. If EXTPTR is non-zero,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 * return a pointer into FILE where the compressor-specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 * extension begins. If no compressor is found, NULL is returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 * and EXTPTR is not significant.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1546 * Idea by Vladimir Alexiev <vladimir@cs.ualberta.ca> (1998)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1548 static compressor *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 get_compressor_from_suffix (file, extptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 char *file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 char **extptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 compressor *compr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 char *slash, *suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 /* This relies on FN to be after canonicalize_filename,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1557 so we don't need to consider backslashes on DOS_NT. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 slash = etags_strrchr (file, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 suffix = etags_strrchr (file, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 if (suffix == NULL || suffix < slash)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 if (extptr != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 *extptr = suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 suffix += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 /* 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
1566 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
1567 Only the first do loop is run if not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 for (compr = compressors; compr->suffix != NULL; compr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 if (streq (compr->suffix, suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 return compr;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1573 if (!MSDOS)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1574 break; /* do it only once: not really a loop */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 if (extptr != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 *extptr = ++suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 } while (*suffix != '\0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581
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 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 * Return a language given the name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1586 static language *
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1587 get_language_from_langname (name)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
1588 const char *name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 if (name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 error ("empty language name", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 if (streq (name, lang->name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 error ("unknown language \"%s\"", name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 }
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 return NULL;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605
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 * Return a language given the interpreter name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1609 static language *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 get_language_from_interpreter (interpreter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 char *interpreter;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 char **iname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 if (interpreter == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 if (lang->interpreters != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 for (iname = lang->interpreters; *iname != NULL; iname++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 if (streq (*iname, interpreter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 return NULL;
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
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
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 * Return a language given the file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1632 static language *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1633 get_language_from_filename (file, case_sensitive)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 char *file;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1635 bool case_sensitive;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 language *lang;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1638 char **name, **ext, *suffix;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1639
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1640 /* Try whole file name first. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1641 for (lang = lang_names; lang->name != NULL; lang++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1642 if (lang->filenames != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1643 for (name = lang->filenames; *name != NULL; name++)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1644 if ((case_sensitive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1645 ? streq (*name, file)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1646 : strcaseeq (*name, file))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1647 return lang;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1648
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1649 /* If not found, try suffix after last dot. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 suffix = etags_strrchr (file, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 if (suffix == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 suffix += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 for (lang = lang_names; lang->name != NULL; lang++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 if (lang->suffixes != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 for (ext = lang->suffixes; *ext != NULL; ext++)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1657 if ((case_sensitive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1658 ? streq (*ext, suffix)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1659 : strcaseeq (*ext, suffix))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 return lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1664
428
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 * This routine is called on each file argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1668 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1669 process_file_name (file, lang)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 char *file;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1671 language *lang;
428
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 struct stat stat_buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 FILE *inf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1675 fdesc *fdp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 compressor *compr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 char *compressed_name, *uncompressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 char *ext, *real_name;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1679 int retval;
428
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 canonicalize_filename (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 if (streq (file, tagfile) && !streq (tagfile, "-"))
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 error ("skipping inclusion of %s in self.", file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 return;
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 ((compr = get_compressor_from_suffix (file, &ext)) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 compressed_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 real_name = uncompressed_name = savestr (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 real_name = compressed_name = savestr (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 uncompressed_name = savenstr (file, ext - file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1698 /* If the canonicalized uncompressed name
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1699 has already been dealt with, skip it silently. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1700 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1702 assert (fdp->infname != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1703 if (streq (uncompressed_name, fdp->infname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1704 goto cleanup;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1705 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 if (stat (real_name, &stat_buf) != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 /* Reset real_name and try with a different name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 real_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 if (compressed_name != NULL) /* try with the given suffix */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 if (stat (uncompressed_name, &stat_buf) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 real_name = uncompressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 else /* try all possible suffixes */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 for (compr = compressors; compr->suffix != NULL; compr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 compressed_name = concat (file, ".", compr->suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 if (stat (compressed_name, &stat_buf) != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1723 if (MSDOS)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1724 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1725 char *suf = compressed_name + strlen (file);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1726 size_t suflen = strlen (compr->suffix) + 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1727 for ( ; suf[1]; suf++, suflen--)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1728 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1729 memmove (suf, suf + 1, suflen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1730 if (stat (compressed_name, &stat_buf) == 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1731 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1732 real_name = compressed_name;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1733 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1734 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1735 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1736 if (real_name != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1737 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1738 } /* MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 free (compressed_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 compressed_name = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 real_name = compressed_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 if (real_name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 perror (file);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1752 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 } /* try with a different name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 if (!S_ISREG (stat_buf.st_mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 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
1759 goto cleanup;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 if (real_name == compressed_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 char *cmd = concat (compr->command, " ", real_name);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
1764 inf = (FILE *) popen (cmd, "r");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 free (cmd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 inf = fopen (real_name, "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 if (inf == NULL)
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 perror (real_name);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1772 goto cleanup;
428
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
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1775 process_file (inf, uncompressed_name, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 if (real_name == compressed_name)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1778 retval = pclose (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1780 retval = fclose (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1781 if (retval < 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1782 pfatal (file);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1783
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1784 cleanup:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1785 if (compressed_name) free (compressed_name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1786 if (uncompressed_name) free (uncompressed_name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1787 last_node = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1788 curfdp = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1789 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1790 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1791
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1792 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1793 process_file (fh, fn, lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1794 FILE *fh;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1795 char *fn;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1796 language *lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1797 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1798 static const fdesc emptyfdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1799 fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1800
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1801 /* Create a new input file description entry. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1802 fdp = xnew (1, fdesc);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1803 *fdp = emptyfdesc;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1804 fdp->next = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1805 fdp->infname = savestr (fn);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1806 fdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1807 fdp->infabsname = absolute_filename (fn, cwd);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1808 fdp->infabsdir = absolute_dirname (fn, cwd);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1809 if (filename_is_absolute (fn))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1811 /* An absolute file name. Canonicalize it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1812 fdp->taggedfname = absolute_filename (fn, NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1813 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1814 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1815 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1816 /* 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
1817 to the directory of the tags file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1818 fdp->taggedfname = relative_filename (fn, tagfiledir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1819 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1820 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
1821 fdp->prop = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1822 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
1823
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1824 fdhead = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1825 curfdp = fdhead; /* the current file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1826
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1827 find_entries (fh);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1828
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1829 /* 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
1830 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
1831 curfdp. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1832 if (!CTAGS
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1833 && curfdp->usecharno /* no #line directives in this file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1834 && !curfdp->lang->metasource)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1835 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1836 node *np, *prev;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1837
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1838 /* 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
1839 for the structure of the node tree. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1840 prev = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1841 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
1842 if (np->fdp == curfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1843 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1844
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1845 /* 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
1846 if (np != NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1848 /* 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
1849 instructions depend on this being true. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1850 assert (np->left == NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1851
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1852 assert (fdhead == curfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1853 assert (last_node->fdp == curfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1854 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
1855 free_tree (np); /* remove the written nodes */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1856 if (prev == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1857 nodehead = NULL; /* no nodes left */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1858 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1859 prev->left = NULL; /* delete the pointer to the sublist */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 * This routine sets up the boolean pseudo-functions which work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 * by setting boolean flags dependent upon the corresponding character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 * 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
1868 * 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
1869 * subscripted by the chars in "white" are set to TRUE. Thus "_wht"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 * 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
1871 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1872 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 init ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 register char *sp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 register int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 for (i = 0; i < CHARS; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 iswhite(i) = notinname(i) = begtoken(i) = intoken(i) = endtoken(i) = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 for (sp = white; *sp != '\0'; sp++) iswhite (*sp) = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 for (sp = nonam; *sp != '\0'; sp++) notinname (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1882 notinname('\0') = notinname('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 for (sp = begtk; *sp != '\0'; sp++) begtoken (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1884 begtoken('\0') = begtoken('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 for (sp = midtk; *sp != '\0'; sp++) intoken (*sp) = TRUE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1886 intoken('\0') = intoken('\n');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 for (sp = endtk; *sp != '\0'; sp++) endtoken (*sp) = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 endtoken('\0') = endtoken('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 * This routine opens the specified file and calls the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 * which finds the function and type definitions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
1895 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1896 find_entries (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 char *cp;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1900 language *lang = curfdp->lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1901 Lang_function *parser = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 /* If user specified a language, use it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 if (lang != NULL && lang->function != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1906 parser = lang->function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1909 /* 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
1910 if (parser == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1912 lang = get_language_from_filename (curfdp->infname, TRUE);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1913 if (lang != NULL && lang->function != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1914 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1915 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1916 parser = lang->function;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1917 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1920 /* 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
1921 if (parser == NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1922 && readline_internal (&lb, inf) > 0
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 && lb.len >= 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 && lb.buffer[0] == '#'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 && lb.buffer[1] == '!')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 char *lp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 /* 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
1930 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
1931 the first successive blank and terminate the string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 lp = etags_strrchr (lb.buffer+2, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 if (lp != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 lp = skip_spaces (lb.buffer + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 cp = skip_non_spaces (lp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 *cp = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 if (strlen (lp) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 lang = get_language_from_interpreter (lp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 if (lang != NULL && lang->function != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1945 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1946 parser = lang->function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1950
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 /* 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
1952 length of the first line is longer than the pipe block size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 which is unlikely. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 rewind (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1956 /* 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
1957 if (parser == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1958 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1959 lang = get_language_from_filename (curfdp->infname, FALSE);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1960 if (lang != NULL && lang->function != NULL)
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 curfdp->lang = lang;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1963 parser = lang->function;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1964 }
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
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1967 /* Else try Fortran or C. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1968 if (parser == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1970 node *old_last_node = last_node;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1971
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1972 curfdp->lang = get_language_from_langname ("fortran");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1973 find_entries (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1974
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1975 if (old_last_node == last_node)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1976 /* No Fortran entries found. Try C. */
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 /* We do not tag if rewind fails.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1979 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
1980 rewind (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1981 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
1982 find_entries (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1983 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1984 return;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1986
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1987 if (!no_line_directive
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1988 && curfdp->lang != NULL && curfdp->lang->metasource)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1989 /* 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
1990 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
1991 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
1992 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
1993 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
1994 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1995 fdesc **fdpp = &fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1996 while (*fdpp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1997 if (*fdpp != curfdp
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1998 && streq ((*fdpp)->taggedfname, curfdp->taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
1999 /* 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
2000 and all tags referring to it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2001 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2002 fdesc *badfdp = *fdpp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2003
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2004 /* Delete the tags referring to badfdp->taggedfname
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2005 that were obtained from badfdp->infname. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2006 invalidate_nodes (badfdp, &nodehead);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2007
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2008 *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
2009 free_fdesc (badfdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2010 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2011 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2012 fdpp = &(*fdpp)->next; /* advance the list pointer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2013 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2014
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2015 assert (parser != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2016
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2017 /* Generic initialisations before reading from file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2018 linebuffer_setlen (&filebuf, 0); /* reset the file buffer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2019
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2020 /* Generic initialisations before parsing file with readline. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2021 lineno = 0; /* reset global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2022 charno = 0; /* reset global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2023 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
2024
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2025 parser (inf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2026
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2027 regex_tag_multiline ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2029
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2031 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2032 * 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
2033 * then call `pfnote'.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2034 * 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
2035 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2036 * TAGS format specification
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2037 * 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
2038 * 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
2039 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2040 * 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
2041 * 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
2042 * 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
2043 * 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
2044 * one character, substring;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2045 * 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
2046 * be a character in NONAM;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2047 * 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
2048 * also be a character in NONAM.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2049 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2050 * 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
2051 * characters stored in the string `nonam'.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2052 * 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
2053 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2054 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2055 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
2056 char *name; /* tag name, or NULL if unnamed */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2057 int namelen; /* tag length */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2058 bool is_func; /* tag is a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2059 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
2060 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
2061 int lno; /* line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2062 long cno; /* character number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2063 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2064 bool named = (name != NULL && namelen > 0);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2065
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2066 if (!CTAGS && named) /* maybe set named to false */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2067 /* 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
2068 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
2069 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2070 int i;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2071 register char *cp = name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2072
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2073 for (i = 0; i < namelen; i++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2074 if (notinname (*cp++))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2075 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2076 if (i == namelen) /* rule #1 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2077 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2078 cp = linestart + linelen - namelen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2079 if (notinname (linestart[linelen-1]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2080 cp -= 1; /* rule #4 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2081 if (cp >= linestart /* rule #2 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2082 && (cp == linestart
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2083 || notinname (cp[-1])) /* rule #3 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2084 && strneq (name, cp, namelen)) /* rule #2 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2085 named = FALSE; /* use implicit tag name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2086 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2087 }
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 if (named)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2090 name = savenstr (name, namelen);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2091 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2092 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2093 pfnote (name, is_func, linestart, linelen, lno, cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2094 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2095
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 /* Record a tag. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2097 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 pfnote (name, is_func, linestart, linelen, lno, cno)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 char *name; /* tag name, or NULL if unnamed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 bool is_func; /* tag is a function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 char *linestart; /* start of the line where tag is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 int linelen; /* length of the line where tag is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 int lno; /* line number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 long cno; /* character number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2108 assert (name == NULL || name[0] != '\0');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 if (CTAGS && name == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 np = xnew (1, node);
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 /* If ctags mode, change name "main" to M<thisfilename>. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 if (CTAGS && !cxref_style && streq (name, "main"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2117 register char *fp = etags_strrchr (curfdp->taggedfname, '/');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2118 np->name = concat ("M", fp == NULL ? curfdp->taggedfname : fp + 1, "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 fp = etags_strrchr (np->name, '.');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 if (fp != NULL && fp[1] != '\0' && fp[2] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 fp[0] = '\0';
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 np->name = name;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2125 np->valid = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 np->been_warned = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2127 np->fdp = curfdp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 np->is_func = is_func;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 np->lno = lno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2130 if (np->fdp->usecharno)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2131 /* 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
2132 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
2133 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
2134 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
2135 uncomment the +1 below. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2136 np->cno = cno /* + 1 */ ;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2137 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2138 np->cno = invalidcharno;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 np->left = np->right = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 if (CTAGS && !cxref_style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 if (strlen (linestart) < 50)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2143 np->regex = concat (linestart, "$", "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2145 np->regex = savenstr (linestart, 50);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2148 np->regex = savenstr (linestart, linelen);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2149
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2150 add_node (np, &nodehead);
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 * free_tree ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 * recurse on left children, iterate on right children.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2157 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 free_tree (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 while (np)
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 register node *node_right = np->right;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 free_tree (np->left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 if (np->name != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 free (np->name);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2167 free (np->regex);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 free (np);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 np = node_right;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2174 * free_fdesc ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2175 * delete a file description
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2176 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2177 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2178 free_fdesc (fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2179 register fdesc *fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2180 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2181 if (fdp->infname != NULL) free (fdp->infname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2182 if (fdp->infabsname != NULL) free (fdp->infabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2183 if (fdp->infabsdir != NULL) free (fdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2184 if (fdp->taggedfname != NULL) free (fdp->taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2185 if (fdp->prop != NULL) free (fdp->prop);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2186 free (fdp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2187 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2188
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2189 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 * add_node ()
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2191 * 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
2192 * 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
2193 * balancing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 * 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
2196 * maintain state.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2198 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 add_node (np, cur_node_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 node *np, **cur_node_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 register int dif;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 register node *cur_node = *cur_node_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 if (cur_node == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 *cur_node_p = np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 last_node = np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 if (!CTAGS)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2213 /* Etags Mode */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2215 /* 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
2216 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
2217 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
2218 used sublist. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2219 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
2220 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2221 /* 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
2222 assert (last_node->right == NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2223 last_node->right = np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2224 last_node = np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2225 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2226 else if (cur_node->fdp == np->fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2227 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2228 /* 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
2229 good for us. Let's scan this sublist. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2230 add_node (np, &cur_node->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2231 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2232 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2233 /* 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
2234 next one. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2235 add_node (np, &cur_node->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2236 } /* if ETAGS mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2237
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 else
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 /* Ctags Mode */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 dif = strcmp (np->name, cur_node->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 * If this tag name matches an existing one, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 * do not add the node, but maybe print a warning.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 */
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2247 if (no_duplicates && !dif)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2249 if (np->fdp == cur_node->fdp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 if (!no_warnings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 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
2254 np->fdp->infname, lineno, np->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 fprintf (stderr, "Second entry ignored\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 else if (!cur_node->been_warned && !no_warnings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 fprintf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 "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
2263 np->fdp->infname, cur_node->fdp->infname, np->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 cur_node->been_warned = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 /* Actually add the node */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 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
2271 } /* if CTAGS mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2272 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2273
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2274 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2275 * invalidate_nodes ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2276 * 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
2277 * 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
2278 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2279 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2280 invalidate_nodes (badfdp, npp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2281 fdesc *badfdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2282 node **npp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2283 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2284 node *np = *npp;
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 if (np == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2287 return;
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 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2290 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2291 if (np->left != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2292 invalidate_nodes (badfdp, &np->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2293 if (np->fdp == badfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2294 np->valid = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2295 if (np->right != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2296 invalidate_nodes (badfdp, &np->right);
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 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2299 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2300 assert (np->fdp != NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2301 if (np->fdp == badfdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2302 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2303 *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
2304 np->left = NULL; /* isolate it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2305 free_tree (np); /* free it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2306 invalidate_nodes (badfdp, npp);
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 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2309 invalidate_nodes (badfdp, &np->left);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2312
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2314 static int total_size_of_entries __P((node *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2315 static int number_len __P((long));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2316
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2317 /* Length of a non-negative number's decimal representation. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 number_len (num)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 long num;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 int len = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 while ((num /= 10) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 len += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 * 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
2330 * 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
2331 * 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
2332 * but is still supplied for backward compatibility.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2334 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 total_size_of_entries (np)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 register node *np;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2338 register int total = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2339
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2340 for (; np != NULL; np = np->right)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2341 if (np->valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2342 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2343 total += strlen (np->regex) + 1; /* pat\177 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2344 if (np->name != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2345 total += strlen (np->name) + 1; /* name\001 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2346 total += number_len ((long) np->lno) + 1; /* lno, */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2347 if (np->cno != invalidcharno) /* cno */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2348 total += number_len (np->cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2349 total += 1; /* newline */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2350 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2351
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2352 return total;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2353 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2354
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2355 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2356 put_entries (np)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2357 register node *np;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2358 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2359 register char *sp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2360 static fdesc *fdp = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 if (np == NULL)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2363 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2364
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2365 /* Output subentries that precede this one */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2366 if (CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2367 put_entries (np->left);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2368
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2369 /* Output this entry */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2370 if (np->valid)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2372 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2373 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2374 /* Etags mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2375 if (fdp != np->fdp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2376 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2377 fdp = np->fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2378 fprintf (tagf, "\f\n%s,%d\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2379 fdp->taggedfname, total_size_of_entries (np));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2380 fdp->written = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2381 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2382 fputs (np->regex, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2383 fputc ('\177', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2384 if (np->name != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2385 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2386 fputs (np->name, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2387 fputc ('\001', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2388 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2389 fprintf (tagf, "%d,", np->lno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2390 if (np->cno != invalidcharno)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2391 fprintf (tagf, "%ld", np->cno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2392 fputs ("\n", tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2393 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2394 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2395 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2396 /* Ctags mode */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2397 if (np->name == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2398 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
2399
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2400 if (cxref_style)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2401 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2402 if (vgrind_style)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2403 fprintf (stdout, "%s %s %d\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2404 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
2405 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2406 fprintf (stdout, "%-16s %3d %-16s %s\n",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2407 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
2408 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2409 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2410 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2411 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
2412
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2413 if (np->is_func)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2414 { /* function or #define macro with args */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2415 putc (searchar, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2416 putc ('^', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2417
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2418 for (sp = np->regex; *sp; sp++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2419 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2420 if (*sp == '\\' || *sp == searchar)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2421 putc ('\\', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2422 putc (*sp, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2423 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2424 putc (searchar, tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2425 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2426 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2427 { /* anything else; text pattern inadequate */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2428 fprintf (tagf, "%d", np->lno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2429 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2430 putc ('\n', tagf);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2431 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2432 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2433 } /* if this node contains a valid tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2434
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2435 /* Output subentries that follow this one */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2436 put_entries (np->right);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2437 if (!CTAGS)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2438 put_entries (np->left);
428
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
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2442 /* C extensions. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2443 #define C_EXT 0x00fff /* C extensions */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2444 #define C_PLAIN 0x00000 /* C */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2445 #define C_PLPL 0x00001 /* C++ */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2446 #define C_STAR 0x00003 /* C* */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2447 #define C_JAVA 0x00005 /* JAVA */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2448 #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
2449 #define YACC 0x10000 /* yacc file */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2450
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 * The C symbol tables.
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 enum sym_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 st_none,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 st_C_objprot, st_C_objimpl, st_C_objend,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 st_C_gnumacro,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2459 st_C_ignore, st_C_attribute,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 st_C_javastruct,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 st_C_operator,
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
2462 st_C_class, st_C_template,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2463 st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2466 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
2467 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
2468 static enum sym_type C_symtype __P((char *, int, int));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2469
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 /* Feed stuff between (but not including) %[ and %] lines to:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2471 gperf -m 5
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 %[
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2473 %compare-strncmp
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2474 %enum
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2475 %struct-type
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 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
2477 %%
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2478 if, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2479 for, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2480 while, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2481 switch, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2482 return, 0, st_C_ignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2483 __attribute__, 0, st_C_attribute
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2484 @interface, 0, st_C_objprot
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2485 @protocol, 0, st_C_objprot
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2486 @implementation,0, st_C_objimpl
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2487 @end, 0, st_C_objend
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2488 import, (C_JAVA & ~C_PLPL), st_C_ignore
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2489 package, (C_JAVA & ~C_PLPL), st_C_ignore
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2490 friend, C_PLPL, st_C_ignore
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2491 extends, (C_JAVA & ~C_PLPL), st_C_javastruct
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2492 implements, (C_JAVA & ~C_PLPL), st_C_javastruct
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2493 interface, (C_JAVA & ~C_PLPL), st_C_struct
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2494 class, 0, st_C_class
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2495 namespace, C_PLPL, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2496 domain, C_STAR, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2497 union, 0, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2498 struct, 0, st_C_struct
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2499 extern, 0, st_C_extern
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2500 enum, 0, st_C_enum
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2501 typedef, 0, st_C_typedef
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2502 define, 0, st_C_define
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2503 undef, 0, st_C_define
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2504 operator, C_PLPL, st_C_operator
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2505 template, 0, st_C_template
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 # DEFUN used in emacs, the next three used in glibc (SYSCALL only for mach).
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2507 DEFUN, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2508 SYSCALL, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2509 ENTRY, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2510 PSEUDO, 0, st_C_gnumacro
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 # These are defined inside C functions, so currently they are not met.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 # EXFUN used in glibc, DEFVAR_* in emacs.
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2513 #EXFUN, 0, st_C_gnumacro
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2514 #DEFVAR_, 0, st_C_gnumacro
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 %]
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2516 and replace lines between %< and %> with its output, then:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2517 - remove the #if characterset check
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2518 - make in_word_set static and not inline. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 /*%<*/
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2520 /* C code produced by gperf version 3.0.1 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2521 /* Command-line: gperf -m 5 */
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2522 /* Computed positions: -k'2-3' */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2523
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 struct C_stab_entry { char *name; int c_ext; enum sym_type type; };
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2525 /* maximum key range = 33, duplicates = 0 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528 __inline
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2529 #else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2530 #ifdef __cplusplus
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2531 inline
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2532 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 static unsigned int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 hash (str, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 register const char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 register unsigned int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 static unsigned char asso_values[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 {
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2541 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2542 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2543 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2544 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2545 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2546 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2547 35, 35, 35, 35, 35, 35, 35, 35, 35, 15,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2548 14, 35, 35, 35, 35, 35, 35, 35, 14, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2549 35, 35, 35, 12, 13, 35, 35, 35, 35, 12,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2550 35, 35, 35, 35, 35, 1, 35, 16, 35, 6,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2551 23, 0, 0, 35, 22, 0, 35, 35, 5, 0,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2552 0, 15, 1, 35, 6, 35, 8, 19, 35, 16,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2553 4, 5, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2554 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2555 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2556 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2557 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2558 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2559 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2560 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2561 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2562 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2563 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2564 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2565 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2566 35, 35, 35, 35, 35, 35
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 };
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2568 register int hval = len;
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2569
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2570 switch (hval)
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2571 {
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2572 default:
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2573 hval += asso_values[(unsigned char)str[2]];
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2574 /*FALLTHROUGH*/
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2575 case 2:
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2576 hval += asso_values[(unsigned char)str[1]];
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2577 break;
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2578 }
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2579 return hval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 static struct C_stab_entry *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 in_word_set (str, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584 register const char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 register unsigned int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2587 enum
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2588 {
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2589 TOTAL_KEYWORDS = 32,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2590 MIN_WORD_LENGTH = 2,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2591 MAX_WORD_LENGTH = 15,
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2592 MIN_HASH_VALUE = 2,
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2593 MAX_HASH_VALUE = 34
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2594 };
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2595
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 static struct C_stab_entry wordlist[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 {
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2598 {""}, {""},
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2599 {"if", 0, st_C_ignore},
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2600 {""},
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2601 {"@end", 0, st_C_objend},
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2602 {"union", 0, st_C_struct},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2603 {"define", 0, st_C_define},
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2604 {"import", (C_JAVA & ~C_PLPL), st_C_ignore},
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2605 {"template", 0, st_C_template},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2606 {"operator", C_PLPL, st_C_operator},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2607 {"@interface", 0, st_C_objprot},
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2608 {"implements", (C_JAVA & ~C_PLPL), st_C_javastruct},
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2609 {"friend", C_PLPL, st_C_ignore},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2610 {"typedef", 0, st_C_typedef},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2611 {"return", 0, st_C_ignore},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2612 {"@implementation",0, st_C_objimpl},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2613 {"@protocol", 0, st_C_objprot},
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2614 {"interface", (C_JAVA & ~C_PLPL), st_C_struct},
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2615 {"extern", 0, st_C_extern},
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2616 {"extends", (C_JAVA & ~C_PLPL), st_C_javastruct},
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2617 {"struct", 0, st_C_struct},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2618 {"domain", C_STAR, st_C_struct},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2619 {"switch", 0, st_C_ignore},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2620 {"enum", 0, st_C_enum},
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2621 {"for", 0, st_C_ignore},
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2622 {"namespace", C_PLPL, st_C_struct},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2623 {"class", 0, st_C_class},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2624 {"while", 0, st_C_ignore},
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2625 {"undef", 0, st_C_define},
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
2626 {"package", (C_JAVA & ~C_PLPL), st_C_ignore},
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2627 {"__attribute__", 0, st_C_attribute},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2628 {"SYSCALL", 0, st_C_gnumacro},
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
2629 {"ENTRY", 0, st_C_gnumacro},
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2630 {"PSEUDO", 0, st_C_gnumacro},
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2631 {"DEFUN", 0, st_C_gnumacro}
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634 if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 register int key = hash (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 if (key <= MAX_HASH_VALUE && key >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 register const char *s = wordlist[key].name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2642 if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 return &wordlist[key];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 return 0;
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 /*%>*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 static enum sym_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 C_symtype (str, len, c_ext)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 char *str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 int c_ext;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 register struct C_stab_entry *se = in_word_set (str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 if (se == NULL || (se->c_ext && !(c_ext & se->c_ext)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 return st_none;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 return se->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2662
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2664 /*
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2665 * Ignoring __attribute__ ((list))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2666 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2667 static bool inattribute; /* looking at an __attribute__ construct */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2668
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2669 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2670 * C functions and variables are recognized using a simple
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2671 * finite automaton. fvdef is its state variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2672 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2673 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 fvnone, /* nothing seen */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2676 fdefunkey, /* Emacs DEFUN keyword seen */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2677 fdefunname, /* Emacs DEFUN name seen */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 foperator, /* func: operator keyword seen (cplpl) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 fvnameseen, /* function or variable name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 fstartlist, /* func: just after open parenthesis */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 finlist, /* func: in parameter list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 flistseen, /* func: after parameter list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 fignore, /* func: before open brace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 vignore /* var-like: ignore until ';' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 } fvdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2687 static bool fvextern; /* func or var: extern keyword seen; */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2689 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2690 * typedefs are recognized using a simple finite automaton.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2691 * typdef is its state variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2692 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2693 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 tnone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696 tkeyseen, /* typedef keyword seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 ttypeseen, /* defined type seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 tinbody, /* inside typedef body */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 tend, /* just before typedef tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 tignore /* junk after typedef tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 } typdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2703 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2704 * struct-like structures (enum, struct and union) are recognized
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2705 * using another simple finite automaton. `structdef' is its state
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2706 * variable.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2707 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2708 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2710 snone, /* nothing seen yet,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2711 or in struct body if bracelev > 0 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 skeyseen, /* struct-like keyword seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 stagseen, /* struct-like tag seen */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2714 scolonseen /* colon seen after struct-like tag */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 } structdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 * 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
2719 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2720 static char *objtag = "<uninited>";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 * Yet another little state machine to deal with preprocessor lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2725 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 dnone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 dsharpseen, /* '#' seen as first char on line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 ddefineseen, /* '#' and 'define' seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 dignorerest /* ignore rest of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 } definedef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 * State machine for Objective C protocols and implementations.
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2735 * Idea by Tom R.Hageman <tom@basil.icce.rug.nl> (1995)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2737 static enum
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 onone, /* nothing seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 oprotocol, /* @interface or @protocol seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 oimplementation, /* @implementations seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 otagseen, /* class name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 oparenseen, /* parenthesis before category seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 ocatseen, /* category name seen */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745 oinbody, /* in @implementation body */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 omethodsign, /* in @implementation body, after +/- */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 omethodtag, /* after method name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 omethodcolon, /* after method colon */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 omethodparm, /* after method parameter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 oignore /* wait for @end */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 } objdef;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 * 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
2756 * 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
2757 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2758 static struct tok
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2760 char *line; /* string containing the token */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2761 int offset; /* where the token starts in LINE */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2762 int length; /* token length */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2763 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2764 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
2765 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
2766 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
2767 tag.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2768 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2769 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
2770 invalidated whenever a state machine is
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2771 reset prematurely */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2772 bool named; /* create a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2773 int lineno; /* source line number of tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2774 long linepos; /* source char number of tag */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2775 } token; /* latest token read */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2778 * Variables and functions for dealing with nested structures.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2779 * Idea by Mykola Dzyuba <mdzyuba@yahoo.com> (2001)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2781 static void pushclass_above __P((int, char *, int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2782 static void popclass_above __P((int));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2783 static void write_classname __P((linebuffer *, char *qualifier));
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2784
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2785 static struct {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2786 char **cname; /* nested class names */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2787 int *bracelev; /* nested class brace level */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2788 int nl; /* class nesting level (elements used) */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2789 int size; /* length of the array */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2790 } cstack; /* stack for nested declaration tags */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2791 /* Current struct nesting depth (namespace, class, struct, union, enum). */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2792 #define nestlev (cstack.nl)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
2793 /* 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
2794 #define instruct (structdef == snone && nestlev > 0 \
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2795 && bracelev == cstack.bracelev[nestlev-1] + 1)
458
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 static void
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2798 pushclass_above (bracelev, str, len)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2799 int bracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2800 char *str;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2801 int len;
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 int nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2804
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2805 popclass_above (bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2806 nl = cstack.nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2807 if (nl >= cstack.size)
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 int size = cstack.size *= 2;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2810 xrnew (cstack.cname, size, char *);
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2811 xrnew (cstack.bracelev, size, int);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2812 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2813 assert (nl == 0 || cstack.bracelev[nl-1] < bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2814 cstack.cname[nl] = (str == NULL) ? NULL : savenstr (str, len);
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2815 cstack.bracelev[nl] = bracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2816 cstack.nl = nl + 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2817 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2818
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2819 static void
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2820 popclass_above (bracelev)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2821 int bracelev;
458
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 int nl;
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 for (nl = cstack.nl - 1;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2826 nl >= 0 && cstack.bracelev[nl] >= bracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2827 nl--)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2828 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2829 if (cstack.cname[nl] != NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2830 free (cstack.cname[nl]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2831 cstack.nl = nl;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2832 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2833 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2834
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2835 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2836 write_classname (cn, qualifier)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2837 linebuffer *cn;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2838 char *qualifier;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2839 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2840 int i, len;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2841 int qlen = strlen (qualifier);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2842
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2843 if (cstack.nl == 0 || cstack.cname[0] == NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2844 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2845 len = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2846 cn->len = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2847 cn->buffer[0] = '\0';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2848 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2849 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2850 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2851 len = strlen (cstack.cname[0]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2852 linebuffer_setlen (cn, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2853 strcpy (cn->buffer, cstack.cname[0]);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2854 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2855 for (i = 1; i < cstack.nl; i++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2856 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2857 char *s;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2858 int slen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2859
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2860 s = cstack.cname[i];
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2861 if (s == NULL)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2862 continue;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2863 slen = strlen (s);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2864 len += slen + qlen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2865 linebuffer_setlen (cn, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2866 strncat (cn->buffer, qualifier, qlen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2867 strncat (cn->buffer, s, slen);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2868 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2869 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2870
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2871
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
2872 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
2873 static void make_C_tag __P((bool));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2874
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876 * consider_token ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 * 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
2878 * function or variable, or corresponds to a typedef, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 * is a struct/union/enum tag, or #define, or an enum constant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 * *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
2882 * 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
2883 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 * Globals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 * fvdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 * structdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 * definedef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 * typdef IN OUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 * objdef IN OUT
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 static bool
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2893 consider_token (str, len, c, c_extp, bracelev, parlev, is_func_or_var)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 register char *str; /* IN: token pointer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 register int len; /* IN: token length */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
2896 register int c; /* IN: first char after the token */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2897 int *c_extp; /* IN, OUT: C extensions mask */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2898 int bracelev; /* IN: brace level */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 int parlev; /* IN: parenthesis level */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 bool *is_func_or_var; /* OUT: function or variable found */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2902 /* When structdef is stagseen, scolonseen, or snone with bracelev > 0,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2903 structtype is the type of the preceding struct-like keyword, and
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2904 structbracelev is the brace level where it has been seen. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2905 static enum sym_type structtype;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2906 static int structbracelev;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2907 static enum sym_type toktype;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2908
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2909
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
2910 toktype = C_symtype (str, len, *c_extp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 /*
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2913 * Skip __attribute__
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2915 if (toktype == st_C_attribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2917 inattribute = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 return FALSE;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2919 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2920
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2921 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2922 * Advance the definedef state machine.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2923 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2924 switch (definedef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2925 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2926 case dnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2927 /* We're not on a preprocessor line. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2928 if (toktype == st_C_gnumacro)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2929 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2930 fvdef = fdefunkey;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2931 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2932 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2933 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2934 case dsharpseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2935 if (toktype == st_C_define)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2936 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2937 definedef = ddefineseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2938 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2939 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2940 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2941 definedef = dignorerest;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2942 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2943 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2944 case ddefineseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2945 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2946 * Make a tag for any macro, unless it is a constant
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2947 * and constantypedefs is FALSE.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2948 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2949 definedef = dignorerest;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2950 *is_func_or_var = (c == '(');
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2951 if (!*is_func_or_var && !constantypedefs)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2952 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2953 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2954 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2955 case dignorerest:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2956 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2957 default:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2958 error ("internal error: definedef value.", (char *)NULL);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2959 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2960
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2961 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2962 * Now typedefs
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2963 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2964 switch (typdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2965 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2966 case tnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2967 if (toktype == st_C_typedef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2968 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2969 if (typedefs)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2970 typdef = tkeyseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2971 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2972 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2973 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2974 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2975 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2976 case tkeyseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2977 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2978 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2979 case st_none:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2980 case st_C_class:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2981 case st_C_struct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2982 case st_C_enum:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2983 typdef = ttypeseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2984 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2985 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2986 case ttypeseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2987 if (structdef == snone && fvdef == fvnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2988 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2989 fvdef = fvnameseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2990 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2991 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2992 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2993 case tend:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2994 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2995 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2996 case st_C_class:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2997 case st_C_struct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2998 case st_C_enum:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
2999 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3000 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3001 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3002 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3003
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3004 /*
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3005 * This structdef business is NOT invoked when we are ctags and the
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3006 * file is plain C. This is because a struct tag may have the same
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3007 * name as another tag, and this loses with ctags.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3008 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3009 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3010 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3011 case st_C_javastruct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3012 if (structdef == stagseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3013 structdef = scolonseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3014 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3015 case st_C_template:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3016 case st_C_class:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3017 if ((*c_extp & C_AUTO) /* automatic detection of C++ language */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3018 && bracelev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3019 && definedef == dnone && structdef == snone
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3020 && typdef == tnone && fvdef == fvnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3021 *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3022 if (toktype == st_C_template)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3023 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3024 /* FALLTHRU */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3025 case st_C_struct:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3026 case st_C_enum:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3027 if (parlev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3028 && fvdef != vignore
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3029 && (typdef == tkeyseen
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3030 || (typedefs_or_cplusplus && structdef == snone)))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3031 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3032 structdef = skeyseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3033 structtype = toktype;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3034 structbracelev = bracelev;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3035 if (fvdef == fvnameseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3036 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3037 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3038 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3039 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3040
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3041 if (structdef == skeyseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3042 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3043 structdef = stagseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3044 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3045 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3046
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3047 if (typdef != tnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3048 definedef = dnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3049
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3050 /* Detect Objective C constructs. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3051 switch (objdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3052 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3053 case onone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3054 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3055 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3056 case st_C_objprot:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3057 objdef = oprotocol;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3058 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3059 case st_C_objimpl:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3060 objdef = oimplementation;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3061 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3062 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3063 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3064 case oimplementation:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3065 /* Save the class tag for functions or variables defined inside. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3066 objtag = savenstr (str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3067 objdef = oinbody;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3068 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3069 case oprotocol:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3070 /* Save the class tag for categories. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3071 objtag = savenstr (str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3072 objdef = otagseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3073 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3074 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3075 case oparenseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3076 objdef = ocatseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3077 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3078 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3079 case oinbody:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3080 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3081 case omethodsign:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3082 if (parlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3083 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3084 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3085 objdef = omethodtag;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3086 linebuffer_setlen (&token_name, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3087 strncpy (token_name.buffer, str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3088 token_name.buffer[len] = '\0';
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3089 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3090 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3091 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3092 case omethodcolon:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3093 if (parlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3094 objdef = omethodparm;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3095 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3096 case omethodparm:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3097 if (parlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3098 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3099 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3100 objdef = omethodtag;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3101 linebuffer_setlen (&token_name, token_name.len + len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3102 strncat (token_name.buffer, str, len);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3103 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3104 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3105 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3106 case oignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3107 if (toktype == st_C_objend)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3108 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3109 /* Memory leakage here: the string pointed by objtag is
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3110 never released, because many tests would be needed to
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3111 avoid breaking on incorrect input code. The amount of
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3112 memory leaked here is the sum of the lengths of the
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3113 class tags.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3114 free (objtag); */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3115 objdef = onone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3116 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3117 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3118 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3119
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3120 /* A function, variable or enum constant? */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3121 switch (toktype)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3122 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3123 case st_C_extern:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3124 fvextern = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3125 switch (fvdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3126 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3127 case finlist:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3128 case flistseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3129 case fignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3130 case vignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3131 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3132 default:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3133 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3134 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3135 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3136 case st_C_ignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3137 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3138 fvdef = vignore;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3139 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3140 case st_C_operator:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3141 fvdef = foperator;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3142 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3143 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3144 case st_none:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3145 if (constantypedefs
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3146 && structdef == snone
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3147 && structtype == st_C_enum && bracelev > structbracelev)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3148 return TRUE; /* enum constant */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3149 switch (fvdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3150 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3151 case fdefunkey:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3152 if (bracelev > 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3153 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3154 fvdef = fdefunname; /* GNU macro */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3155 *is_func_or_var = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3156 return TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3157 case fvnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3158 switch (typdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3159 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3160 case ttypeseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3161 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3162 case tnone:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3163 if ((strneq (str, "asm", 3) && endtoken (str[3]))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3164 || (strneq (str, "__asm__", 7) && endtoken (str[7])))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3165 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3166 fvdef = vignore;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3167 return FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3168 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3169 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3170 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3171 /* FALLTHRU */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3172 case fvnameseen:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3173 if (len >= 10 && strneq (str+len-10, "::operator", 10))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3174 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3175 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
3176 *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3177 fvdef = foperator;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3178 *is_func_or_var = TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3179 return TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3180 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3181 if (bracelev > 0 && !instruct)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3182 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 fvdef = fvnameseen; /* function or variable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 *is_func_or_var = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 return FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3193
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3195 * 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
3196 * the line currently read. By keeping two line buffers, and switching
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3197 * 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
3198 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3199 static struct
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3200 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3201 long linepos;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3202 linebuffer lb;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3203 } lbs[2];
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3204
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 #define current_lb_is_new (newndx == curndx)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 #define switch_line_buffers() (curndx = 1 - curndx)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 #define curlb (lbs[curndx].lb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 #define newlb (lbs[newndx].lb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 #define curlinepos (lbs[curndx].linepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 #define newlinepos (lbs[newndx].linepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3213 #define plainc ((c_ext & C_EXT) == C_PLAIN)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3214 #define cplpl (c_ext & C_PLPL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3215 #define cjava ((c_ext & C_JAVA) == C_JAVA)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3216
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 #define CNL_SAVE_DEFINEDEF() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 curlinepos = charno; \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3220 readline (&curlb, inf); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3221 lp = curlb.buffer; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 quotednl = FALSE; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 newndx = curndx; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 #define CNL() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228 CNL_SAVE_DEFINEDEF(); \
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3229 if (savetoken.valid) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230 { \
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3231 token = savetoken; \
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3232 savetoken.valid = FALSE; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 definedef = dnone; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 } while (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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 make_C_tag (isfun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 bool isfun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 {
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
3242 /* This function is never called when token.valid is FALSE, but
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 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
3244 if (!DEBUG && !token.valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3245 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3246
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3247 if (token.valid)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3248 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
3249 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
3250 else /* this case is optimised away if !DEBUG */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3251 make_tag (concat ("INVALID TOKEN:-->", token_name.buffer, ""),
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3252 token_name.len + 17, isfun, token.line,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3253 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
3254
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3255 token.valid = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3259 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3260 * C_entries ()
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3261 * This routine finds functions, variables, typedefs,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3262 * #define's, enum constants and struct/union/enum definitions in
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3263 * C syntax and adds them to the list.
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3264 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3265 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 C_entries (c_ext, inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 int c_ext; /* extension of C */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 FILE *inf; /* input file */
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 register char c; /* latest char read; '\0' for end of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 register char *lp; /* pointer one beyond the character `c' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 int curndx, newndx; /* indices for current and new lb */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273 register int tokoff; /* offset in line of start of current token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 register int toklen; /* length of current token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 char *qualifier; /* string used to qualify names */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 int qlen; /* length of qualifier */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3277 int bracelev; /* current brace level */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3278 int bracketlev; /* current bracket level */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 int parlev; /* current parenthesis level */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3280 int attrparlev; /* __attribute__ parenthesis level */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3281 int templatelev; /* current template level */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3282 int typdefbracelev; /* bracelev where a typedef struct body begun */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 bool incomm, inquote, inchar, quotednl, midtoken;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3284 bool yacc_rules; /* in the rules part of a yacc file */
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
3285 struct tok savetoken = {0}; /* token saved during preprocessor handling */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3286
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3287
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3288 linebuffer_init (&lbs[0].lb);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3289 linebuffer_init (&lbs[1].lb);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3290 if (cstack.size == 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3291 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3292 cstack.size = (DEBUG) ? 1 : 4;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3293 cstack.nl = 0;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3294 cstack.cname = xnew (cstack.size, char *);
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3295 cstack.bracelev = xnew (cstack.size, int);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3296 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3298 tokoff = toklen = typdefbracelev = 0; /* keep compiler quiet */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 curndx = newndx = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 lp = curlb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 *lp = 0;
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 fvdef = fvnone; fvextern = FALSE; typdef = tnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 structdef = snone; definedef = dnone; objdef = onone;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3305 yacc_rules = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 midtoken = inquote = inchar = incomm = quotednl = FALSE;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3307 token.valid = savetoken.valid = FALSE;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3308 bracelev = bracketlev = parlev = attrparlev = templatelev = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 if (cjava)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 { qualifier = "."; qlen = 1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 { qualifier = "::"; qlen = 2; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3314
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 while (!feof (inf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 c = *lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 if (c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3320 /* If we are at the end of the line, the next character is a
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3321 '\0'; do not skip it, because it is what tells us
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322 to read the next line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323 if (*lp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325 quotednl = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328 lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 c = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 else if (incomm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 case '*':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 if (*lp == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 c = *lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339 incomm = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 /* Newlines inside comments do not end macro definitions in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 traditional cpp. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345 CNL_SAVE_DEFINEDEF ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3346 break;
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 continue;
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 else if (inquote)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 case '"':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 /* Newlines inside strings do not end macro definitions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359 in traditional cpp, even though compilers don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 usually accept them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 CNL_SAVE_DEFINEDEF ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366 else if (inchar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371 /* Hmmm, something went wrong. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 CNL ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 case '\'':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 inchar = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3380 else if (bracketlev > 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3381 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3382 switch (c)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3383 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3384 case ']':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3385 if (--bracketlev > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 continue;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3387 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3388 case '\0':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3389 CNL_SAVE_DEFINEDEF ();
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3390 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3391 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3392 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3393 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3394 else switch (c)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3395 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3396 case '"':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3397 inquote = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3398 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3399 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3400 switch (fvdef)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3401 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3402 case fdefunkey:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3403 case fstartlist:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3404 case finlist:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3405 case fignore:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3406 case vignore:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3408 default:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3409 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3410 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3411 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3412 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3413 case '\'':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3414 inchar = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3415 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3416 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3417 if (fvdef != finlist && fvdef != fignore && fvdef !=vignore)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3418 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3419 fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3420 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3421 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3422 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3423 case '/':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3424 if (*lp == '*')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3425 {
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
3426 incomm = TRUE;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3427 lp++;
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
3428 c = ' ';
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3429 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3430 else if (/* cplpl && */ *lp == '/')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3431 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3432 c = '\0';
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3433 }
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
3434 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3435 case '%':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3436 if ((c_ext & YACC) && *lp == '%')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3437 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3438 /* Entering or exiting rules section in yacc file. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3439 lp++;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3440 definedef = dnone; fvdef = fvnone; fvextern = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3441 typdef = tnone; structdef = snone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3442 midtoken = inquote = inchar = incomm = quotednl = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3443 bracelev = 0;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3444 yacc_rules = !yacc_rules;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3445 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3446 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3447 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3448 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3449 case '#':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3450 if (definedef == dnone)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3451 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3452 char *cp;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3453 bool cpptoken = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3454
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3455 /* Look back on this line. If all blanks, or nonblanks
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3456 followed by an end of comment, this is a preprocessor
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3457 token. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3458 for (cp = newlb.buffer; cp < lp-1; cp++)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3459 if (!iswhite (*cp))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3460 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3461 if (*cp == '*' && *(cp+1) == '/')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3462 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3463 cp++;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3464 cpptoken = TRUE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3465 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3466 else
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3467 cpptoken = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3468 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3469 if (cpptoken)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3470 definedef = dsharpseen;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3471 } /* if (definedef == dnone) */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3472 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3473 case '[':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3474 bracketlev++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 continue;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3476 } /* switch (c) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3479 /* Consider token only if some involved conditions are satisfied. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3480 if (typdef != tignore
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 && definedef != dignorerest
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3482 && fvdef != finlist
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3483 && templatelev == 0
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3484 && (definedef != dnone
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3485 || structdef != scolonseen)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3486 && !inattribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 if (midtoken)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 if (endtoken (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3492 if (c == ':' && *lp == ':' && begtoken (lp[1]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3493 /* This handles :: in the middle,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3494 but not at the beginning of an identifier.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3495 Also, space-separated :: is not recognised. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3497 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
3498 c_ext = (c_ext | C_PLPL) & ~C_AUTO;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 lp += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 toklen += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501 c = lp[-1];
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3502 goto still_in_token;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3506 bool funorvar = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3507
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508 if (yacc_rules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 || consider_token (newlb.buffer + tokoff, toklen, c,
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3510 &c_ext, bracelev, parlev,
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3511 &funorvar))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 if (fvdef == foperator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 char *oldlp = lp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 lp = skip_spaces (lp-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517 if (*lp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 while (*lp != '\0'
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
3520 && !iswhite (*lp) && *lp != '(')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 lp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 c = *lp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 toklen += lp - oldlp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3525 token.named = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3526 if (!plainc
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3527 && nestlev > 0 && definedef == dnone)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3528 /* in struct body */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3530 write_classname (&token_name, qualifier);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3531 linebuffer_setlen (&token_name,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3532 token_name.len+qlen+toklen);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533 strcat (token_name.buffer, qualifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 strncat (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 newlb.buffer + tokoff, toklen);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3536 token.named = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 else if (objdef == ocatseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 /* Objective C category */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 int len = strlen (objtag) + 2 + toklen;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3542 linebuffer_setlen (&token_name, len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543 strcpy (token_name.buffer, objtag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 strcat (token_name.buffer, "(");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 strncat (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 newlb.buffer + tokoff, toklen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 strcat (token_name.buffer, ")");
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3548 token.named = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 else if (objdef == omethodtag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 || objdef == omethodparm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 /* Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3554 token.named = TRUE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3555 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3556 else if (fvdef == fdefunname)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3557 /* GNU DEFUN and similar macros */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3558 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3559 bool defun = (newlb.buffer[tokoff] == 'F');
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3560 int off = tokoff;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3561 int len = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3562
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3563 /* Rewrite the tag so that emacs lisp DEFUNs
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3564 can be found by their elisp name */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3565 if (defun)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3566 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3567 off += 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3568 len -= 1;
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 linebuffer_setlen (&token_name, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3571 strncpy (token_name.buffer,
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3572 newlb.buffer + off, len);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3573 token_name.buffer[len] = '\0';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3574 if (defun)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3575 while (--len >= 0)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3576 if (token_name.buffer[len] == '_')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3577 token_name.buffer[len] = '-';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3578 token.named = defun;
428
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3582 linebuffer_setlen (&token_name, toklen);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 strncpy (token_name.buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 newlb.buffer + tokoff, toklen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 token_name.buffer[toklen] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 /* Name macros and members. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3587 token.named = (structdef == stagseen
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3588 || typdef == ttypeseen
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3589 || typdef == tend
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3590 || (funorvar
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3591 && definedef == dignorerest)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3592 || (funorvar
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3593 && definedef == dnone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3594 && structdef == snone
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3595 && bracelev > 0));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3597 token.lineno = lineno;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3598 token.offset = tokoff;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3599 token.length = toklen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3600 token.line = newlb.buffer;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3601 token.linepos = newlinepos;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3602 token.valid = TRUE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 if (definedef == dnone
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605 && (fvdef == fvnameseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 || fvdef == foperator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607 || structdef == stagseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 || typdef == tend
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3609 || typdef == ttypeseen
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610 || objdef != onone))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 if (current_lb_is_new)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 switch_line_buffers ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3615 else if (definedef != dnone
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3616 || fvdef == fdefunname
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3617 || instruct)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 make_C_tag (funorvar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3620 else /* not yacc and consider_token failed */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3621 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3622 if (inattribute && fvdef == fignore)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3623 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3624 /* We have just met __attribute__ after a
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3625 function parameter list: do not tag the
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3626 function again. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3627 fvdef = fvnone;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3628 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3629 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3630 midtoken = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 } /* if (endtoken (c)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633 else if (intoken (c))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3634 still_in_token:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3636 toklen++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639 } /* if (midtoken) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 else if (begtoken (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642 switch (definedef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3643 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3644 case dnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647 case fstartlist:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3648 /* This prevents tagging fb in
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3649 void (__attribute__((noreturn)) *fb) (void);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3650 Fixing this is not easy and not very important. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651 fvdef = finlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653 case flistseen:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3654 if (plainc || declarations)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3655 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3656 make_C_tag (TRUE); /* a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3657 fvdef = fignore;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3658 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661 if (structdef == stagseen && !cjava)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3662 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3663 popclass_above (bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3664 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3665 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667 case dsharpseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3668 savetoken = token;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3669 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671 if (!yacc_rules || lp == newlb.buffer + 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 tokoff = lp - 1 - newlb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 toklen = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 midtoken = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 } /* if (begtoken) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 } /* if must look at token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680
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 /* Detect end of line, colon, comma, semicolon and various braces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683 after having handled a token.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 case ':':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3687 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3688 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3689 if (yacc_rules && token.offset == 0 && token.valid)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3690 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3691 make_C_tag (FALSE); /* a yacc function */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3692 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3693 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698 case otagseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3699 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 objdef = omethodcolon;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3705 linebuffer_setlen (&token_name, token_name.len + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 strcat (token_name.buffer, ":");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3707 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709 if (structdef == stagseen)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3710 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3711 structdef = scolonseen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3712 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3713 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3714 /* 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
3715 if (cplpl && fvdef == flistseen)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3716 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3717 make_C_tag (TRUE); /* a function */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3718 fvdef = fignore;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3719 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3720 }
428
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 ';':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3723 if (definedef != dnone || inattribute)
428
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 switch (typdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3727 case tend:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3728 case ttypeseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3729 make_C_tag (FALSE); /* a typedef */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3730 typdef = tnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3731 fvdef = fvnone;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3733 case tnone:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3734 case tinbody:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3735 case tignore:
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 fignore:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3739 if (typdef == tignore || cplpl)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3740 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3741 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3742 case fvnameseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3743 if ((globals && bracelev == 0 && (!fvextern || declarations))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3744 || (members && instruct))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3745 make_C_tag (FALSE); /* a variable */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3746 fvextern = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3747 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3748 token.valid = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3749 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3750 case flistseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3751 if ((declarations
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3752 && (cplpl || !instruct)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3753 && (typdef == tnone || (typdef != tignore && instruct)))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3754 || (members
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3755 && plainc && instruct))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3756 make_C_tag (TRUE); /* a function */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3757 /* FALLTHRU */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3758 default:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3759 fvextern = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3760 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3761 if (declarations
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3762 && cplpl && structdef == stagseen)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3763 make_C_tag (FALSE); /* forward declaration */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3764 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3765 token.valid = FALSE;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3766 } /* switch (fvdef) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 default:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3769 if (!instruct)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3770 typdef = tnone;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 if (structdef == stagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 structdef = snone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 case ',':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3776 if (definedef != dnone || inattribute)
428
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 switch (objdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782 make_C_tag (TRUE); /* an Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 objdef = oinbody;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3788 case fdefunkey:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 case foperator:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3790 case fstartlist:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3795 case fdefunname:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3796 fvdef = fignore;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3797 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3798 case fvnameseen:
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3799 if (parlev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3800 && ((globals
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3801 && bracelev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3802 && templatelev == 0
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3803 && (!fvextern || declarations))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3804 || (members && instruct)))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3805 make_C_tag (FALSE); /* a variable */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3806 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3807 case flistseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3808 if ((declarations && typdef == tnone && !instruct)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3809 || (members && typdef != tignore && instruct))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3810 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3811 make_C_tag (TRUE); /* a function */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3812 fvdef = fvnameseen;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3813 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3814 else if (!declarations)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3815 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3816 token.valid = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 if (structdef == stagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 structdef = snone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823 break;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3824 case ']':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3825 if (definedef != dnone || inattribute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3827 if (structdef == stagseen)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3828 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3829 switch (typdef)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3831 case ttypeseen:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3832 case tend:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3833 typdef = tignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3834 make_C_tag (FALSE); /* a typedef */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3836 case tnone:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3837 case tinbody:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3838 switch (fvdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3839 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3840 case foperator:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3841 case finlist:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3842 case fignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3843 case vignore:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3844 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3845 case fvnameseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3846 if ((members && bracelev == 1)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3847 || (globals && bracelev == 0
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3848 && (!fvextern || declarations)))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3849 make_C_tag (FALSE); /* a variable */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3850 /* FALLTHRU */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3851 default:
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3852 fvdef = fvnone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3853 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3854 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3855 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857 case '(':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3858 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3859 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3860 attrparlev++;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3861 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3862 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863 if (definedef != dnone)
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 if (objdef == otagseen && parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 objdef = oparenseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3868 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3869 case fvnameseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3870 if (typdef == ttypeseen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3871 && *lp != '*'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3872 && !instruct)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874 /* This handles constructs like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 typedef void OperatorFun (int fun); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3876 make_C_tag (FALSE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3877 typdef = tignore;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3878 fvdef = fignore;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3879 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883 fvdef = fstartlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 case flistseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886 fvdef = finlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889 parlev++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891 case ')':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3892 if (inattribute)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3893 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3894 if (--attrparlev == 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3895 inattribute = FALSE;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3896 break;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3897 }
428
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 if (objdef == ocatseen && parlev == 1)
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 make_C_tag (TRUE); /* an Objective C category */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3903 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3904 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3905 if (--parlev == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3906 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3907 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3908 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3909 case fstartlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3910 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3911 fvdef = flistseen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3912 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3913 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3914 if (!instruct
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3915 && (typdef == tend
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3916 || typdef == ttypeseen))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3917 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3918 typdef = tignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3919 make_C_tag (FALSE); /* a typedef */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3920 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3921 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3922 else if (parlev < 0) /* can happen due to ill-conceived #if's. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3923 parlev = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3924 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3925 case '{':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3926 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3928 if (typdef == ttypeseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929 {
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3930 /* Whenever typdef is set to tinbody (currently only
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3931 here), typdefbracelev should be set to bracelev. */
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
3932 typdef = tinbody;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3933 typdefbracelev = bracelev;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3935 switch (fvdef)
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 case flistseen:
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3938 make_C_tag (TRUE); /* a function */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3939 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3940 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3941 fvdef = fvnone;
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 case fvnone:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3944 switch (objdef)
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 otagseen:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3950 case omethodtag:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3951 case omethodparm:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952 make_C_tag (TRUE); /* an Objective C method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 objdef = oinbody;
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 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956 /* Neutralize `extern "C" {' grot. */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3957 if (bracelev == 0 && structdef == snone && nestlev == 0
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3958 && typdef == tnone)
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3959 bracelev = -1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3960 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3961 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3963 switch (structdef)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3964 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3965 case skeyseen: /* unnamed struct */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3966 pushclass_above (bracelev, NULL, 0);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3967 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3968 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3969 case stagseen: /* named struct or enum */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3970 case scolonseen: /* a class */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3971 pushclass_above (bracelev,token.line+token.offset, token.length);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3972 structdef = snone;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3973 make_C_tag (FALSE); /* a struct or enum */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3974 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
3975 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3976 bracelev++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3977 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3978 case '*':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3979 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3980 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3981 if (fvdef == fstartlist)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3982 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3983 fvdef = fvnone; /* avoid tagging `foo' in `foo (*bar()) ()' */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3984 token.valid = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3985 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3986 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987 case '}':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 break;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3990 if (!ignoreindent && lp == newlb.buffer + 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3991 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3992 if (bracelev != 0)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3993 token.valid = FALSE;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3994 bracelev = 0; /* reset brace level if first column */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995 parlev = 0; /* also reset paren level, just in case... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 }
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3997 else if (bracelev > 0)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
3998 bracelev--;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
3999 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4000 token.valid = FALSE; /* something gone amiss, token unreliable */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4001 popclass_above (bracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4002 structdef = snone;
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4003 /* Only if typdef == tinbody is typdefbracelev significant. */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4004 if (typdef == tinbody && bracelev <= typdefbracelev)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4006 assert (bracelev == typdefbracelev);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4007 typdef = tend;
428
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 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010 case '=':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 switch (fvdef)
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 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 case fvnameseen:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4021 if ((members && bracelev == 1)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4022 || (globals && bracelev == 0 && (!fvextern || declarations)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023 make_C_tag (FALSE); /* a variable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4024 /* FALLTHRU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026 fvdef = vignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 break;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4029 case '<':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4030 if (cplpl
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4031 && (structdef == stagseen || fvdef == fvnameseen))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4032 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4033 templatelev++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4034 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4035 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4036 goto resetfvdef;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4037 case '>':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4038 if (templatelev > 0)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4039 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4040 templatelev--;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4041 break;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4042 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4043 goto resetfvdef;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 case '+':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045 case '-':
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4046 if (objdef == oinbody && bracelev == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 objdef = omethodsign;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 break;
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 /* FALLTHRU */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4052 resetfvdef:
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4053 case '#': case '~': case '&': case '%': case '/':
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
4054 case '|': case '^': case '!': case '.': case '?':
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055 if (definedef != dnone)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057 /* These surely cannot follow a function tag in C. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4058 switch (fvdef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4059 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060 case foperator:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061 case finlist:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4062 case fignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063 case vignore:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 fvdef = fvnone;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 if (objdef == otagseen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072 make_C_tag (TRUE); /* an Objective C class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 objdef = oignore;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 /* If a macro spans multiple lines don't reset its state. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 if (quotednl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4077 CNL_SAVE_DEFINEDEF ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4079 CNL ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4081 } /* switch (c) */
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 } /* while not eof */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4084
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4085 free (lbs[0].lb.buffer);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4086 free (lbs[1].lb.buffer);
428
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
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 * 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
4091 * of a global flag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4093 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4094 default_C_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4097 C_entries (cplusplus ? C_PLPL : C_AUTO, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 }
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 /* Always do plain C. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4101 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 plain_C_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4103 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4105 C_entries (0, inf);
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 /* Always do C++. */
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 Cplusplus_entries (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 C_entries (C_PLPL, inf);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116 /* Always do Java. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4117 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4118 Cjava_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4119 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121 C_entries (C_JAVA, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4122 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 /* Always do C*. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4125 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 Cstar_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4127 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4128 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129 C_entries (C_STAR, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 /* Always do Yacc. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4133 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4134 Yacc_entries (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4135 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137 C_entries (YACC, inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4139
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4141 /* Useful macros. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142 #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
4143 for (; /* loop initialization */ \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4144 !feof (file_pointer) /* loop test */ \
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4145 && /* instructions at start of loop */ \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4146 (readline (&line_buffer, file_pointer), \
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4147 char_pointer = line_buffer.buffer, \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4148 TRUE); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4149 )
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4150
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4151 #define LOOKING_AT(cp, kw) /* kw is the keyword, a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4152 ((assert("" kw), TRUE) /* syntax error if not a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4153 && strneq ((cp), kw, sizeof(kw)-1) /* cp points at kw */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4154 && notinname ((cp)[sizeof(kw)-1]) /* end of kw */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4155 && ((cp) = skip_spaces((cp)+sizeof(kw)-1))) /* skip spaces */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4156
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4157 /* Similar to LOOKING_AT but does not use notinname, does not skip */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4158 #define LOOKING_AT_NOCASE(cp, kw) /* the keyword is a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4159 ((assert("" kw), TRUE) /* syntax error if not a literal string */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4160 && strncaseeq ((cp), kw, sizeof(kw)-1) /* cp points at kw */ \
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
4161 && ((cp) += sizeof(kw)-1)) /* skip spaces */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4164 * 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
4165 * matching on files that have no language defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4167 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168 just_read_file (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4169 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 register char *dummy;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4173 LOOP_ON_INPUT_LINES (inf, lb, dummy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4175 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4176
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 /* Fortran parsing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4180 static void F_takeprec __P((void));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4181 static void F_getit __P((FILE *));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4183 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4184 F_takeprec ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 if (*dbp != '*')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4188 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4190 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191 if (strneq (dbp, "(*)", 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 dbp += 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4196 if (!ISDIGIT (*dbp))
428
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 --dbp; /* force failure */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 dbp++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4203 while (ISDIGIT (*dbp));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4207 F_getit (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4214 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4215 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4216 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4217 if (dbp[5] != '&')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 dbp += 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4220 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4221 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4222 if (!ISALPHA (*dbp) && *dbp != '_' && *dbp != '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4224 for (cp = dbp + 1; *cp != '\0' && intoken (*cp); cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4225 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4226 make_tag (dbp, cp-dbp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4227 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228 }
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
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4231 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 Fortran_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4235 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 if (*dbp == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 dbp++; /* Ratfor escape to fortran */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 if (*dbp == '\0')
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 switch (lowcase (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4243 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 case 'i':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4245 if (nocase_tail ("integer"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4246 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4248 case 'r':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4249 if (nocase_tail ("real"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4250 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4251 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 case 'l':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4253 if (nocase_tail ("logical"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4254 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256 case 'c':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4257 if (nocase_tail ("complex") || nocase_tail ("character"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4258 F_takeprec ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260 case 'd':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4261 if (nocase_tail ("double"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4266 if (nocase_tail ("precision"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270 break;
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 = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 switch (lowcase (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4278 if (nocase_tail ("function"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4279 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4281 case 's':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4282 if (nocase_tail ("subroutine"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4283 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4284 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285 case 'e':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4286 if (nocase_tail ("entry"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4287 F_getit (inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 case 'b':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4290 if (nocase_tail ("blockdata") || nocase_tail ("block data"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293 if (*dbp == '\0') /* assume un-named */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4294 make_tag ("blockdata", 9, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4295 lb.buffer, dbp - lb.buffer, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4296 else
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4297 F_getit (inf); /* look for name */
428
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 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4303
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4306 * Ada parsing
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4307 * Original code by
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4308 * Philippe Waroquiers (1998)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4309 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4310
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4311 static void Ada_getit __P((FILE *, char *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4312
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313 /* Once we are positioned after an "interesting" keyword, let's get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314 the real tag value necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4316 Ada_getit (inf, name_qualifier)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4318 char *name_qualifier;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4319 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4320 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 char *name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324 while (!feof (inf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 if (*dbp == '\0'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4328 || (dbp[0] == '-' && dbp[1] == '-'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4330 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4333 switch (lowcase(*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4335 case 'b':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4336 if (nocase_tail ("body"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4337 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 /* Skipping body of procedure body or package body or ....
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4339 resetting qualifier to body instead of spec. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 name_qualifier = "/b";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4342 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4343 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 case 't':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345 /* 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
4346 if (nocase_tail ("type"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4349 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 if (*dbp == '"')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 for (cp = dbp; *cp != '\0' && *cp != '"'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 else
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 dbp = skip_spaces (dbp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 for (cp = dbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4360 (*cp != '\0'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4361 && (ISALPHA (*cp) || ISDIGIT (*cp) || *cp == '_' || *cp == '.'));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364 if (cp == dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4365 return;
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 c = *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 *cp = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 name = concat (dbp, name_qualifier, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370 *cp = c;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4371 make_tag (name, strlen (name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4372 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4373 free (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374 if (c == '"')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 dbp = cp + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 return;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4379
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4380 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 Ada_funcs (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 FILE *inf;
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 bool inquote = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4385 bool skip_till_semicolumn = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4387 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4388 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4389 while (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4390 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 /* Skip a string i.e. "abcd". */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 if (inquote || (*dbp == '"'))
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 dbp = etags_strchr ((inquote) ? dbp : dbp+1, '"');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4395 if (dbp != NULL)
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 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4398 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4399 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4401 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4402 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4403 inquote = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404 break; /* advance line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4405 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4406 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4408 /* Skip comments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4409 if (dbp[0] == '-' && dbp[1] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4410 break; /* advance line */
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 /* Skip character enclosed in single quote i.e. 'a'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 and skip single quote starting an attribute i.e. 'Image. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4414 if (*dbp == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4416 dbp++ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4417 if (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4418 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4419 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4420 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4421
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4422 if (skip_till_semicolumn)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4423 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4424 if (*dbp == ';')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4425 skip_till_semicolumn = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4426 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4427 continue; /* advance char */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4428 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4429
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4430 /* Search for beginning of a token. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4431 if (!begtoken (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4432 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4437 /* 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
4438 switch (lowcase(*dbp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4439 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4441 if (!packages_only && nocase_tail ("function"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4442 Ada_getit (inf, "/f");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4446 case 'p':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4447 if (!packages_only && nocase_tail ("procedure"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4448 Ada_getit (inf, "/p");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4449 else if (nocase_tail ("package"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4450 Ada_getit (inf, "/s");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4451 else if (nocase_tail ("protected")) /* protected type */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4452 Ada_getit (inf, "/t");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4454 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4455 continue; /* advance char */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4456
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4457 case 'u':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4458 if (typedefs && !packages_only && nocase_tail ("use"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4459 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4460 /* 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
4461 for this, we will skip everything till a ; */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4462 skip_till_semicolumn = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4463 continue; /* advance char */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4464 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4465
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 case 't':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4467 if (!packages_only && nocase_tail ("task"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4468 Ada_getit (inf, "/k");
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4469 else if (typedefs && !packages_only && nocase_tail ("type"))
428
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 Ada_getit (inf, "/t");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472 while (*dbp != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4473 dbp += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4474 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4475 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 break; /* from switch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477 continue; /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4480 /* Look for the end of the token. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4481 while (!endtoken (*dbp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4482 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4484 } /* advance char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4485 } /* advance line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4487
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 * Unix and microcontroller assembly tag handling
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4491 * 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
4492 * Idea by Bob Weiner, Motorola Inc. (1994)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4494 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4495 Asm_labels (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4496 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4498 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4500 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4501 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4502 /* If first char is alphabetic or one of [_.$], test for colon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4503 following identifier. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4504 if (ISALPHA (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4505 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4506 /* Read past label. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4507 cp++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4508 while (ISALNUM (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4509 cp++;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4510 if (*cp == ':' || iswhite (*cp))
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4511 /* 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
4512 make_tag (lb.buffer, cp - lb.buffer, TRUE,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4514 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4515 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4516 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4517
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4519 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4520 * Perl support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4521 * Perl sub names: /^sub[ \t\n]+[^ \t\n{]+/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4522 * Perl variable names: /^(my|local).../
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4523 * 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
4524 * 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
4525 * 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
4526 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4527 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4528 Perl_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4531 char *package = savestr ("main"); /* current package name */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4532 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4534 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4535 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4536 skip_spaces(cp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4537
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4538 if (LOOKING_AT (cp, "package"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4539 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4540 free (package);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4541 get_tag (cp, &package);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4542 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4543 else if (LOOKING_AT (cp, "sub"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4544 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4545 char *pos;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4546 char *sp = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4547
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4548 while (!notinname (*cp))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4549 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4550 if (cp == sp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4551 continue; /* nothing found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4552 if ((pos = etags_strchr (sp, ':')) != NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4553 && pos < cp && pos[1] == ':')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4554 /* The name is already qualified. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4555 make_tag (sp, cp - sp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4556 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4557 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4558 /* Qualify it. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4559 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4560 char savechar, *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4561
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4562 savechar = *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4563 *cp = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4564 name = concat (package, "::", sp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4565 *cp = savechar;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4566 make_tag (name, strlen(name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4567 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4568 free (name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4569 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4570 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4571 else if (globals) /* only if we are tagging global vars */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4572 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4573 /* Skip a qualifier, if any. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4574 bool qual = LOOKING_AT (cp, "my") || LOOKING_AT (cp, "local");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4575 /* 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
4576 char *varstart = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4577
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4578 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
4579 && (*cp == '$' || *cp == '@' || *cp == '%'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4580 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4581 varstart += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4582 do
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4583 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4584 while (ISALNUM (*cp) || *cp == '_');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4585 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4586 else if (qual)
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 /* Should be examining a variable list at this point;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4589 could insist on seeing an open parenthesis. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4590 while (*cp != '\0' && *cp != ';' && *cp != '=' && *cp != ')')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4592 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4593 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4594 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4595
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4596 make_tag (varstart, cp - varstart, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4597 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4598 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4599 }
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
4600 free (package);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4601 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4602
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4603
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4604 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4605 * Python support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4606 * 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
4607 * 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
4608 * More ideas by seb bacon <seb@jamkit.com> (2002)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4609 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4610 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4611 Python_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4612 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4613 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614 register char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616 LOOP_ON_INPUT_LINES (inf, lb, cp)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4617 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4618 cp = skip_spaces (cp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4619 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
4620 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4621 char *name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4622 while (!notinname (*cp) && *cp != ':')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4623 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4624 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4625 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4626 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4627 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4628 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4629
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4630
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4631 /*
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4632 * PHP support
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4633 * Look for:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4634 * - /^[ \t]*function[ \t\n]+[^ \t\n(]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4635 * - /^[ \t]*class[ \t\n]+[^ \t\n]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4636 * - /^[ \t]*define\(\"[^\"]+/
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4637 * Only with --members:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4638 * - /^[ \t]*var[ \t\n]+\$[^ \t\n=;]/
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4639 * Idea by Diez B. Roggisch (2001)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4640 */
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4641 static void
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4642 PHP_functions (inf)
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4643 FILE *inf;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4644 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4645 register char *cp, *name;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4646 bool search_identifier = FALSE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4647
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4648 LOOP_ON_INPUT_LINES (inf, lb, cp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4650 cp = skip_spaces (cp);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4651 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4652 if (search_identifier
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4653 && *cp != '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4655 while (!notinname (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4656 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4657 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4658 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
4659 search_identifier = FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4660 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4661 else if (LOOKING_AT (cp, "function"))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4662 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4663 if(*cp == '&')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4664 cp = skip_spaces (cp+1);
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4665 if(*cp != '\0')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4666 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4667 name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4668 while (!notinname (*cp))
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4669 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4670 make_tag (name, cp - name, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4671 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
4672 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4673 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4674 search_identifier = TRUE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4675 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4676 else if (LOOKING_AT (cp, "class"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4677 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4678 if (*cp != '\0')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4679 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4680 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4681 while (*cp != '\0' && !iswhite (*cp))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4682 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4683 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4684 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
4685 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4686 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4687 search_identifier = TRUE;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4688 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4689 else if (strneq (cp, "define", 6)
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4690 && (cp = skip_spaces (cp+6))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4691 && *cp++ == '('
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4692 && (*cp == '"' || *cp == '\''))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4693 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4694 char quote = *cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4695 name = cp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4696 while (*cp != quote && *cp != '\0')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4698 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4699 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
4700 }
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4701 else if (members
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4702 && LOOKING_AT (cp, "var")
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4703 && *cp == '$')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4704 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4705 name = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4706 while (!notinname(*cp))
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4707 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4708 make_tag (name, cp - name, FALSE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4709 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4713
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4715 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716 * Cobol tag functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717 * We could look for anything that could be a paragraph name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 * 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
4719 * Idea by Corny de Souza (1993)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4721 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4722 Cobol_paragraphs (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4723 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4725 register char *bp, *ep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 if (lb.len < 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 bp += 8;
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 /* If eoln, compiler option or comment ignore whole line. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4734 if (bp[-1] != ' ' || !ISALNUM (bp[0]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4737 for (ep = bp; ISALNUM (*ep) || *ep == '-'; ep++)
428
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 if (*ep++ == '.')
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4740 make_tag (bp, ep - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4741 lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4744
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4745
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4746 /*
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4747 * Makefile support
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4748 * Ideas by Assar Westerlund <assar@sics.se> (2001)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4749 */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4750 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4751 Makefile_targets (inf)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4752 FILE *inf;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4753 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4754 register char *bp;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4755
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4756 LOOP_ON_INPUT_LINES (inf, lb, bp)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4757 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4758 if (*bp == '\t' || *bp == '#')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4759 continue;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4760 while (*bp != '\0' && *bp != '=' && *bp != ':')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4761 bp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4762 if (*bp == ':' || (globals && *bp == '='))
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4763 {
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4764 /* We should detect if there is more than one tag, but we do not.
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4765 We just skip initial and final spaces. */
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4766 char * namestart = skip_spaces (lb.buffer);
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4767 while (--bp > namestart)
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4768 if (!notinname (*bp))
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4769 break;
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4770 make_tag (namestart, bp - namestart + 1, TRUE,
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4771 lb.buffer, bp - lb.buffer + 2, lineno, linecharno);
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
4772 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4773 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4774 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4775
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4776
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4778 * Pascal parsing
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4779 * Original code by Mosur K. Mohan (1989)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4780 *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 * Locates tags for procedures & functions. Doesn't do any type- or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 * var-definitions. It does look for the keyword "extern" or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783 * "forward" immediately following the procedure statement; if found,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 * the tag is skipped.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4786 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4787 Pascal_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790 linebuffer tline; /* mostly copied from C_entries */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 long save_lcno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4792 int save_lineno, namelen, taglen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4793 char c, *name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 bool /* each of these flags is TRUE iff: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 incomment, /* point is inside a comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 inquote, /* point is inside '..' string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4798 get_tagname, /* point is after PROCEDURE/FUNCTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 keyword, so next item = potential tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800 found_tag, /* point is after a potential tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 inparms, /* point is within parameter-list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802 verify_tag; /* point has passed the parm-list, so the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 next token will determine whether this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 is a FORWARD/EXTERN to be ignored, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805 whether it is a real tag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4807 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
4808 name = NULL; /* keep compiler quiet */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 *dbp = '\0';
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4811 linebuffer_init (&tline);
428
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 incomment = inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 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
4815 get_tagname = FALSE; /* found "procedure" keyword */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 inparms = FALSE; /* found '(' after "proc" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 verify_tag = FALSE; /* check if "extern" is ahead */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820 while (!feof (inf)) /* long main loop to get next char */
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 c = *dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4823 if (c == '\0') /* if end of line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4825 readline (&lb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826 dbp = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4829 if (!((found_tag && verify_tag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4830 || get_tagname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4831 c = *dbp++; /* only if don't need *dbp pointing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832 to the beginning of the name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833 the procedure or function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 if (incomment)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837 if (c == '}') /* within { } comments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 incomment = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 else if (c == '*' && *dbp == ')') /* within (* *) comments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842 incomment = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4843 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4844 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 else if (inquote)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4848 if (c == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4849 inquote = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4850 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4851 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4852 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4853 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855 case '\'':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856 inquote = TRUE; /* found first quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4857 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4858 case '{': /* found open { comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4859 incomment = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4860 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4861 case '(':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862 if (*dbp == '*') /* found open (* comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4863 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4864 incomment = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4865 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4866 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867 else if (found_tag) /* found '(' after tag, i.e., parm-list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 inparms = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4870 case ')': /* end of parms list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 if (inparms)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872 inparms = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4874 case ';':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 if (found_tag && !inparms) /* end of proc or fn stmt */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4876 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4877 verify_tag = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4878 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4879 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4881 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4882 if (found_tag && verify_tag && (*dbp != ' '))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4883 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4884 /* Check if this is an "extern" declaration. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4885 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4887 if (lowcase (*dbp == 'e'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4889 if (nocase_tail ("extern")) /* superfluous, really! */
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 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892 verify_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4893 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4894 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4895 else if (lowcase (*dbp) == 'f')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4896 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4897 if (nocase_tail ("forward")) /* check for forward reference */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4899 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4900 verify_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4901 }
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 if (found_tag && verify_tag) /* not external proc, so make tag */
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 found_tag = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4906 verify_tag = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4907 make_tag (name, namelen, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4908 tline.buffer, taglen, save_lineno, save_lcno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4912 if (get_tagname) /* grab name of proc or fn */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4913 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4914 char *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4915
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4916 if (*dbp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4917 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4918
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4919 /* Find block name. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4920 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
4921 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4922
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4923 /* Save all values for later tagging. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4924 linebuffer_setlen (&tline, lb.len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4925 strcpy (tline.buffer, lb.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4926 save_lineno = lineno;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4927 save_lcno = linecharno;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4928 name = tline.buffer + (dbp - lb.buffer);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4929 namelen = cp - dbp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4930 taglen = cp - lb.buffer + 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4931
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4932 dbp = cp; /* set dbp to e-o-token */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4933 get_tagname = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4934 found_tag = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4935 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4936
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4937 /* And proceed to check for "extern". */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4938 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4939 else if (!incomment && !inquote && !found_tag)
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 /* Check for proc/fn keywords. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4942 switch (lowcase (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4943 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4944 case 'p':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4945 if (nocase_tail ("rocedure")) /* c = 'p', dbp has advanced */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4946 get_tagname = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4947 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4948 case 'f':
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4949 if (nocase_tail ("unction"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950 get_tagname = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4951 continue;
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 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4954 } /* while not eof */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4956 free (tline.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4957 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4958
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4960 /*
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
4961 * Lisp tag functions
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4962 * look for (def or (DEF, quote or QUOTE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4963 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4964
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
4965 static void L_getit __P((void));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4966
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4967 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4968 L_getit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4969 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4970 if (*dbp == '\'') /* Skip prefix quote */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4971 dbp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4972 else if (*dbp == '(')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4973 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4974 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4975 /* Try to skip "(quote " */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4976 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
4977 /* Ok, then skip "(" before name in (defstruct (foo)) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4978 dbp = skip_spaces (dbp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4980 get_tag (dbp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4982
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
4983 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984 Lisp_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987 LOOP_ON_INPUT_LINES (inf, lb, dbp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4989 if (dbp[0] != '(')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4990 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4991
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4992 if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4994 dbp = skip_non_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4995 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4996 L_getit ();
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4997 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4998 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
4999 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5000 /* Check for (foo::defmumble name-defined ... */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5001 do
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5002 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5003 while (!notinname (*dbp) && *dbp != ':');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5004 if (*dbp == ':')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5005 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007 dbp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5008 while (*dbp == ':');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5009
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5010 if (strneq (dbp, "def", 3) || strneq (dbp, "DEF", 3))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5011 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5012 dbp = skip_non_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5013 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5014 L_getit ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5015 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5017 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5018 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5019 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5020
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5021
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5022 /*
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5023 * Lua script language parsing
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5024 * Original code by David A. Capello <dacap@users.sourceforge.net> (2004)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5025 *
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5026 * "function" and "local function" are tags if they start at column 1.
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5027 */
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5028 static void
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5029 Lua_functions (inf)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5030 FILE *inf;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5031 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5032 register char *bp;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5033
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5034 LOOP_ON_INPUT_LINES (inf, lb, bp)
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5035 {
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5036 if (bp[0] != 'f' && bp[0] != 'l')
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5037 continue;
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5038
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
5039 (void)LOOKING_AT (bp, "local"); /* skip possible "local" */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5040
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5041 if (LOOKING_AT (bp, "function"))
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5042 get_tag (bp, NULL);
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5043 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5044 }
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5045
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5046
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5047 /*
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5048 * Postscript tags
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049 * Just look for lines where the first character is '/'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 * Also look at "defineps" for PSWrap
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5051 * Ideas by:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5052 * Richard Mlynarik <mly@adoc.xerox.com> (1997)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5053 * Masatake Yamato <masata-y@is.aist-nara.ac.jp> (1999)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5055 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5056 PS_functions (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059 register char *bp, *ep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 LOOP_ON_INPUT_LINES (inf, lb, bp)
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 (bp[0] == '/')
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 for (ep = bp+1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066 *ep != '\0' && *ep != ' ' && *ep != '{';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 ep++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068 continue;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5069 make_tag (bp, ep - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5070 lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5072 else if (LOOKING_AT (bp, "defineps"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5073 get_tag (bp, NULL);
428
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 /*
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5079 * Forth tags
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5080 * Ignore anything after \ followed by space or in ( )
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5081 * Look for words defined by :
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5082 * Look for constant, code, create, defer, value, and variable
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5083 * OBP extensions: Look for buffer:, field,
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5084 * Ideas by Eduardo Horvath <eeh@netbsd.org> (2004)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5085 */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5086 static void
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5087 Forth_words (inf)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5088 FILE *inf;
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5089 {
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5090 register char *bp;
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5091
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5092 LOOP_ON_INPUT_LINES (inf, lb, bp)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5093 while ((bp = skip_spaces (bp))[0] != '\0')
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5094 if (bp[0] == '\\' && iswhite(bp[1]))
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5095 break; /* read next line */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5096 else if (bp[0] == '(' && iswhite(bp[1]))
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5097 do /* skip to ) or eol */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5098 bp++;
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5099 while (*bp != ')' && *bp != '\0');
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5100 else if ((bp[0] == ':' && iswhite(bp[1]) && bp++)
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5101 || LOOKING_AT_NOCASE (bp, "constant")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5102 || LOOKING_AT_NOCASE (bp, "code")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5103 || LOOKING_AT_NOCASE (bp, "create")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5104 || LOOKING_AT_NOCASE (bp, "defer")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5105 || LOOKING_AT_NOCASE (bp, "value")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5106 || LOOKING_AT_NOCASE (bp, "variable")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5107 || LOOKING_AT_NOCASE (bp, "buffer:")
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5108 || LOOKING_AT_NOCASE (bp, "field"))
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5109 get_tag (skip_spaces (bp), NULL); /* Yay! A definition! */
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5110 else
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5111 bp = skip_non_spaces (bp);
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5112 }
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5113
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5114
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
5115 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5116 * Scheme tag functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5117 * look for (def... xyzzy
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5118 * (def... (xyzzy
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5119 * (def ... ((...(xyzzy ....
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5120 * (set! xyzzy
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5121 * Original code by Ken Haase (1985?)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5122 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5123 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5124 Scheme_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5125 FILE *inf;
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 register char *bp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5129 LOOP_ON_INPUT_LINES (inf, lb, bp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5130 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5131 if (strneq (bp, "(def", 4) || strneq (bp, "(DEF", 4))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5132 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5133 bp = skip_non_spaces (bp+4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5134 /* Skip over open parens and white space */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5135 while (notinname (*bp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5136 bp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5137 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5138 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5139 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
5140 get_tag (bp, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5141 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5142 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5143
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5145 /* Find tags in TeX and LaTeX input files. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5147 /* 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
5148 * Each entry records one such control sequence.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5149 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5150 * Original code from who knows whom.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5151 * Ideas by:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5152 * Stefan Monnier (2002)
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 static linebuffer *TEX_toktab = NULL; /* Table with tag tokens */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5157 /* Default set of control sequences to put into TEX_toktab.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5158 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
5159 static char *TEX_defenv = "\
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 :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
5161 :part:appendix:entry:index:def\
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5162 :newcommand:renewcommand:newenvironment:renewenvironment";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5164 static void TEX_mode __P((FILE *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5165 static void TEX_decode_env __P((char *, char *));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5166
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5167 static char TEX_esc = '\\';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5168 static char TEX_opgrp = '{';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5169 static char TEX_clgrp = '}';
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172 * TeX/LaTeX scanning loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5174 static void
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5175 TeX_commands (inf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5176 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5177 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5178 char *cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5179 linebuffer *key;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5181 /* Select either \ or ! as escape character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5182 TEX_mode (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 /* Initialize token table once from environment. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5185 if (TEX_toktab == NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5186 TEX_decode_env ("TEXTAGS", TEX_defenv);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5190 /* Look at each TEX keyword in line. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5191 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5192 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5193 /* Look for a TEX escape. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5194 while (*cp++ != TEX_esc)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5195 if (cp[-1] == '\0' || cp[-1] == '%')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5196 goto tex_next_line;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5197
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5198 for (key = TEX_toktab; key->buffer != NULL; key++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5199 if (strneq (cp, key->buffer, key->len))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5200 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5201 register char *p;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5202 int namelen, linelen;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5203 bool opgrp = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5204
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5205 cp = skip_spaces (cp + key->len);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5206 if (*cp == TEX_opgrp)
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 opgrp = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5209 cp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5210 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5211 for (p = cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5212 (!iswhite (*p) && *p != '#' &&
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5213 *p != TEX_opgrp && *p != TEX_clgrp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5214 p++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5215 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5216 namelen = p - cp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5217 linelen = lb.len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5218 if (!opgrp || *p == TEX_clgrp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5219 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5220 while (*p != '\0' && *p != TEX_opgrp && *p != TEX_clgrp)
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
5221 p++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5222 linelen = p - lb.buffer + 1;
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 make_tag (cp, namelen, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5225 lb.buffer, linelen, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5226 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
5227 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5228 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5229 tex_next_line:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5230 ;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5231 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5232 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5234 #define TEX_LESC '\\'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5235 #define TEX_SESC '!'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5237 /* Figure out whether TeX's escapechar is '\\' or '!' and set grouping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5238 chars accordingly. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5239 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5240 TEX_mode (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5241 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5242 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5243 int c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5245 while ((c = getc (inf)) != EOF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5246 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5247 /* 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
5248 if (c == '%')
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
5249 while (c != '\n' && c != EOF)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5250 c = getc (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5251 else if (c == TEX_LESC || c == TEX_SESC )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5252 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5255 if (c == TEX_LESC)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5256 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5257 TEX_esc = TEX_LESC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5258 TEX_opgrp = '{';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5259 TEX_clgrp = '}';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5260 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5261 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5262 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5263 TEX_esc = TEX_SESC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5264 TEX_opgrp = '<';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5265 TEX_clgrp = '>';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5266 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5267 /* 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
5268 No attempt is made to correct the situation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5269 rewind (inf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5270 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5272 /* Read environment and prepend it to the default string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5273 Build token table. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5274 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5275 TEX_decode_env (evarname, defenv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5276 char *evarname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5277 char *defenv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5278 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5279 register char *env, *p;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5280 int i, len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5282 /* Append default string to environment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5283 env = getenv (evarname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5284 if (!env)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5285 env = defenv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5286 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5287 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5288 char *oldenv = env;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5289 env = concat (oldenv, defenv, "");
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5292 /* Allocate a token table */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5293 for (len = 1, p = env; p;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5294 if ((p = etags_strchr (p, ':')) && *++p != '\0')
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5295 len++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5296 TEX_toktab = xnew (len, linebuffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5298 /* Unpack environment string into token table. Be careful about */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5299 /* zero-length strings (leading ':', "::" and trailing ':') */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5300 for (i = 0; *env != '\0';)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5301 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5302 p = etags_strchr (env, ':');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5303 if (!p) /* End of environment string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5304 p = env + strlen (env);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5305 if (p - env > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5306 { /* Only non-zero strings. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5307 TEX_toktab[i].buffer = savenstr (env, p - env);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5308 TEX_toktab[i].len = p - env;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5309 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5310 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5311 if (*p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5312 env = p + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5313 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5314 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5315 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
5316 TEX_toktab[i].len = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5317 break;
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 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5321
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5322
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5323 /* Texinfo support. Dave Love, Mar. 2000. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5324 static void
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5325 Texinfo_nodes (inf)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5326 FILE * inf;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5327 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5328 char *cp, *start;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5329 LOOP_ON_INPUT_LINES (inf, lb, cp)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5330 if (LOOKING_AT (cp, "@node"))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5331 {
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5332 start = cp;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5333 while (*cp != '\0' && *cp != ',')
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5334 cp++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5335 make_tag (start, cp - start, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5336 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5337 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5338 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5339
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5340
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5341 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5342 * HTML support.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5343 * Contents of <title>, <h1>, <h2>, <h3> are tags.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5344 * 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
5345 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5346 * Francesco Potort́, 2002.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5347 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5348 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5349 HTML_labels (inf)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5350 FILE * inf;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5351 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5352 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
5353 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
5354 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
5355 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
5356 char *end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5357
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5358
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5359 linebuffer_setlen (&token_name, 0); /* no name in buffer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5360
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5361 LOOP_ON_INPUT_LINES (inf, lb, dbp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5362 for (;;) /* loop on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5363 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5364 if (skiptag) /* skip HTML tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5365 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5366 while (*dbp != '\0' && *dbp != '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5367 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5368 if (*dbp == '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5369 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5370 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5371 skiptag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5372 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5373 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5374 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5375 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5376
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5377 else if (intag) /* look for "name=" or "id=" */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5378 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5379 while (*dbp != '\0' && *dbp != '>'
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5380 && lowcase (*dbp) != 'n' && lowcase (*dbp) != 'i')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5381 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5382 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5383 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5384 if (*dbp == '>')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5385 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5386 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5387 intag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5388 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5389 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5390 if ((inanchor && LOOKING_AT_NOCASE (dbp, "name="))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5391 || LOOKING_AT_NOCASE (dbp, "id="))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5392 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5393 bool quoted = (dbp[0] == '"');
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5394
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5395 if (quoted)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5396 for (end = ++dbp; *end != '\0' && *end != '"'; end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5397 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5398 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5399 for (end = dbp; *end != '\0' && intoken (*end); end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5400 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5401 linebuffer_setlen (&token_name, end - dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5402 strncpy (token_name.buffer, dbp, end - dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5403 token_name.buffer[end - dbp] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5404
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5405 dbp = end;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5406 intag = FALSE; /* we found what we looked for */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5407 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
5408 getnext = TRUE; /* then grab the text */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5409 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5410 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5411 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5412 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5413
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5414 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
5415 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5416 dbp = skip_spaces (dbp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5417 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5418 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5419 if (*dbp == '<')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5420 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5421 intag = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5422 inanchor = (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5423 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5424 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5425
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5426 for (end = dbp + 1; *end != '\0' && *end != '<'; end++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5427 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5428 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
5429 dbp, end - dbp, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5430 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
5431 getnext = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5432 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5433 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5434
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5435 else /* look for an interesting HTML tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5436 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5437 while (*dbp != '\0' && *dbp != '<')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5438 dbp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5439 if (*dbp == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5440 break; /* go to next line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5441 intag = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5442 if (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5443 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5444 inanchor = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5445 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5446 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5447 else if (LOOKING_AT_NOCASE (dbp, "<title>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5448 || LOOKING_AT_NOCASE (dbp, "<h1>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5449 || LOOKING_AT_NOCASE (dbp, "<h2>")
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5450 || LOOKING_AT_NOCASE (dbp, "<h3>"))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5451 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5452 intag = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5453 getnext = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5454 continue; /* look on the same line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5455 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5456 dbp += 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5457 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5458 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5459 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5460
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5462 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5463 * Prolog support
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5464 *
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5465 * 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
5466 * 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
5467 * Original code by Sunichirou Sugou (1989)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5468 * Rewritten by Anders Lindgren (1996)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5469 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5470 static int prolog_pr __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5471 static void prolog_skip_comment __P((linebuffer *, FILE *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5472 static int prolog_atom __P((char *, int));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5473
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5474 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5475 Prolog_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5476 FILE *inf;
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 char *cp, *last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5479 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5480 int allocated;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5482 allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5483 len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5484 last = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5486 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5487 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5488 if (cp[0] == '\0') /* Empty line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5489 continue;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5490 else if (iswhite (cp[0])) /* Not a predicate */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5491 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5492 else if (cp[0] == '/' && cp[1] == '*') /* comment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5493 prolog_skip_comment (&lb, inf);
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5494 else if ((len = prolog_pr (cp, last)) > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5495 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5496 /* 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
5497 only generate a tag for the first clause. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5498 if (last == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5499 last = xnew(len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5500 else if (len + 1 > allocated)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5501 xrnew (last, len + 1, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5502 allocated = len + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5503 strncpy (last, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5504 last[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5506 }
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5507 if (last != NULL)
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5508 free (last);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5509 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5511
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5512 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5513 prolog_skip_comment (plb, inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5514 linebuffer *plb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5515 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5516 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5517 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5519 do
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 for (cp = plb->buffer; *cp != '\0'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5522 if (cp[0] == '*' && cp[1] == '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5523 return;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5524 readline (plb, inf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5526 while (!feof(inf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5527 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5529 /*
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5530 * A predicate or rule definition is added if it matches:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5531 * <beginning of line><Prolog Atom><whitespace>(
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5532 * or <beginning of line><Prolog Atom><whitespace>:-
428
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 * 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
5535 * name of the previous clause header.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5536 *
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5537 * 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
5538 * header was found.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5539 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5540 static int
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5541 prolog_pr (s, last)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5542 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5543 char *last; /* Name of last clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5544 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5545 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5546 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5548 pos = prolog_atom (s, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5549 if (pos < 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5550 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5552 len = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5553 pos = skip_spaces (s + pos) - s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5554
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5555 if ((s[pos] == '.'
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5556 || (s[pos] == '(' && (pos += 1))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5557 || (s[pos] == ':' && s[pos + 1] == '-' && (pos += 2)))
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5558 && (last == NULL /* save only the first clause */
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
5559 || len != (int)strlen (last)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5560 || !strneq (s, last, len)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5561 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5562 make_tag (s, len, TRUE, s, pos, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5563 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5564 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5565 else
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5566 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5567 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5569 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5570 * Consume a Prolog atom.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5571 * 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
5572 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5573 * A prolog atom, in this context, could be one of:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5574 * - An alphanumeric sequence, starting with a lower case letter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5575 * - A quoted arbitrary string. Single quotes can escape themselves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5576 * Backslash quotes everything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5577 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5578 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5579 prolog_atom (s, pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5580 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5581 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5582 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5583 int origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5585 origpos = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5586
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5587 if (ISLOWER(s[pos]) || (s[pos] == '_'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5589 /* The atom is unquoted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5590 pos++;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5591 while (ISALNUM(s[pos]) || (s[pos] == '_'))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5592 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5593 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5594 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5595 return pos - origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5597 else if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5598 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5599 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5600
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5601 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5602 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5603 if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5604 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5605 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5606 if (s[pos] != '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5607 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5608 pos++; /* A double quote */
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 else if (s[pos] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5611 /* Multiline quoted atoms are ignored. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5612 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5613 else if (s[pos] == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5614 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5615 if (s[pos+1] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5616 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5617 pos += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5618 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5619 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5620 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5621 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5622 return pos - origpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5623 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5624 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5625 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5626 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5627
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5629 /*
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5630 * Support for Erlang
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5631 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5632 * Generates tags for functions, defines, and records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5633 * 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
5634 * Original code by Anders Lindgren (1996)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5635 */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5636 static int erlang_func __P((char *, char *));
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5637 static void erlang_attribute __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5638 static int erlang_atom __P((char *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5639
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5640 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5641 Erlang_functions (inf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5642 FILE *inf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5643 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5644 char *cp, *last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5645 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5646 int allocated;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5648 allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5649 len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5650 last = NULL;
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 LOOP_ON_INPUT_LINES (inf, lb, cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5654 if (cp[0] == '\0') /* Empty line */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5655 continue;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5656 else if (iswhite (cp[0])) /* Not function nor attribute */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5657 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5658 else if (cp[0] == '%') /* comment */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5659 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5660 else if (cp[0] == '"') /* Sometimes, strings start in column one */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5661 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5662 else if (cp[0] == '-') /* attribute, e.g. "-define" */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5663 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5664 erlang_attribute (cp);
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5665 if (last != NULL)
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5666 {
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5667 free (last);
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5668 last = NULL;
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5669 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5671 else if ((len = erlang_func (cp, last)) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5672 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5673 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5674 * Function. Store the function name so that we only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5675 * generates a tag for the first clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5676 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5677 if (last == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5678 last = xnew (len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5679 else if (len + 1 > allocated)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5680 xrnew (last, len + 1, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5681 allocated = len + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5682 strncpy (last, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5683 last[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5684 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5685 }
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5686 if (last != NULL)
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
5687 free (last);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5688 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5691 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5692 * A function definition is added if it matches:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5693 * <beginning of line><Erlang Atom><whitespace>(
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5694 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5695 * 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
5696 * name of the previous clause header.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5697 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5698 * 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
5699 * was found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5700 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5701 static int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5702 erlang_func (s, last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5703 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5704 char *last; /* Name of last clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5705 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5706 int pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5707 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5708
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5709 pos = erlang_atom (s);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5710 if (pos < 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5711 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5712
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5713 len = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5714 pos = skip_spaces (s + pos) - s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5716 /* Save only the first clause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5717 if (s[pos++] == '('
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5718 && (last == NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5719 || len != (int)strlen (last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5720 || !strneq (s, last, len)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5721 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5722 make_tag (s, len, TRUE, s, pos, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5723 return len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5724 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5726 return 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5729
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5730 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5731 * Handle attributes. Currently, tags are generated for defines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5732 * and records.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5733 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5734 * They are on the form:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5735 * -define(foo, bar).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5736 * -define(Foo(M, N), M+N).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5737 * -record(graph, {vtab = notable, cyclic = true}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5738 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5739 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5740 erlang_attribute (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5741 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5742 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5743 char *cp = s;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5744
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5745 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
5746 && *cp++ == '(')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5747 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5748 int len = erlang_atom (skip_spaces (cp));
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5749 if (len > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5750 make_tag (cp, len, TRUE, s, cp + len - s, lineno, linecharno);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5751 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5752 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5753 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5756 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5757 * Consume an Erlang atom (or variable).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5758 * 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
5759 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5760 static int
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5761 erlang_atom (s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5762 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5763 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5764 int pos = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5765
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5766 if (ISALPHA (s[pos]) || s[pos] == '_')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5767 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5768 /* The atom is unquoted. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5769 do
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5770 pos++;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5771 while (ISALNUM (s[pos]) || s[pos] == '_');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5772 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5773 else if (s[pos] == '\'')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5774 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5775 for (pos++; s[pos] != '\''; pos++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5776 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
5777 || (s[pos] == '\\' && s[++pos] == '\0'))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5778 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5779 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5780 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5781
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5782 return pos;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5783 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5784
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5785
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5786 static char *scan_separators __P((char *));
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5787 static void add_regex __P((char *, language *));
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5788 static char *substitute __P((char *, char *, struct re_registers *));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5789
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5790 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5791 * 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
5792 * 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
5793 * 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
5794 * 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
5795 * 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
5796 * Returns pointer to terminating separator, or NULL for
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5797 * unterminated regexps.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5798 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5799 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5800 scan_separators (name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5801 char *name;
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 char sep = name[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5804 char *copyto = name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5805 bool quoted = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5806
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5807 for (++name; *name != '\0'; ++name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5808 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5809 if (quoted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5810 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5811 switch (*name)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5812 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5813 case 'a': *copyto++ = '\007'; break; /* BEL (bell) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5814 case 'b': *copyto++ = '\b'; break; /* BS (back space) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5815 case 'd': *copyto++ = 0177; break; /* DEL (delete) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5816 case 'e': *copyto++ = 033; break; /* ESC (delete) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5817 case 'f': *copyto++ = '\f'; break; /* FF (form feed) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5818 case 'n': *copyto++ = '\n'; break; /* NL (new line) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5819 case 'r': *copyto++ = '\r'; break; /* CR (carriage return) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5820 case 't': *copyto++ = '\t'; break; /* TAB (horizontal tab) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5821 case 'v': *copyto++ = '\v'; break; /* VT (vertical tab) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5822 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5823 if (*name == sep)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5824 *copyto++ = sep;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5825 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5826 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5827 /* Something else is quoted, so preserve the quote. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5828 *copyto++ = '\\';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5829 *copyto++ = *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5830 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5831 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5832 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5833 quoted = FALSE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5834 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5835 else if (*name == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5836 quoted = TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5837 else if (*name == sep)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5838 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5839 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5840 *copyto++ = *name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5841 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5842 if (*name != sep)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5843 name = NULL; /* signal unterminated regexp */
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 /* Terminate copied string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5846 *copyto = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5847 return name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5848 }
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 /* 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
5851 thing. Same for each line of a regexp file. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5852 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5853 analyse_regex (regex_arg)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5854 char *regex_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5856 if (regex_arg == NULL)
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5857 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5858 free_regexps (); /* --no-regex: remove existing regexps */
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5859 return;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
5860 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5862 /* A real --regexp option or a line in a regexp file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5863 switch (regex_arg[0])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5864 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5865 /* Comments in regexp file or null arg to --regex. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5866 case '\0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5867 case ' ':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5868 case '\t':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5869 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5871 /* Read a regex file. This is recursive and may result in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5872 loop, which will stop when the file descriptors are exhausted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5873 case '@':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5875 FILE *regexfp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5876 linebuffer regexbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5877 char *regexfile = regex_arg + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5879 /* regexfile is a file containing regexps, one per line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5880 regexfp = fopen (regexfile, "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5881 if (regexfp == NULL)
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 pfatal (regexfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5884 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5885 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5886 linebuffer_init (&regexbuf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5887 while (readline_internal (&regexbuf, regexfp) > 0)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5888 analyse_regex (regexbuf.buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5889 free (regexbuf.buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5890 fclose (regexfp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5891 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5892 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5894 /* Regexp to be used for a specific language only. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5895 case '{':
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 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5898 char *lang_name = regex_arg + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5899 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5900
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5901 for (cp = lang_name; *cp != '}'; cp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5902 if (*cp == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5903 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5904 error ("unterminated language name in regex: %s", regex_arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5905 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5906 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5907 *cp++ = '\0';
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
5908 lang = get_language_from_langname (lang_name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5909 if (lang == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5910 return;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5911 add_regex (cp, lang);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5912 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5913 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5915 /* Regexp to be used for any language. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5916 default:
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5917 add_regex (regex_arg, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5918 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5919 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5920 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5921
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5922 /* Separate the regexp pattern, compile it,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5923 and care for optional name and modifiers. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
5924 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5925 add_regex (regexp_pattern, lang)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5926 char *regexp_pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5927 language *lang;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5928 {
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5929 static struct re_pattern_buffer zeropattern;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5930 char sep, *pat, *name, *modifiers;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5931 const char *err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5932 struct re_pattern_buffer *patbuf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5933 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5934 bool
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5935 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
5936 ignore_case = FALSE, /* case is significant */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5937 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
5938 single_line = FALSE; /* dot does not match newline */
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
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5941 if (strlen(regexp_pattern) < 3)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5942 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5943 error ("null regexp", (char *)NULL);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5944 return;
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 sep = regexp_pattern[0];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5947 name = scan_separators (regexp_pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5948 if (name == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5949 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5950 error ("%s: unterminated regexp", regexp_pattern);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5951 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5952 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5953 if (name[1] == sep)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5954 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5955 error ("null name for regexp \"%s\"", regexp_pattern);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5956 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5957 }
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5958 modifiers = scan_separators (name);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5959 if (modifiers == NULL) /* no terminating separator --> no name */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5960 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5961 modifiers = name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5962 name = "";
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5963 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5964 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5965 modifiers += 1; /* skip separator */
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 /* Parse regex modifiers. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5968 for (; modifiers[0] != '\0'; modifiers++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5969 switch (modifiers[0])
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 case 'N':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5972 if (modifiers == name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5973 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
5974 force_explicit_name = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5975 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5976 case 'i':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5977 ignore_case = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5978 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5979 case 's':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5980 single_line = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5981 /* FALLTHRU */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5982 case 'm':
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5983 multi_line = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5984 need_filebuf = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5985 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5986 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5987 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5988 char wrongmod [2];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5989 wrongmod[0] = modifiers[0];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5990 wrongmod[1] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5991 error ("invalid regexp modifier `%s', ignoring", wrongmod);
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 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5994 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5996 patbuf = xnew (1, struct re_pattern_buffer);
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5997 *patbuf = zeropattern;
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 523
diff changeset
5998 if (ignore_case)
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
5999 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6000 static char lc_trans[CHARS];
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6001 int i;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6002 for (i = 0; i < CHARS; i++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6003 lc_trans[i] = lowcase (i);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6004 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
6005 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6006
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6007 if (multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6008 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
6009 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6010 pat = regexp_pattern;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6011
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6012 if (single_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6013 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
6014 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6015 re_set_syntax (RE_SYNTAX_EMACS);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6016
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6017 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
6018 if (multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6019 free (pat);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6020 if (err != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6021 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6022 error ("%s while compiling pattern", err);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6023 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6024 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6025
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6026 rp = p_head;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6027 p_head = xnew (1, regexp);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6028 p_head->pattern = savestr (regexp_pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6029 p_head->p_next = rp;
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6030 p_head->lang = lang;
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6031 p_head->pat = patbuf;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6032 p_head->name = savestr (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6033 p_head->error_signaled = FALSE;
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6034 p_head->force_explicit_name = force_explicit_name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6035 p_head->ignore_case = ignore_case;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6036 p_head->multi_line = multi_line;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6037 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6039 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6040 * Do the substitutions indicated by the regular expression and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6041 * arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6042 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6043 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6044 substitute (in, out, regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6045 char *in, *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6046 struct re_registers *regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6048 char *result, *t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6049 int size, dig, diglen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6051 result = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6052 size = strlen (out);
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 /* 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
6055 if (out[size - 1] == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6056 fatal ("pattern error in \"%s\"", out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6057 for (t = etags_strchr (out, '\\');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6058 t != NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6059 t = etags_strchr (t + 2, '\\'))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6060 if (ISDIGIT (t[1]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6061 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6062 dig = t[1] - '0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6063 diglen = regs->end[dig] - regs->start[dig];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6064 size += diglen - 2;
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6067 size -= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6069 /* Allocate space and do the substitutions. */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6070 assert (size >= 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6071 result = xnew (size + 1, char);
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 for (t = result; *out != '\0'; out++)
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6074 if (*out == '\\' && ISDIGIT (*++out))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6075 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6076 dig = *out - '0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6077 diglen = regs->end[dig] - regs->start[dig];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6078 strncpy (t, in + regs->start[dig], diglen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6079 t += diglen;
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6082 *t++ = *out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6083 *t = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6084
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6085 assert (t <= result + size);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6086 assert (t - result == (int)strlen (result));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6088 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6089 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6090
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6091 /* Deallocate all regexps. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6092 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6093 free_regexps ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6094 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6095 regexp *rp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6096 while (p_head != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6097 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6098 rp = p_head->p_next;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6099 free (p_head->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6100 free (p_head->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6101 free (p_head);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6102 p_head = rp;
428
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 return;
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
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6107 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6108 * 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
6109 * multi-line regular expressions, creating tags on matches.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6110 * readline already dealt with normal regexps.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6111 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6112 * Idea by Ben Wing <ben@666.com> (2002).
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6113 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6114 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6115 regex_tag_multiline ()
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6116 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6117 char *buffer = filebuf.buffer;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6118 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6119 char *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6120
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6121 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
6122 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6123 int match = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6124
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6125 if (!rp->multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6126 continue; /* skip normal regexps */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6127
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6128 /* Generic initialisations before parsing file from memory. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6129 lineno = 1; /* reset global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6130 charno = 0; /* reset global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6131 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
6132
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6133 /* 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
6134 if (rp->lang != NULL && rp->lang != curfdp->lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6135 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6136
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6137 while (match >= 0 && match < filebuf.len)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6138 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6139 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
6140 filebuf.len - match, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6141 switch (match)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6142 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6143 case -2:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6144 /* Some error. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6145 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6146 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6147 error ("regexp stack overflow while matching \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6148 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6149 rp->error_signaled = TRUE;
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 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6152 case -1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6153 /* No match. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6154 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6155 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6156 if (match == rp->regs.end[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6157 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6158 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6159 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6160 error ("regexp matches the empty string: \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6161 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6162 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6163 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6164 match = -3; /* exit from while loop */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6165 break;
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
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6168 /* Match occurred. Construct a tag. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6169 while (charno < rp->regs.end[0])
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6170 if (buffer[charno++] == '\n')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6171 lineno++, linecharno = charno;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6172 name = rp->name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6173 if (name[0] == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6174 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6175 else /* make a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6176 name = substitute (buffer, rp->name, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6177 if (rp->force_explicit_name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6178 /* 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
6179 pfnote (name, TRUE, buffer + linecharno,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6180 charno - linecharno + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6181 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6182 make_tag (name, strlen (name), TRUE, buffer + linecharno,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6183 charno - linecharno + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6184 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6185 }
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 }
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
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6190
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6191 static bool
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6192 nocase_tail (cp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6193 char *cp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6194 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6195 register int len = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6196
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6197 while (*cp != '\0' && lowcase (*cp) == lowcase (dbp[len]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6198 cp++, len++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6199 if (*cp == '\0' && !intoken (dbp[len]))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6200 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6201 dbp += len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6202 return TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6203 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6204 return FALSE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6205 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6206
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6207 static void
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6208 get_tag (bp, namepp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6209 register char *bp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6210 char **namepp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6211 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6212 register char *cp = bp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6213
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6214 if (*bp != '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6215 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6216 /* 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
6217 for (cp = bp + 1; !notinname (*cp); cp++)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6218 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6219 make_tag (bp, cp - bp, TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6220 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6221 }
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 if (namepp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6224 *namepp = savenstr (bp, cp - bp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6225 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6227 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6228 * Read a line of text from `stream' into `lbp', excluding the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6229 * 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
6230 * `stream', which is the length of the line including the newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6231 *
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6232 * 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
6233 * 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
6234 * 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
6235 * file).
2225
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 * 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
6238 * appended to `filebuf'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6239 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6240 static long
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6241 readline_internal (lbp, stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6242 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6243 register FILE *stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6244 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6245 char *buffer = lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6246 register char *p = lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6247 register char *pend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6248 int chars_deleted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6250 pend = p + lbp->size; /* Separate to avoid 386/IX compiler bug. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6251
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6252 for (;;)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6253 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6254 register int c = getc (stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6255 if (p == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6256 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6257 /* We're at the end of linebuffer: expand it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6258 lbp->size *= 2;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6259 xrnew (buffer, lbp->size, char);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6260 p += buffer - lbp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6261 pend = buffer + lbp->size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6262 lbp->buffer = buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6263 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6264 if (c == EOF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6265 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6266 *p = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6267 chars_deleted = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6268 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6270 if (c == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6272 if (p > buffer && p[-1] == '\r')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6273 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6274 p -= 1;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6275 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6276 /* Assume CRLF->LF translation will be performed by Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6277 when loading this file, so CRs won't appear in the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6278 It would be cleaner to compensate within Emacs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6279 however, Emacs does not know how many CRs were deleted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6280 before any given point in the file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6281 chars_deleted = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6282 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6283 chars_deleted = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6284 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6285 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6286 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6287 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6288 chars_deleted = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6289 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6290 *p = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6291 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6293 *p++ = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6294 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6295 lbp->len = p - buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6296
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6297 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
6298 && chars_deleted > 0) /* not at EOF */
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 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
6301 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6302 /* Expand filebuf. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6303 filebuf.size *= 2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6304 xrnew (filebuf.buffer, filebuf.size, char);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6305 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6306 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
6307 filebuf.len += lbp->len;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6308 filebuf.buffer[filebuf.len++] = '\n';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6309 filebuf.buffer[filebuf.len] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6310 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6311
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6312 return lbp->len + chars_deleted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6313 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6315 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6316 * 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
6317 * 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
6318 * directives.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6319 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6320 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6321 readline (lbp, stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6322 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6323 FILE *stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6324 {
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6325 long result;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6326
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6327 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
6328 result = readline_internal (lbp, stream); /* read line */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6329 lineno += 1; /* increment global line number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6330 charno += result; /* increment global char number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6331
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6332 /* Honour #line directives. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6333 if (!no_line_directive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6334 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6335 static bool discard_until_line_directive;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6336
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6337 /* Check whether this is a #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6338 if (result > 12 && strneq (lbp->buffer, "#line ", 6))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6339 {
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
6340 unsigned int lno;
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
6341 int start = 0;
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
6342
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
6343 if (sscanf (lbp->buffer, "#line %u \"%n", &lno, &start) >= 1
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
6344 && start > 0) /* double quote character found */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6345 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6346 char *endp = lbp->buffer + start;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6347
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6348 while ((endp = etags_strchr (endp, '"')) != NULL
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6349 && endp[-1] == '\\')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6350 endp++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6351 if (endp != NULL)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6352 /* 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
6353 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6354 char *taggedabsname; /* absolute name of original file */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6355 char *taggedfname; /* name of original file as given */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6356 char *name; /* temp var */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6357
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6358 discard_until_line_directive = FALSE; /* found it */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6359 name = lbp->buffer + start;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6360 *endp = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6361 canonicalize_filename (name); /* for DOS */
3876
a827a51c3241 [xemacs-hg @ 2007-03-24 11:46:37 by stephent]
stephent
parents: 3524
diff changeset
6362 taggedabsname = absolute_filename (name, tagfiledir);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6363 if (filename_is_absolute (name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6364 || filename_is_absolute (curfdp->infname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6365 taggedfname = savestr (taggedabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6366 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6367 taggedfname = relative_filename (taggedabsname,tagfiledir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6368
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6369 if (streq (curfdp->taggedfname, taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6370 /* 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
6371 deal with this afterwards. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6372 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6373 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6374 /* The tags following this #line directive should be
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6375 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
6376 curfdp accordingly. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6377 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6378 fdesc *fdp; /* file description pointer */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6379
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6380 /* 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
6381 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
6382 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
6383 directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6384 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6385 if (streq (fdp->infname, curfdp->infname)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6386 && streq (fdp->taggedfname, taggedfname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6387 /* 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
6388 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
6389 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
6390 entries pertaining to the same file but generated
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6391 from different files (via #line directives) will
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6392 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
6393 alternatives look equivalent. The first one
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6394 destroys some apparently useless information. */
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 curfdp = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6397 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6398 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6399 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6400 /* 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
6401 input lines until the next #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6402 if (fdp == NULL) /* not found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6403 for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6404 if (streq (fdp->infabsname, taggedabsname))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6405 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6406 discard_until_line_directive = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6407 free (taggedfname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6408 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6409 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6410 /* 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
6411 now on, until the next #line directive. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6412 if (fdp == NULL) /* not found */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6413 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6414 fdp = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6415 fdhead = xnew (1, fdesc);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6416 *fdhead = *curfdp; /* copy curr. file description */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6417 fdhead->next = fdp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6418 fdhead->infname = savestr (curfdp->infname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6419 fdhead->infabsname = savestr (curfdp->infabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6420 fdhead->infabsdir = savestr (curfdp->infabsdir);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6421 fdhead->taggedfname = taggedfname;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6422 fdhead->usecharno = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6423 fdhead->prop = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6424 fdhead->written = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6425 curfdp = fdhead;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6426 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6427 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6428 free (taggedabsname);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6429 lineno = lno - 1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6430 readline (lbp, stream);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6431 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6432 } /* if a real #line directive */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6433 } /* if #line is followed by a a number */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6434 } /* if line begins with "#line " */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6435
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6436 /* 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
6437 if (discard_until_line_directive)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6438 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6439 if (result > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6440 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6441 /* 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
6442 of the line buffer. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6443 readline (lbp, stream);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6444 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6445 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6446 /* End of file. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6447 discard_until_line_directive = FALSE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6448 return;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6449 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6450 } /* if #line directives should be considered */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6451
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6452 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6453 int match;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6454 regexp *rp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6455 char *name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6456
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6457 /* Match against relevant regexps. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6458 if (lbp->len > 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6459 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
6460 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6461 /* 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
6462 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
6463 regex_tag_multiline. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6464 if ((rp->lang != NULL && rp->lang != fdhead->lang)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6465 || rp->multi_line)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6466 continue;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6467
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6468 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
6469 switch (match)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6470 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6471 case -2:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6472 /* Some error. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6473 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6474 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6475 error ("regexp stack overflow while matching \"%s\"",
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6476 rp->pattern);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6477 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6478 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6479 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6480 case -1:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6481 /* No match. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6482 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6483 case 0:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6484 /* Empty string matched. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6485 if (!rp->error_signaled)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6486 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6487 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
6488 rp->error_signaled = TRUE;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6489 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6490 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6491 default:
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6492 /* Match occurred. Construct a tag. */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6493 name = rp->name;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6494 if (name[0] == '\0')
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6495 name = NULL;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6496 else /* make a named tag */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6497 name = substitute (lbp->buffer, rp->name, &rp->regs);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6498 if (rp->force_explicit_name)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6499 /* 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
6500 pfnote (name, TRUE, lbp->buffer, match, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6501 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6502 make_tag (name, strlen (name), TRUE,
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6503 lbp->buffer, match, lineno, linecharno);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6504 break;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6505 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6506 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6507 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6508 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6509
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6511 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6512 * Return a pointer to a space of size strlen(cp)+1 allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6513 * with xnew where the string CP has been copied.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6514 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6515 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6516 savestr (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6517 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6518 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6519 return savenstr (cp, strlen (cp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6520 }
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 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6523 * 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
6524 * 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
6525 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6526 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6527 savenstr (cp, len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6528 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6529 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6530 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6531 register char *dp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6533 dp = xnew (len + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6534 strncpy (dp, cp, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6535 dp[len] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6536 return dp;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6539 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6540 * Return the ptr in sp at which the character c last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6541 * appears; NULL if not found
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6542 *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6543 * Identical to POSIX strrchr, included for portability.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6544 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6545 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6546 etags_strrchr (sp, c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6547 register const char *sp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6548 register int c;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6549 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 432
diff changeset
6550 register const char *r;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6552 r = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6553 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6554 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6555 if (*sp == c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6556 r = sp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6557 } while (*sp++);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6558 return (char *)r;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6559 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6560
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 the ptr in sp at which the character c first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6563 * appears; NULL if not found
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6564 *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6565 * Identical to POSIX strchr, included for portability.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6566 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6567 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6568 etags_strchr (sp, c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6569 register const char *sp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6570 register int c;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6572 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6573 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6574 if (*sp == c)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6575 return (char *)sp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6576 } while (*sp++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6577 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6578 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6579
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6580 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6581 * Compare two strings, ignoring case for alphabetic characters.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6582 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6583 * Same as BSD's strcasecmp, included for portability.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6584 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6585 static int
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6586 etags_strcasecmp (s1, s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6587 register const char *s1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6588 register const char *s2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6589 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6590 while (*s1 != '\0'
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6591 && (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6592 ? lowcase (*s1) == lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6593 : *s1 == *s2))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6594 s1++, s2++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6595
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6596 return (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6597 ? lowcase (*s1) - lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6598 : *s1 - *s2);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6599 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6600
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6601 /*
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6602 * Compare two strings, ignoring case for alphabetic characters.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6603 * Stop after a given number of characters
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6604 *
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6605 * Same as BSD's strncasecmp, included for portability.
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6606 */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6607 static int
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6608 etags_strncasecmp (s1, s2, n)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6609 register const char *s1;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6610 register const char *s2;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6611 register int n;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6612 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6613 while (*s1 != '\0' && n-- > 0
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6614 && (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6615 ? lowcase (*s1) == lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6616 : *s1 == *s2))
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6617 s1++, s2++;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6618
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6619 if (n < 0)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6620 return 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6621 else
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6622 return (ISALPHA (*s1) && ISALPHA (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6623 ? lowcase (*s1) - lowcase (*s2)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6624 : *s1 - *s2);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6625 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6626
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
6627 /* Skip spaces (end of string is not space), return new pointer. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6628 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6629 skip_spaces (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6630 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6631 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6632 while (iswhite (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6633 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6634 return cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6636
2554
94f848eb8e4b [xemacs-hg @ 2005-02-03 18:09:26 by james]
james
parents: 2325
diff changeset
6637 /* Skip non spaces, except end of string, return new pointer. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6638 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6639 skip_non_spaces (cp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6640 char *cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6641 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6642 while (*cp != '\0' && !iswhite (*cp))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6643 cp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6644 return cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6645 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6647 /* Print error message and exit. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6648 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6649 fatal (s1, s2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6650 char *s1, *s2;
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 error (s1, s2);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6653 exit (EXIT_FAILURE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6654 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6655
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6656 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6657 pfatal (s1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6658 char *s1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6659 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6660 perror (s1);
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6661 exit (EXIT_FAILURE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6662 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6663
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6664 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6665 suggest_asking_for_help ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6666 {
2325
9d8bfee6e672 [xemacs-hg @ 2004-10-07 14:51:11 by james]
james
parents: 2225
diff changeset
6667 fprintf (stderr, "\tTry `%s %s' for a complete list of options.\n",
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
6668 progname, NO_LONG_OPTIONS ? "-h" : "--help");
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6669 exit (EXIT_FAILURE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6672 /* 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
6673 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6674 error (s1, s2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6675 const char *s1, *s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6676 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6677 fprintf (stderr, "%s: ", progname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6678 fprintf (stderr, s1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6679 fprintf (stderr, "\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6680 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6682 /* Return a newly-allocated string whose contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6683 concatenate those of s1, s2, s3. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6684 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6685 concat (s1, s2, s3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6686 char *s1, *s2, *s3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6687 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6688 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6689 char *result = xnew (len1 + len2 + len3 + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6691 strcpy (result, s1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6692 strcpy (result + len1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6693 strcpy (result + len1 + len2, s3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6694 result[len1 + len2 + len3] = '\0';
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 result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6697 }
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6698
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6700 /* 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
6701 guess the buffer size in advance. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6702 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6703 etags_getcwd ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6704 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6705 #ifdef HAVE_GETCWD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6706 int bufsize = 200;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6707 char *path = xnew (bufsize, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6708
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6709 while (getcwd (path, bufsize) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6710 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6711 if (errno != ERANGE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6712 pfatal ("getcwd");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6713 bufsize *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6714 free (path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6715 path = xnew (bufsize, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6718 canonicalize_filename (path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6719 return path;
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 #else /* not HAVE_GETCWD */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6722 #if MSDOS
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6723
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6724 char *p, path[MAXPATHLEN + 1]; /* Fixed size is safe on MSDOS. */
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6725
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6726 getwd (path);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6727
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6728 for (p = path; *p != '\0'; p++)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6729 if (*p == '\\')
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6730 *p = '/';
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6731 else
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6732 *p = lowcase (*p);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6733
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6734 return strdup (path);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6735 #else /* not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6736 linebuffer path;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6737 FILE *pipe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6738
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6739 linebuffer_init (&path);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6740 pipe = (FILE *) popen ("pwd 2>/dev/null", "r");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6741 if (pipe == NULL || readline_internal (&path, pipe) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6742 pfatal ("pwd");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6743 pclose (pipe);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6744
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6745 return path.buffer;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6746 #endif /* not MSDOS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6747 #endif /* not HAVE_GETCWD */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6750 /* Return a newly allocated string containing the file name of FILE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6751 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
6752 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6753 relative_filename (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6754 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6755 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6756 char *fp, *dp, *afn, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6757 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6759 /* Find the common root of file and dir (with a trailing slash). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6760 afn = absolute_filename (file, cwd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6761 fp = afn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6762 dp = dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6763 while (*fp++ == *dp++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6764 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6765 fp--, dp--; /* back to the first differing char */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6766 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6767 if (fp == afn && afn[0] != '/') /* cannot build a relative name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6768 return afn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6769 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6770 do /* look at the equal chars until '/' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6771 fp--, dp--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6772 while (*fp != '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6774 /* Build a sequence of "../" strings for the resulting relative file name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6775 i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6776 while ((dp = etags_strchr (dp + 1, '/')) != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6777 i += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6778 res = xnew (3*i + strlen (fp + 1) + 1, char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6779 res[0] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6780 while (i-- > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6781 strcat (res, "../");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6783 /* 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
6784 strcat (res, fp + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6785 free (afn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6787 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6788 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6790 /* Return a newly allocated string containing the absolute file name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6791 of FILE given DIR (which should end with a slash). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6792 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6793 absolute_filename (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6794 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6796 char *slashp, *cp, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6798 if (filename_is_absolute (file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6799 res = savestr (file);
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6800 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6801 /* We don't support non-absolute file names with a drive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6802 letter, like `d:NAME' (it's too much hassle). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6803 else if (file[1] == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6804 fatal ("%s: relative file names with drive letters not supported", file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6805 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6806 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6807 res = concat (dir, file, "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6809 /* Delete the "/dirname/.." and "/." substrings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6810 slashp = etags_strchr (res, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6811 while (slashp != NULL && slashp[0] != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6812 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6813 if (slashp[1] == '.')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6814 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6815 if (slashp[2] == '.'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6816 && (slashp[3] == '/' || slashp[3] == '\0'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6817 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6818 cp = slashp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6819 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6820 cp--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6821 while (cp >= res && !filename_is_absolute (cp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6822 if (cp < res)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6823 cp = slashp; /* the absolute name begins with "/.." */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6824 #ifdef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6825 /* Under MSDOS and NT we get `d:/NAME' as absolute
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6826 file name, so the luser could say `d:/../NAME'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6827 We silently treat this as `d:/NAME'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6828 else if (cp[0] != '/')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6829 cp = slashp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6830 #endif
4768
0f5bee973a7b Etags: use memmove instead of strcpy to move characters within a string. See
Jerry James <james@xemacs.org>
parents: 3993
diff changeset
6831 memmove (cp, slashp + 3, strlen (slashp + 3) + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6832 slashp = cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6833 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6834 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6835 else if (slashp[2] == '/' || slashp[2] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6836 {
4768
0f5bee973a7b Etags: use memmove instead of strcpy to move characters within a string. See
Jerry James <james@xemacs.org>
parents: 3993
diff changeset
6837 memmove (slashp, slashp + 2, strlen (slashp + 2) + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6838 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6839 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6840 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6842 slashp = etags_strchr (slashp + 1, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6843 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6844
3517
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
6845 if (res[0] == '\0') /* just a safety net: should never happen */
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
6846 {
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
6847 free (res);
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
6848 return savestr ("/");
10ee8fade35d [xemacs-hg @ 2006-07-19 15:22:34 by stephent]
stephent
parents: 3090
diff changeset
6849 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6850 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6851 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6852 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6854 /* Return a newly allocated string containing the absolute
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6855 file name of dir where FILE resides given DIR (which should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6856 end with a slash). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6857 static char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6858 absolute_dirname (file, dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6859 char *file, *dir;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6860 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6861 char *slashp, *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6862 char save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6864 canonicalize_filename (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6865 slashp = etags_strrchr (file, '/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6866 if (slashp == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6867 return savestr (dir);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6868 save = slashp[1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6869 slashp[1] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6870 res = absolute_filename (file, dir);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6871 slashp[1] = save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6873 return res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6874 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6875
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6876 /* Whether the argument string is an absolute file name. The argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6877 string must have been canonicalized with canonicalize_filename. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6878 static bool
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6879 filename_is_absolute (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6880 char *fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6881 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6882 return (fn[0] == '/'
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6883 #ifdef DOS_NT
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6884 || (ISALPHA(fn[0]) && fn[1] == ':' && fn[2] == '/')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6885 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6886 );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6889 /* Translate backslashes into slashes. Works in place. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
6890 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6891 canonicalize_filename (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6892 register char *fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6893 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6894 #ifdef DOS_NT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6895 /* Canonicalize drive letter case. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6896 if (fn[0] != '\0' && fn[1] == ':' && ISLOWER (fn[0]))
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6897 fn[0] = upcase (fn[0]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6898 /* Convert backslashes to slashes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6899 for (; *fn != '\0'; fn++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6900 if (*fn == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6901 *fn = '/';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6902 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6903 /* No action. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6904 fn = NULL; /* shut up the compiler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6905 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6906 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6907
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6908
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6909 /* Initialize a linebuffer for use */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6910 static void
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6911 linebuffer_init (lbp)
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6912 linebuffer *lbp;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6913 {
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6914 lbp->size = (DEBUG) ? 3 : 200;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6915 lbp->buffer = xnew (lbp->size, char);
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6916 lbp->buffer[0] = '\0';
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6917 lbp->len = 0;
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6918 }
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6919
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6920 /* 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
6921 static void
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6922 linebuffer_setlen (lbp, toksize)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6923 linebuffer *lbp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6924 int toksize;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6925 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6926 while (lbp->size <= toksize)
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6927 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6928 lbp->size *= 2;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6929 xrnew (lbp->buffer, lbp->size, char);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6930 }
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 442
diff changeset
6931 lbp->len = toksize;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6932 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6933
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6934 /* 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
6935 static PTR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6936 xmalloc (size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6937 unsigned int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6938 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6939 PTR result = (PTR) malloc (size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6940 if (result == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6941 fatal ("virtual memory exhausted", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6942 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6943 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6944
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6945 static PTR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6946 xrealloc (ptr, size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6947 char *ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6948 unsigned int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6949 {
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6950 PTR result = (PTR) realloc (ptr, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6951 if (result == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6952 fatal ("virtual memory exhausted", (char *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6953 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6954 }
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6955
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6956 /*
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6957 * Local Variables:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6958 * indent-tabs-mode: t
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6959 * tab-width: 8
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6960 * fill-column: 79
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6961 * c-font-lock-extra-types: ("FILE" "bool" "language" "linebuffer" "fdesc" "node" "regexp")
3972
6cd3955b7e4d [xemacs-hg @ 2007-05-21 03:50:13 by stephent]
stephent
parents: 3877
diff changeset
6962 * c-file-style: "gnu"
709
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6963 * End:
1df7a5cfb04a [xemacs-hg @ 2001-12-20 07:58:18 by yoshiki]
yoshiki
parents: 531
diff changeset
6964 */
2225
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6965
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6966 /* arch-tag: 8a9b748d-390c-4922-99db-2eeefa921051
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6967 (do not change this comment) */
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6968
4968c73cb252 [xemacs-hg @ 2004-08-20 04:40:08 by james]
james
parents: 920
diff changeset
6969 /* etags.c ends here */