annotate man/makeinfo.c @ 2:ac2d302a0011 r19-15b2

Import from CVS: tag r19-15b2
author cvs
date Mon, 13 Aug 2007 08:46:35 +0200
parents 376386a54a3c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Makeinfo -- convert texinfo format files into info files.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 Copyright (C) 1987, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 Copyright (C) 1994, 1995 Sun Microsystems.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 Copyright (C) 1995 Amdahl Corporation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 This file is part of GNU Info.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 Makeinfo is distributed in the hope that it will be useful,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 but WITHOUT ANY WARRANTY. No author or distributor accepts
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 responsibility to anyone for the consequences of using it or for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 whether it serves any particular purpose or works at all, unless he
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 says so in writing. Refer to the GNU Emacs General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 for full details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 Everyone is granted permission to copy, modify and redistribute
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 Makeinfo, but only under the conditions described in the GNU Emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 General Public License. A copy of this license is supposed to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 have been given to you along with GNU Emacs so you can know your
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 rights and responsibilities. It should be in a file named COPYING.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 Among other things, the copyright notice and this notice must be
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 preserved on all copies. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 /* This is Makeinfo version 1.63. If you change the version number of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 Makeinfo, please change it here and at the lines reading:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 int major_version = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 int minor_version = 63;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 in the code below.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 Makeinfo is authored by Brian Fox (bfox@ai.mit.edu).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 March 1994: additions by Ben Wing (wing@netcom.com).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 #if defined (HAVE_CONFIG_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 #include <config.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 #endif /* HAVE_CONFIG_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 /* You can change some of the behaviour of Makeinfo by changing the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 following defines: */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 /* Define INDENT_PARAGRAPHS_IN_TABLE if you want the paragraphs which
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 appear within an @table, @ftable, or @itemize environment to have
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 standard paragraph indentation. Without this, such paragraphs have
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 no starting indentation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 /* #define INDENT_PARAGRAPHS_IN_TABLE */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 /* Define DEFAULT_INDENTATION_INCREMENT as an integer which is the amount
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 that @example should increase indentation by. This incremement is used
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 for all insertions which indent the enclosed text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 #define DEFAULT_INDENTATION_INCREMENT 5
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 /* Define PARAGRAPH_START_INDENT to be the amount of indentation that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 the first lines of paragraphs receive by default, where no other
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 value has been specified. Users can change this value on the command
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 line, with the --paragraph-indent option, or within the texinfo file,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 with the @paragraphindent command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 #define PARAGRAPH_START_INDENT 3
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 /* Define DEFAULT_PARAGRAPH_SPACING as the number of blank lines that you
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 wish to appear between paragraphs. A value of 1 creates a single blank
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 line between paragraphs. Paragraphs are defined by 2 or more consecutive
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 newlines in the input file (i.e., one or more blank lines). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 #define DEFAULT_PARAGRAPH_SPACING 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 /* Define HAVE_MACROS to enable the macro facility of TeXinfo. Using this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 facility, users can create their own command procedures with arguments. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 #define HAVE_MACROS
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 /* Include File Declarations */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 /* Indent #pragma so that older Cpp's don't try to parse it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 #if defined (_AIX)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 # pragma alloca
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 #endif /* _AIX */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 #include <stdio.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 #include <unistd.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 #include <sys/types.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 #include <ctype.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 #include <sys/stat.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 #include <pwd.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 #include <errno.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 #include <stdarg.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 #include "getopt.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 #if defined (HAVE_UNISTD_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 #include <unistd.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 #endif /* HAVE_UNISTD_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 #if defined (VMS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 #include <perror.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 #include <stdlib.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 #if defined (HAVE_STRING_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 #include <string.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 #define HAVE_STRDUP
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 #define HAVE_STRCASECMP
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 #include <strings.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 #endif /* !HAVE_STRING_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 #if defined (TM_IN_SYS_TIME)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 #include <sys/time.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 #include <time.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 #endif /* !TM_IN_SYS_TIME */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 #if defined (HAVE_SYS_FCNTL_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 #include <sys/fcntl.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 #include <fcntl.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 #endif /* !HAVE_SYS_FCNTL_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 #if defined (HAVE_SYS_FILE_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 #include <sys/file.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 #endif /* HAVE_SYS_FILE_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 #if defined (__GNUC__) && !defined (alloca)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 #define alloca __builtin_alloca
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 #if defined(HAVE_ALLOCA_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 #include <alloca.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 #else /* !HAVE_ALLOCA_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 #if !defined (_AIX)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 extern char *alloca ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 #endif /* !_AIX */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 #endif /* !HAVE_ALLOCA_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 #endif /* !__GNUC__ */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 #ifdef __SUNPRO_C
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 void *__builtin_alloca (unsigned int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 static void *xmalloc (unsigned int), *xrealloc (void *, unsigned int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 #if defined (__osf__)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 extern void *malloc (), *realloc ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 #endif /* __osf__ */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 static char **get_brace_args (int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 static int array_len (char **);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 static void free_array (char **);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 static void isolate_nodename (char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 /* Non-zero means that we are currently hacking the insides of an
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 insertion which would use a fixed width font. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 static int in_fixed_width_font = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 /* Non-zero means that start_paragraph () MUST be called before we pay
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 any attention to close_paragraph () calls. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 int must_start_paragraph = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 /* Non-zero means a string is in execution, as opposed to a file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 static int executing_string = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 /* If non-NULL, this is an output stream to write the full macro expansion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 of the input text to. The resultant file is another texinfo file, but
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 missing @include, @infoinclude, @macro, and macro invocations. Instead,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 all of the text is placed within the file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 FILE *macro_expansion_output_stream = (FILE *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 /* Here is a structure used to remember input text strings and offsets
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 within them. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 typedef struct {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 char *pointer; /* Pointer to the input text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 int offset; /* Offset of the last character output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 } ITEXT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 static ITEXT **itext_info = (ITEXT **)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 static int itext_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 /* Non-zero means to inhibit the writing of macro expansions to the output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 stream. This is used in special cases where the output has already been
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 written. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 int me_inhibit_expansion = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 static ITEXT *remember_itext (char *, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 static void forget_itext (char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 static void me_append_before_this_command (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 static void append_to_expansion_output (int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 static void write_region_to_macro_output (char *, int, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 static void maybe_write_itext (char *, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 static void me_execute_string (char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 /* Some systems don't declare this function in pwd.h. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 struct passwd *getpwnam ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 /* Global Defines */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 /* Error levels */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 #define NO_ERROR 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 #define SYNTAX 2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 #define FATAL 4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 /* C's standard macros don't check to make sure that the characters being
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 changed are within range. So I have to check explicitly. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 /* GNU Library doesn't have toupper(). Until GNU gets this fixed, I will
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 have to do it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 #ifndef toupper
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 #define toupper(c) ((c) - 32)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 #define coerce_to_upper(c) ((islower(c) ? toupper(c) : (c)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 #define coerce_to_lower(c) ((isupper(c) ? tolower(c) : (c)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 #define control_character_bit 0x40 /* %01000000, must be off. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 #define meta_character_bit 0x080/* %10000000, must be on. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 #define CTL(c) ((c) & (~control_character_bit))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 #define UNCTL(c) coerce_to_upper(((c)|control_character_bit))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 #define META(c) ((c) | (meta_character_bit))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 #define UNMETA(c) ((c) & (~meta_character_bit))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 #define whitespace(c) (((c) == '\t') || ((c) == ' '))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 #define sentence_ender(c) ((c) == '.' || (c) == '?' || (c) == '!')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 #define cr_or_whitespace(c) (((c) == '\t') || ((c) == ' ') || ((c) == '\n'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 #ifndef isletter
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 #define isletter(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 #ifndef isupper
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 #define isupper(c) ((c) >= 'A' && (c) <= 'Z')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 #ifndef isdigit
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 #define isdigit(c) ((c) >= '0' && (c) <= '9')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 #ifndef digit_value
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 #define digit_value(c) ((c) - '0')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 #define member(c, s) (strchr (s, c) != NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 #define COMMAND_PREFIX '@'
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 /* Stuff for splitting large files. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 #define SPLIT_SIZE_THRESHOLD 70000 /* What's good enough for Stallman... */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 #define DEFAULT_SPLIT_SIZE 50000 /* Is probably good enough for me. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 int splitting = 1; /* Always true for now. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 typedef void COMMAND_FUNCTION (); /* So I can say COMMAND_FUNCTION *foo; */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 /* Global Variables */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 /* Global pointer to argv[0]. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 char *progname;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 /* The current input file state. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 char *input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 char *input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 int size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 int input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 int line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 #define curchar() input_text[input_text_offset]
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 #define command_char(c) ((!whitespace(c)) && \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 ((c) != '\n') && \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 ((c) != '{') && \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 ((c) != '}') && \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282 ((c) != '='))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 #define skip_whitespace() while (input_text_offset != size_of_input_text \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285 && whitespace(curchar()))\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 input_text_offset++
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 #define skip_whitespace_and_newlines() \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 do { \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290 while (input_text_offset != size_of_input_text \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 && (whitespace (curchar ()) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 || (curchar () == '\n'))) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293 { \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 if (curchar () == '\n') \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 line_number++; \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 input_text_offset++; \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 } \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 } while (0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 /* Return non-zero if STRING is the text at input_text + input_text_offset,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301 else zero. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302 #define looking_at(string) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 (strncmp (input_text + input_text_offset, string, strlen (string)) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 /* And writing to the output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 /* The output file name. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 char *output_filename = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 char *pretty_output_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311 /* Name of the output file that the user elected to pass on the command line.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 Such a name overrides any name found with the @setfilename command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 char *command_output_filename = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 /* A colon separated list of directories to search for files included
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 with @include. This can be controlled with the `-I' option to makeinfo. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 char *include_files_path = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 /* Current output stream. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 FILE *output_stream;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 /* Position in the output file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 int output_position;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 /* Output paragraph buffer. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 unsigned char *output_paragraph;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 /* Offset into OUTPUT_PARAGRAPH. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 int output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 /* The output paragraph "cursor" horizontal position. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 int output_column = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 /* Non-zero means output_paragraph contains text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335 int paragraph_is_open = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337 #define INITIAL_PARAGRAPH_SPACE 5000
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 int paragraph_buffer_len = INITIAL_PARAGRAPH_SPACE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340 /* Filling.. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 /* Non-zero indicates that filling will take place on long lines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 int filling_enabled = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 /* Non-zero means that words are not to be split, even in long lines. This
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 gets changed for cm_w (). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 int non_splitting_words = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 /* Non-zero indicates that filling a line also indents the new line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 int indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 /* The column at which long lines are broken. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 int fill_column = 72;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 /* The amount of indentation to apply at the start of each line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 int current_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 /* The amount of indentation to add at the starts of paragraphs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 0 means don't change existing indentation at paragraph starts.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 > 0 is amount to indent new paragraphs by.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 < 0 means indent to column zero by removing indentation if necessary.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 This is normally zero, but some people prefer paragraph starts to be
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 somewhat more indented than paragraph bodies. A pretty value for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 this is 3. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 int paragraph_start_indent = PARAGRAPH_START_INDENT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367 /* Non-zero means that the use of paragraph_start_indent is inhibited.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 @example uses this to line up the left columns of the example text.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 A negative value for this variable is incremented each time it is used.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 @noindent uses this to inhibit indentation for a single paragraph. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371 int inhibit_paragraph_indentation = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373 /* Indentation that is pending insertion. We have this for hacking lines
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 which look blank, but contain whitespace. We want to treat those as
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 blank lines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376 int pending_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 /* The amount that indentation increases/decreases by. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 int default_indentation_increment = DEFAULT_INDENTATION_INCREMENT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 /* Non-zero indicates that indentation is temporarily turned off. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 int no_indent = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 /* Non-zero means forcing output text to be flushright. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385 int force_flush_right = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387 /* Non-zero means that the footnote style for this document was set on
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 the command line, which overrides any other settings. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 int footnote_style_preset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 /* Non-zero means that we automatically number footnotes that have no
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
392 specified marker. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393 int number_footnotes = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 /* The current footnote number in this node. Each time a new node is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
396 started this is reset to 1. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
397 int current_footnote_number = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
398
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
399 /* Command name in the process of being hacked. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
400 char *command;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
401
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
402 /* The index in our internal command table of the currently
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
403 executing command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
404 int command_index;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
405
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
406 /* A search string which is used to find a line defining a node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
407 char node_search_string[] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
408 { '\n', COMMAND_PREFIX, 'n', 'o', 'd', 'e', ' ', '\0' };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
409
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
410 /* A search string which is used to find a line defining a menu. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
411 char menu_search_string[] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
412 { '\n', COMMAND_PREFIX, 'm', 'e', 'n', 'u', '\0' };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
413
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
414 /* A search string which is used to find the first @setfilename. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
415 char setfilename_search[] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
416 { COMMAND_PREFIX,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
417 's', 'e', 't', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\0' };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
418
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
419 /* A stack of file information records. If a new file is read in with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
420 "@input", we remember the old input file state on this stack. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
421 typedef struct fstack
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
422 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
423 struct fstack *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
424 char *filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
425 char *text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
426 int size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
427 int offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
428 int line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
429 } FSTACK;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
430
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
431 FSTACK *filestack = (FSTACK *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
432
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
433 /* Stuff for nodes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
434 /* The current nodes node name. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
435 char *current_node = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
436
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
437 /* The current nodes section level. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
438 int current_section = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
439
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
440 /* The filename of the current input file. This is never freed. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
441 char *node_filename = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
442
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
443 /* What we remember for each node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
444 typedef struct tentry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
445 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
446 struct tentry *next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
447 char *node; /* name of this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
448 char *prev; /* name of "Prev:" for this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
449 char *next; /* name of "Next:" for this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
450 char *up; /* name of "Up:" for this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
451 int position; /* output file position of this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
452 int line_no; /* defining line in source file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
453 char *filename; /* The file that this node was found in. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
454 int touched; /* non-zero means this node has been referenced. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
455 int flags; /* Room for growth. Right now, contains 1 bit. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
456 } TAG_ENTRY;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
457
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
458 /* If node-a has a "Next" for node-b, but node-b has no "Prev" for node-a,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
459 we turn on this flag bit in node-b's tag entry. This means that when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
460 it is time to validate node-b, we don't report an additional error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
461 if there was no "Prev" field. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
462 #define PREV_ERROR 0x1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
463 #define NEXT_ERROR 0x2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
464 #define UP_ERROR 0x4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
465 #define NO_WARN 0x8
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
466 #define IS_TOP 0x10
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
467
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
468 TAG_ENTRY *tag_table = (TAG_ENTRY *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
469
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
470 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
471 #define ME_RECURSE 0x01
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
472 #define ME_QUOTE_ARG 0x02
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
473
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
474 /* Macro definitions for user-defined commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
475 typedef struct {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
476 char *name; /* Name of the macro. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
477 char **arglist; /* Args to replace when executing. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
478 char *body; /* Macro body. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
479 char *source_file; /* File where this macro is defined. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
480 int source_lineno; /* Line number within FILENAME. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
481 int inhibited; /* Non-zero means make find_macro () fail. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
482 int flags; /* ME_RECURSE, ME_QUOTE_ARG, etc. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
483 } MACRO_DEF;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
484
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
485 static void add_macro (char *name, char **arglist, char *body,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
486 char *source_file, int source_lineno, int flags);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
487 static void execute_macro (MACRO_DEF *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
488 static MACRO_DEF *find_macro (char *), *delete_macro (char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
489 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
490
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
491 /* Menu reference, *note reference, and validation hacking. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
492
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
493 /* The various references that we know about. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
494 enum reftype
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
495 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
496 menu_reference, followed_reference
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
497 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
498
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
499 /* A structure to remember references with. A reference to a node is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
500 either an entry in a menu, or a cross-reference made with [px]ref. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
501 typedef struct node_ref
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
502 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
503 struct node_ref *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
504 char *node; /* Name of node referred to. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
505 char *containing_node; /* Name of node containing this reference. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
506 int line_no; /* Line number where the reference occurs. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
507 int section; /* Section level where the reference occurs. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
508 char *filename; /* Name of file where the reference occurs. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
509 enum reftype type; /* Type of reference, either menu or note. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
510 } NODE_REF;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
511
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
512 /* The linked list of such structures. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
513 NODE_REF *node_references = (NODE_REF *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
514
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
515 /* Flag which tells us whether to examine menu lines or not. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
516 int in_menu = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
517
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
518 /* Non-zero means that we have seen "@top" once already. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
519 int top_node_seen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
520
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
521 /* Non-zero means that we have seen a non-"@top" node already. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
522 int non_top_node_seen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
523
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
524 /* Flags controlling the operation of the program. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
525
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
526 /* Default is to notify users of bad choices. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
527 int print_warnings = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
528
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
529 /* Default is to check node references. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
530 int validating = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
531
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
532 /* Non-zero means do not output "Node: Foo" for node separations. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
533 int no_headers = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
534
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
535 /* Number of errors that we tolerate on a given fileset. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
536 int max_error_level = 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
537
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
538 /* Maximum number of references to a single node before complaining. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
539 int reference_warning_limit = 1000;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
540
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
541 /* Non-zero means print out information about what is going on when it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
542 is going on. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
543 int verbose_mode = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
544
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
545 /* Non-zero means to be relaxed about the input file. This is useful when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
546 we can successfully format the input, but it doesn't strictly match our
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
547 somewhat pedantic ideas of correctness. Right now, it affects what
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
548 @table and @itemize do without arguments. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
549 int allow_lax_format = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
550
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
551 /* Count of @ifinfo commands seen. @ifinfo is handled specially
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
552 to allow non-hierarchical contstructions like
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
553
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
554 @ifinfo
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
555 @table foo
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
556 @end ifinfo
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
557 */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
558 int ifinfo_count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
559
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
560 /* The list of commands that we hack in texinfo. Each one
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
561 has an associated function. When the command is encountered in the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
562 text, the associated function is called with START as the argument.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
563 If the function expects arguments in braces, it remembers itself on
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
564 the stack. When the corresponding close brace is encountered, the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
565 function is called with END as the argument. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
566
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
567 #define START 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
568 #define END 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
569
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
570 typedef struct brace_element
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
571 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
572 struct brace_element *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
573 COMMAND_FUNCTION *proc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
574 int pos, line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
575 } BRACE_ELEMENT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
576
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
577 BRACE_ELEMENT *brace_stack = (BRACE_ELEMENT *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
578
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
579 /* Forward declarations. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
580 #if !defined (HAVE_STRDUP)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
581 extern char *strdup ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
582 #endif /* HAVE_STRDUP */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
583
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
584 static void convert_from_stream (FILE *, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
585 static void convert_from_file (char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
586 static void top_defindex (char *, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
587
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
588 static void insert_self (), cm_ignore_line (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
589
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
590 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
591 cm_asterisk (void), cm_dots (int), cm_bullet (int), cm_TeX (int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
592 cm_copyright (int), cm_code (int), cm_samp (int), cm_file (int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
593 cm_kbd (int), cm_key (int), cm_ctrl (int, int, int), cm_var (int, int, int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
594 cm_dfn (int, int), cm_emph (int), cm_strong (int, int), cm_cite (int, int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
595 cm_italic (int, int, int), cm_bold (int, int, int), cm_roman (int, int, int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
596 cm_title (int, int, int), cm_w (int, int, int), cm_refill (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
597 cm_titlefont (int, int, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
598
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
599 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
600 cm_chapter (void), cm_unnumbered (void), cm_appendix (void), cm_top (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
601 cm_section (void), cm_unnumberedsec (void), cm_appendixsec (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
602 cm_subsection (void), cm_unnumberedsubsec (void), cm_appendixsubsec (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
603 cm_subsubsection (void), cm_unnumberedsubsubsec (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
604 cm_appendixsubsubsec (void), cm_heading (void), cm_chapheading (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
605 cm_subheading (void), cm_subsubheading (void), cm_majorheading (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
606 cm_raisesections (void), cm_lowersections (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
607
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
608 /* All @defxxx commands map to cm_defun (). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
609 static void cm_defun (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
610
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
611 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
612 cm_node (void), cm_menu (void), cm_xref (int), cm_ftable (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
613 cm_vtable (void), cm_pxref (int), cm_inforef (int), cm_quotation (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
614 cm_display (void), cm_itemize (void), cm_enumerate (void), cm_table (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
615 cm_itemx (void), cm_noindent (void), cm_setfilename (void), cm_br (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
616 cm_sp (void), cm_group (void), cm_center (void), cm_include (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
617 cm_bye (void), cm_item (void), cm_end (void), cm_infoinclude (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
618 cm_ifinfo (void), cm_kindex (void), cm_cindex (void), cm_findex (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
619 cm_pindex (void), cm_vindex (void), cm_tindex (void), cm_asis (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
620 cm_synindex (void), cm_printindex (void), cm_minus (int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
621 cm_footnote (void), cm_force_abbreviated_whitespace (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
622 cm_example (void), cm_smallexample (void), cm_lisp (void), cm_format (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
623 cm_exdent (void), cm_defindex (void), cm_defcodeindex (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
624 cm_sc (int, int, int), cm_result (int), cm_expansion (int), cm_equiv (int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
625 cm_print (int), cm_error (int), cm_point (int), cm_today (int),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
626 cm_flushleft (void), cm_flushright (void), cm_smalllisp (void),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
627 cm_math (void), cm_cartouche (void), cm_ignore_sentence_ender (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
628
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
629 /* Conditionals. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
630 static void cm_set (void), cm_clear (void), cm_ifset (void), cm_ifclear (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
631 static void cm_value (int, int, int), cm_ifeq (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
632
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
633 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
634 /* Define a user-defined command which is simple substitution. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
635 static void cm_macro (void), cm_unmacro (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
636 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
637
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
638 /* Options. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
639 static void cm_paragraphindent (void), cm_footnotestyle (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
640
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
641 /* Internals. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
642 static void do_nothing (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
643 static void command_name_condition (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
644 static void insert_self (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
645 static void misplaced_brace (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
646 static void cm_obsolete (int arg, int start, int end);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
647
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
648 static int error (char *, ...);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
649 static int line_error (char *, ...);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
650 static int warning (char *, ...);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
651 static void add_word_args (char *, ...);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
652 static void execute_string (char *, ...);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
653
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
654 static void print_version_info (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
655 static void memory_error (char *callers_name, int bytes_wanted);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
656 static void usage (FILE *stream, int exit_value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
657 static void push_node_filename (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
658 static void pop_node_filename (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
659 static void remember_error (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
660 static void init_internals (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
661 static void init_paragraph (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
662 static void reader_loop (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
663 static void read_command (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
664 static void init_brace_stack (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
665 static void remember_brace (COMMAND_FUNCTION *proc);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
666 static void remember_brace_1 (COMMAND_FUNCTION *proc, int position);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
667 static void discard_braces (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
668 static void add_word (char *string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
669 static void add_char (int character);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
670 static void insert (int character);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
671 static void flush_output (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
672 static void close_paragraph_with_lines (int lines);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
673 static void close_paragraph (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
674 static void ignore_blank_line (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
675 static void do_flush_right_indentation (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
676 static void start_paragraph (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
677 static void indent (int amount);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
678 static void init_insertion_stack (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
679 static void init_tag_table (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
680 static void write_tag_table (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
681 static void write_tag_table_internal (int indirect_p);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
682 static void normalize_node_name (char *string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
683 static void validate_file (TAG_ENTRY *tag_tayble);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
684 static void split_file (char *filename, int size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
685 static void validate_other_references (register NODE_REF *ref_list);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
686 static NODE_REF *find_node_reference (char *node, register NODE_REF *ref_list);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
687 static void do_enumeration (int type, char *default_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
688 static void handle_variable (int action);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
689 static void handle_variable_internal (int action, char *name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
690 static void init_indices (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
691 static void undefindex (char *name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
692 static void defindex (char *name, int code);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
693 static void gen_defindex (int code);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
694 static void define_user_command (char *name, COMMAND_FUNCTION *proc,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
695 int needs_braces_p);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
696 static void convert_from_loaded_file (char *name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
697 static void free_pending_notes (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
698 static void output_pending_notes (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
699 static void free_node_references (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
700 static int set_paragraph_indent (char *string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
701 static int set_footnote_style (char *string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
702 static int self_delimiting (int character);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
703 static int search_forward (char *string, int from);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
704 static int validate (char *tag, int line, char *label);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
705 static void pop_and_call_brace (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
706 static char *expand_filename (char *filename, char *input_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
707 static char *filename_part (char *filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
708 static char *full_pathname (char *filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
709 static char *get_file_info_in_path (char *filename, char *path,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
710 struct stat *finfo);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
711 static char *glean_node_from_menu (int remember_reference);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
712
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
713 typedef struct
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
714 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
715 char *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
716 COMMAND_FUNCTION *proc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
717 int argument_in_braces;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
718 } COMMAND;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
719
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
720 /* Stuff for defining commands on the fly. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
721 COMMAND **user_command_array = (COMMAND **) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
722 int user_command_array_len = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
723
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
724 #define NO_BRACE_ARGS 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
725 #define BRACE_ARGS 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
726
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
727 static COMMAND CommandTable[] = {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
728 { "!", cm_ignore_sentence_ender, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
729 { "'", insert_self, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
730 { "*", cm_asterisk, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
731 { ".", cm_ignore_sentence_ender, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
732 { ":", cm_force_abbreviated_whitespace, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
733 { "?", cm_ignore_sentence_ender, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
734 { "|", do_nothing, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
735 { "@", insert_self, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
736 { " ", insert_self, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
737 { "\n", insert_self, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
738 { "TeX", cm_TeX, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
739 { "`", insert_self, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
740 { "appendix", cm_appendix, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
741 { "appendixsection", cm_appendixsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
742 { "appendixsec", cm_appendixsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
743 { "appendixsubsec", cm_appendixsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
744 { "appendixsubsubsec", cm_appendixsubsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
745 { "asis", cm_asis, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
746 { "b", cm_bold, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
747 { "br", cm_br, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
748 { "bullet", cm_bullet, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
749 { "bye", cm_bye, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
750 { "c", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
751 { "cartouche", cm_cartouche, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
752 { "center", cm_center, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
753 { "chapheading", cm_chapheading, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
754 { "chapter", cm_chapter, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
755 { "cindex", cm_cindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
756 { "cite", cm_cite, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
757 { "clear", cm_clear, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
758 { "code", cm_code, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
759 { "comment", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
760 { "contents", do_nothing, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
761 { "copyright", cm_copyright, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
762 { "ctrl", cm_ctrl, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
763 { "defcodeindex", cm_defcodeindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
764 { "defindex", cm_defindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
765 { "dfn", cm_dfn, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
766
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
767 /* The `def' commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
768 { "deffn", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
769 { "deffnx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
770 { "defun", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
771 { "defunx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
772 { "defmac", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
773 { "defmacx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
774 { "defspec", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
775 { "defspecx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
776 { "defvr", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
777 { "defvrx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
778 { "defvar", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
779 { "defvarx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
780 { "defopt", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
781 { "defoptx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
782 { "deftypefn", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
783 { "deftypefnx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
784 { "deftypefun", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
785 { "deftypefunx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
786 { "deftypevr", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
787 { "deftypevrx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
788 { "deftypevar", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
789 { "deftypevarx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
790 { "defcv", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
791 { "defcvx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
792 { "defivar", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
793 { "defivarx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
794 { "defop", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
795 { "defopx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
796 { "defmethod", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
797 { "defmethodx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
798 { "deftypemethod", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
799 { "deftypemethodx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
800 { "deftp", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
801 { "deftpx", cm_defun, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
802 /* The end of the `def' commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
803
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
804 { "display", cm_display, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
805 { "dots", cm_dots, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
806 { "dmn", do_nothing, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
807 { "emph", cm_emph, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
808 { "end", cm_end, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
809 { "enumerate", cm_enumerate, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
810 { "equiv", cm_equiv, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
811 { "error", cm_error, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
812 { "example", cm_example, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
813 { "exdent", cm_exdent, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
814 { "expansion", cm_expansion, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
815 { "file", cm_file, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
816 { "findex", cm_findex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
817 { "finalout", do_nothing, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
818 { "flushleft", cm_flushleft, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
819 { "flushright", cm_flushright, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
820 { "format", cm_format, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
821 { "ftable", cm_ftable, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
822 { "group", cm_group, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
823 { "heading", cm_heading, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
824 { "headings", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
825 { "i", cm_italic, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
826 { "iappendix", cm_appendix, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
827 { "iappendixsection", cm_appendixsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
828 { "iappendixsec", cm_appendixsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
829 { "iappendixsubsec", cm_appendixsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
830 { "iappendixsubsubsec", cm_appendixsubsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
831 { "ichapter", cm_chapter, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
832 { "ifclear", cm_ifclear, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
833 { "ifeq", cm_ifeq, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
834 { "ifhtml", command_name_condition, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
835 { "ifinfo", cm_ifinfo, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
836 { "ifset", cm_ifset, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
837 { "iftex", command_name_condition, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
838 { "ignore", command_name_condition, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
839 { "include", cm_include, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
840 { "inforef", cm_inforef, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
841 { "input", cm_include, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
842 { "isection", cm_section, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
843 { "isubsection", cm_subsection, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
844 { "isubsubsection", cm_subsubsection, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
845 { "item", cm_item, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
846 { "itemize", cm_itemize, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
847 { "itemx", cm_itemx, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
848 { "iunnumbered", cm_unnumbered, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
849 { "iunnumberedsec", cm_unnumberedsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
850 { "iunnumberedsubsec", cm_unnumberedsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
851 { "iunnumberedsubsubsec", cm_unnumberedsubsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
852 { "kbd", cm_kbd, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
853 { "key", cm_key, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
854 { "kindex", cm_kindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
855 { "lowersections", cm_lowersections, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
856 { "lisp", cm_lisp, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
857 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
858 { "macro", cm_macro, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
859 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
860 { "majorheading", cm_majorheading, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
861 { "math", cm_math, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
862 { "medbreak", cm_br, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
863 { "menu", cm_menu, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
864 { "minus", cm_minus, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
865 { "need", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
866 { "node", cm_node, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
867 { "noindent", cm_noindent, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
868 { "nwnode", cm_node, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
869 { "overfullrule", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
870 { "page", do_nothing, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
871 { "pindex", cm_pindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
872 { "point", cm_point, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
873 { "print", cm_print, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
874 { "printindex", cm_printindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
875 { "pxref", cm_pxref, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
876 { "quotation", cm_quotation, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
877 { "r", cm_roman, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
878 { "raisesections", cm_raisesections, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
879 { "ref", cm_xref, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
880 { "refill", cm_refill, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
881 { "result", cm_result, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
882 { "samp", cm_samp, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
883 { "sc", cm_sc, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
884 { "section", cm_section, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
885 { "set", cm_set, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
886 { "setchapternewpage", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
887 { "setchapterstyle", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
888 { "setfilename", cm_setfilename, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
889 { "settitle", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
890 { "shortcontents", do_nothing, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
891 { "shorttitlepage", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
892 { "smallbook", cm_ignore_line, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
893 { "smallbreak", cm_br, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
894 { "smallexample", cm_smallexample, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
895 { "smalllisp", cm_smalllisp, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
896 { "sp", cm_sp, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
897 { "strong", cm_strong, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
898 { "subheading", cm_subheading, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
899 { "subsection", cm_subsection, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
900 { "subsubheading", cm_subsubheading, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
901 { "subsubsection", cm_subsubsection, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
902 { "summarycontents", do_nothing, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
903 { "syncodeindex", cm_synindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
904 { "synindex", cm_synindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
905 { "t", cm_title, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
906 { "table", cm_table, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
907 { "tex", command_name_condition, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
908 { "tindex", cm_tindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
909 { "titlefont", cm_titlefont, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
910 { "titlepage", command_name_condition, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
911 { "titlespec", command_name_condition, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
912 { "today", cm_today, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
913 { "top", cm_top, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
914 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
915 { "unmacro", cm_unmacro, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
916 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
917 { "unnumbered", cm_unnumbered, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
918 { "unnumberedsec", cm_unnumberedsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
919 { "unnumberedsubsec", cm_unnumberedsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
920 { "unnumberedsubsubsec", cm_unnumberedsubsubsec, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
921 { "value", cm_value, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
922 { "var", cm_var, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
923 { "vindex", cm_vindex, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
924 { "vtable", cm_vtable, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
925 { "w", cm_w, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
926 { "xref", cm_xref, BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
927 { "{", insert_self, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
928 { "}", insert_self, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
929
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
930 /* Some obsoleted commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
931 { "infotop", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
932 { "infounnumbered", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
933 { "infounnumberedsec", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
934 { "infounnumberedsubsec", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
935 { "infounnumberedsubsubsec", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
936 { "infoappendix", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
937 { "infoappendixsec", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
938 { "infoappendixsubsec", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
939 { "infoappendixsubsubsec", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
940 { "infochapter", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
941 { "infosection", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
942 { "infosubsection", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
943 { "infosubsubsection", cm_obsolete, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
944
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
945 /* Now @include does what this was supposed to. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
946 { "infoinclude", cm_infoinclude, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
947 { "footnote", cm_footnote, NO_BRACE_ARGS}, /* self-arg eater */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
948 { "footnotestyle", cm_footnotestyle, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
949 { "paragraphindent", cm_paragraphindent, NO_BRACE_ARGS },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
950
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
951 {(char *) NULL, (COMMAND_FUNCTION *) NULL, NO_BRACE_ARGS}};
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
952
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
953 int major_version = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
954 int minor_version = 63;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
955
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
956 struct option long_options[] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
957 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
958 { "error-limit", 1, 0, 'e' }, /* formerly -el */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
959 { "fill-column", 1, 0, 'f' }, /* formerly -fc */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
960 { "footnote-style", 1, 0, 's' }, /* formerly -ft */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
961 { "no-headers", 0, &no_headers, 1 }, /* Do not output Node: foo */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
962 { "no-pointer-validate", 0, &validating, 0 }, /* formerly -nv */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
963 { "no-validate", 0, &validating, 0 }, /* formerly -nv */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
964 { "no-split", 0, &splitting, 0 }, /* formerly -ns */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
965 { "no-warn", 0, &print_warnings, 0 }, /* formerly -nw */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
966 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
967 { "macro-expand", 1, 0, 'E' },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
968 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
969 { "number-footnotes", 0, &number_footnotes, 1 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
970 { "no-number-footnotes", 0, &number_footnotes, 0 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
971 { "output", 1, 0, 'o' },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
972 { "paragraph-indent", 1, 0, 'p' }, /* formerly -pi */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
973 { "reference-limit", 1, 0, 'r' }, /* formerly -rl */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
974 { "verbose", 0, &verbose_mode, 1 }, /* formerly -verbose */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
975 { "help", 0, 0, 'h' },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
976 { "version", 0, 0, 'V' },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
977 {NULL, 0, NULL, 0}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
978 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
979
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
980 /* Values for calling handle_variable_internal (). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
981 #define SET 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
982 #define CLEAR 2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
983 #define IFSET 3
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
984 #define IFCLEAR 4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
985
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
986 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
987 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
988 /* Main () Start of code */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
989 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
990 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
991
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
992 /* For each file mentioned in the command line, process it, turning
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
993 texinfo commands into wonderfully formatted output text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
994 int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
995 main (int argc, char **argv)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
996 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
997 extern int errors_printed;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
998 int c, ind;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
999 int reading_from_stdin = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1000
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1001 /* The name of this program is the last filename in argv[0]. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1002 progname = filename_part (argv[0]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1003
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1004 /* Parse argument flags from the input line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1005 while ((c = getopt_long
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1006 (argc, argv,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1007 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1008 "D:E:U:I:f:o:p:e:r:s:V",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1009 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1010 "D:U:I:f:o:p:e:r:s:V",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1011 #endif /* !HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1012 long_options, &ind))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1013 != EOF)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1014 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1015 if (c == 0 && long_options[ind].flag == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1016 c = long_options[ind].val;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1017
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1018 switch (c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1019 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1020 /* User specified variable to set or clear? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1021 case 'D':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1022 case 'U':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1023 handle_variable_internal ((c == 'D') ? SET : CLEAR, optarg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1024 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1025
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1026 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1027 /* Use specified a macro expansion output file? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1028 case 'E':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1029 if (!macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1030 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1031 macro_expansion_output_stream = fopen (optarg, "w");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1032 if (!macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1033 error ("Couldn't open macro expansion output \"%s\"", optarg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1034 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1035 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1036 error ("Cannot specify more than one macro expansion output");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1037 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1038 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1039
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1040 /* User specified include file path? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1041 case 'I':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1042 if (!include_files_path)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1043 include_files_path = strdup (".");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1044
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1045 include_files_path = (char *)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1046 xrealloc (include_files_path,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1047 2 + strlen (include_files_path) + strlen (optarg));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1048 strcat (include_files_path, ":");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1049 strcat (include_files_path, optarg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1050 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1051
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1052 /* User specified fill_column? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1053 case 'f':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1054 if (sscanf (optarg, "%d", &fill_column) != 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1055 usage (stderr, FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1056 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1057
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1058 /* User specified output file? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1059 case 'o':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1060 command_output_filename = strdup (optarg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1061 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1062
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1063 /* User specified paragraph indent (paragraph_start_index)? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1064 case 'p':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1065 if (set_paragraph_indent (optarg) < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1066 usage (stderr, FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1067 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1068
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1069 /* User specified error level? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1070 case 'e':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1071 if (sscanf (optarg, "%d", &max_error_level) != 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1072 usage (stderr, FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1073 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1074
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1075 /* User specified reference warning limit? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1076 case 'r':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1077 if (sscanf (optarg, "%d", &reference_warning_limit) != 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1078 usage (stderr, FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1079 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1080
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1081 /* User specified footnote style? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1082 case 's':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1083 if (set_footnote_style (optarg) < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1084 usage (stderr, FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1085 footnote_style_preset = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1086 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1087
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1088 case 'h':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1089 usage (stdout, NO_ERROR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1090 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1091
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1092 /* User requested version info? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1093 case 'V':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1094 print_version_info ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1095 exit (NO_ERROR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1096 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1097
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1098 case '?':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1099 usage (stderr, FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1100 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1101 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1102 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1103
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1104 if (optind == argc)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1105 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1106 /* Check to see if input is a file. If so, process that. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1107 if (!isatty (fileno (stdin)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1108 reading_from_stdin = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1109 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1110 usage (stderr, FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1111 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1112
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1113 /* If the user has specified --no-headers, this should imply --no-split.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1114 Do that here. I think it might also imply that we should ignore the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1115 setfilename at the top of the file, but this might break some FSF things,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1116 so I will hold off on that. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1117 if (no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1118 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1119 splitting = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1120
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1121 /* If the user has not specified an output file, then use stdout by
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1122 default. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1123 if (!command_output_filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1124 command_output_filename = strdup ("-");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1125 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1126
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1127 if (verbose_mode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1128 print_version_info ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1129
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1130 /* Remaining arguments are file names of texinfo files.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1131 Convert them, one by one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1132 if (!reading_from_stdin)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1133 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1134 while (optind != argc)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1135 convert_from_file (argv[optind++]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1136 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1137 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1138 convert_from_stream (stdin, "stdin");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1139
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1140 if (errors_printed)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1141 return (SYNTAX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1142 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1143 return (NO_ERROR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1144 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1145
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1146 /* Display the version info of this invocation of Makeinfo. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1147 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1148 print_version_info (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1149 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1150 printf ("This is GNU Makeinfo version %d.%d.\n",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1151 major_version, minor_version);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1152 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1153
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1154 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1155 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1156 /* Generic Utilities */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1157 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1158 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1159
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1160 #if !defined (HAVE_STRDUP)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1161 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1162 strdup (string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1163 char *string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1164 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1165 char *result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1166
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1167 result = (char *)xmalloc (1 + strlen (string));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1168 strcpy (result, string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1170 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1171 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1172 #endif /* !HAVE_STRDUP */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1173
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1174 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1175 memory_error (callers_name, bytes_wanted)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1176 char *callers_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1177 int bytes_wanted;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1178 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1179 char printable_string[80];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1180
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1181 sprintf (printable_string,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1182 "Virtual memory exhausted in %s ()! Needed %d bytes.",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1183 callers_name, bytes_wanted);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1184
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1185 error (printable_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1186 abort ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1187 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1188
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1189 /* Just like malloc, but kills the program in case of fatal error. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1190 static void *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1191 xmalloc (unsigned int nbytes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1192 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1193 void *temp = (void *) malloc (nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1194
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1195 if (nbytes && temp == (void *)NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1196 memory_error ("xmalloc", nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1197
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1198 return (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1199 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1200
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1201 /* Like realloc (), but barfs if there isn't enough memory. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1202 static void *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1203 xrealloc (void *pointer, unsigned int nbytes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1204 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1205 void *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1206
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1207 if (!pointer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1208 temp = (void *)xmalloc (nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1209 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1210 temp = (void *)realloc (pointer, nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1211
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1212 if (nbytes && !temp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1213 memory_error ("xrealloc", nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1214
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1215 return (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1216 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1217
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1218 /* Tell the user how to use this program.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1219 Print the message to STREAM, and then exit with EXIT_VALUE. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1220 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1221 usage (FILE *stream, int exit_value)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1222 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1223 fprintf (stream, "Usage: %s [options] texinfo-file...\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1224 \n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1225 This program accepts as input files of texinfo commands and text\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1226 and outputs a file suitable for reading with GNU Info.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1227 \n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1228 Options:\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1229 `-I DIR' add DIR to the directory search list for including\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1230 files with the `@include' command.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1231 -D VAR define a variable, as with `@set'.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1232 -U VAR undefine a variable, as with `@clear'.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1233 -E MACRO-OFILE process macros, and output texinfo source code for TeX.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1234 --no-validate suppress node cross reference validation.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1235 --no-warn suppress warning messages (errors are still output).\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1236 --no-split suppress the splitting of large files.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1237 --no-headers suppress the output of Node: Foo headers.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1238 --verbose print information about what is being done.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1239 --version print the version number of Makeinfo.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1240 --output FILE or -o FILE\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1241 specify the output file. When you specify the\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1242 output file in this way, any `@setfilename' in the\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1243 input file is ignored.\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1244 --paragraph-indent NUM\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1245 set the paragraph indent to NUM (default %d).\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1246 --fill-column NUM set the filling column to NUM (default %d).\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1247 --error-limit NUM set the error limit to NUM (default %d).\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1248 --reference-limit NUM\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1249 set the reference warning limit to NUM (default %d).\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1250 --footnote-style STYLE\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1251 set the footnote style to STYLE. STYLE should\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1252 either be `separate' to place footnotes in their own\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1253 node, or `end', to place the footnotes at the end of\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1254 the node in which they are defined (the default).\n\
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1255 --help print this message and exit.\n\n",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1256 progname, paragraph_start_indent,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1257 fill_column, max_error_level, reference_warning_limit);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1258 exit (exit_value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1259 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1260
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1261 #if defined (MSDOS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1262
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1263 static struct passwd *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1264 getpwnam (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1265 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1266 return (struct passwd *) 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1267 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1268
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1269 #endif /* MSDOS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1270
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1271 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1272 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1273 /* Manipulating Lists */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1274 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1275 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1276
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1277 typedef struct generic_list {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1278 struct generic_list *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1279 } GENERIC_LIST;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1280
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1281 /* Reverse the chain of structures in LIST. Output the new head
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1282 of the chain. You should always assign the output value of this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1283 function to something, or you will lose the chain. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1284 static GENERIC_LIST *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1285 reverse_list (register GENERIC_LIST *list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1286 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1287 register GENERIC_LIST *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1288 register GENERIC_LIST *prev = (GENERIC_LIST *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1289
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1290 while (list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1291 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1292 next = list->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1293 list->next = prev;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1294 prev = list;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1295 list = next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1296 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1297 return (prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1298 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1299
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1300
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1301 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1302 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1303 /* Pushing and Popping Files */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1304 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1305 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1306
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1307 /* Find and load the file named FILENAME. Return a pointer to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1308 the loaded file, or NULL if it can't be loaded. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1309 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1310 find_and_load (char *filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1311 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1312 struct stat fileinfo;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1313 long file_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1314 int file = -1, count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1315 char *fullpath, *result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1316
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1317 result = fullpath = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1318
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1319 fullpath = get_file_info_in_path (filename, include_files_path, &fileinfo);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1320
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1321 if (!fullpath)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1322 goto error_exit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1323
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1324 filename = fullpath;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1325 file_size = (long) fileinfo.st_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1326
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1327 file = open (filename, O_RDONLY);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1328 if (file < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1329 goto error_exit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1330
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1331 /* Load the file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1332 result = (char *)xmalloc (1 + file_size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1333
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1334 /* VMS stat lies about the st_size value. The actual number of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1335 readable bytes is always less than this value. The arcane
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1336 mysteries of VMS/RMS are too much to probe, so this hack
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1337 suffices to make things work.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1338
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1339 BPW: same business applies under MS-DOS. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1340 #if defined (VMS) || defined (MSDOS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1341 while ((n = read (file, result + count, file_size)) > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1342 count += n;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1343 if (n == -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1344 #else /* !(VMS && MSDOS) */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1345 count = file_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1346 if (read (file, result, file_size) != file_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1347 #endif /* !(VMS && MSDOS) */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1348 error_exit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1349 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1350 if (result)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1351 free (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1352
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1353 if (fullpath)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1354 free (fullpath);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1355
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1356 if (file != -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1357 close (file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1358
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1359 return ((char *) NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1360 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1361 close (file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1362
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1363 /* Set the globals to the new file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1364 input_text = result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1365 size_of_input_text = count;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1366 input_filename = strdup (fullpath);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1367 node_filename = strdup (fullpath);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1368 input_text_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1369 line_number = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1370 /* Not strictly necessary. This magic prevents read_token () from doing
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1371 extra unnecessary work each time it is called (that is a lot of times).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1372 The SIZE_OF_INPUT_TEXT is one past the actual end of the text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1373 input_text[size_of_input_text] = '\n';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1374 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1375 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1376
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1377 /* Save the state of the current input file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1378 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1379 pushfile (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1380 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1381 FSTACK *newstack = (FSTACK *) xmalloc (sizeof (FSTACK));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1382 newstack->filename = input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1383 newstack->text = input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1384 newstack->size = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1385 newstack->offset = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1386 newstack->line_number = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1387 newstack->next = filestack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1388
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1389 filestack = newstack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1390 push_node_filename ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1391 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1392
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1393 /* Make the current file globals be what is on top of the file stack. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1394 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1395 popfile (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1396 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1397 FSTACK *tos = filestack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1398
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1399 if (!tos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1400 abort (); /* My fault. I wonder what I did? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1401
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1402 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1403 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1404 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1405 maybe_write_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1406 forget_itext (input_text);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1407 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1408 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1409
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1410 /* Pop the stack. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1411 filestack = filestack->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1412
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1413 /* Make sure that commands with braces have been satisfied. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1414 if (!executing_string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1415 discard_braces ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1416
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1417 /* Get the top of the stack into the globals. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1418 input_filename = tos->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1419 input_text = tos->text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1420 size_of_input_text = tos->size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1421 input_text_offset = tos->offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1422 line_number = tos->line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1423 free (tos);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1424
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1425 /* Go back to the (now) current node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1426 pop_node_filename ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1427 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1428
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1429 /* Flush all open files on the file stack. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1430 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1431 flush_file_stack (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1432 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1433 while (filestack)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1434 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1435 char *fname = input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1436 char *text = input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1437 popfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1438 free (fname);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1439 free (text);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1440 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1441 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1442
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1443 int node_filename_stack_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1444 int node_filename_stack_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1445 char **node_filename_stack = (char **)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1446
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1447 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1448 push_node_filename (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1449 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1450 if (node_filename_stack_index + 1 > node_filename_stack_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1451 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1452 if (!node_filename_stack)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1453 node_filename_stack =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1454 (char **)xmalloc ((node_filename_stack_size += 10)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1455 * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1456 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1457 node_filename_stack =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1458 (char **)xrealloc (node_filename_stack,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1459 (node_filename_stack_size + 10)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1460 * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1461 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1462
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1463 node_filename_stack[node_filename_stack_index] = node_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1464 node_filename_stack_index++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1465 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1466
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1467 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1468 pop_node_filename (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1469 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1470 node_filename = node_filename_stack[--node_filename_stack_index];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1471 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1472
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1473 /* Return just the simple part of the filename; i.e. the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1474 filename without the path information, or extensions.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1475 This conses up a new string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1476 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1477 filename_part (char *filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1478 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1479 char *basename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1480
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1481 basename = strrchr (filename, '/');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1482 if (!basename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1483 basename = filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1484 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1485 basename++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1486
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1487 basename = strdup (basename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1488 #if defined (REMOVE_OUTPUT_EXTENSIONS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1489
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1490 /* See if there is an extension to remove. If so, remove it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1491 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1492 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1493
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1494 temp = strrchr (basename, '.');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1495 if (temp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1496 *temp = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1497 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1498 #endif /* REMOVE_OUTPUT_EXTENSIONS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1499 return (basename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1500 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1501
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1502 /* Return the pathname part of filename. This can be NULL. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1503 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1504 pathname_part (char *filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1505 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1506 char *result = (char *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1507 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1508
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1509 filename = expand_filename (filename, "");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1510
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1511 i = strlen (filename) - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1512
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1513 while (i && filename[i] != '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1514 i--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1515 if (filename[i] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1516 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1517
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1518 if (i)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1519 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1520 result = (char *)xmalloc (1 + i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1521 strncpy (result, filename, i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1522 result[i] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1523 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1524 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1525 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1526 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1527
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1528 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1529 filename_non_directory (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1530 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1531 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1532
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1533 for (i = strlen (name) - 1; i; i--)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1534 if (name[i] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1535 return (strdup (name + i + 1));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1536
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1537 return (strdup (name));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1538 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1539
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1540 /* Return the expansion of FILENAME. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1541 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1542 expand_filename (char *filename, char *input_name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1543 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1544 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1545
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1546 if (filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1547 filename = full_pathname (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1548 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1549 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1550 filename = filename_non_directory (input_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1551
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1552 if (!*filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1553 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1554 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1555 filename = strdup ("noname.texi");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1556 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1557
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1558 for (i = strlen (filename) - 1; i; i--)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1559 if (filename[i] == '.')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1560 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1561
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1562 if (!i)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1563 i = strlen (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1564
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1565 if (i + 6 > (int) (strlen (filename)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1566 filename = (char *)xrealloc (filename, i + 6);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1567 strcpy (filename + i, ".info");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1568 return (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1569 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1570
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1571 if (filename[0] == '.' || filename[0] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1572 return (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1573
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1574 if (filename[0] != '/' && input_name[0] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1575 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1576 /* Make it so that relative names work. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1577 char *result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1578
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1579 i = strlen (input_name) - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1580
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1581 result = (char *)xmalloc (1 + strlen (input_name) + strlen (filename));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1582 strcpy (result, input_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1583
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1584 while (result[i] != '/' && i)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1585 i--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1586
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1587 if (result[i] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1588 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1589
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1590 strcpy (&result[i], filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1591 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1592 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1593 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1594 return (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1595 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1596
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1597 /* Return the full path to FILENAME. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1598 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1599 full_pathname (char *filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1600 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1601 int initial_character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1602 char *result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1603
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1604 /* No filename given? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1605 if (!filename || !(initial_character = *filename))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1606 return (strdup (""));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1607
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1608 /* Already absolute? */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1609 if ((initial_character == '/') ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1610 ((strncmp (filename, "./", 2) == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1611 (strncmp (filename, "../", 3) == 0)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1612 return (strdup (filename));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1613
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1614 if (initial_character != '~')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1615 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1616 char *localdir;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1617
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1618 localdir = (char *)xmalloc (1025);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1619 #if defined (HAVE_GETWD)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1620 if (!getwd (localdir))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1621 #else /* !HAVE_GETWD */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1622 if (!getcwd (localdir, 1024))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1623 #endif /* !HAVE_GETWD */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1624 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1625 fprintf (stderr, "%s: getwd: %s, %s\n",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1626 progname, filename, localdir);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1627 exit (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1628 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1629
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1630 strcat (localdir, "/");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1631 strcat (localdir, filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1632 result = strdup (localdir);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1633 free (localdir);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1634 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1635 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1636 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1637 if (filename[1] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1638 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1639 /* Return the concatenation of the environment variable HOME
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1640 and the rest of the string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1641 char *temp_home;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1642
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1643 temp_home = (char *) getenv ("HOME");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1644 result = (char *)xmalloc (strlen (&filename[1])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1645 + 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1646 + temp_home ? strlen (temp_home)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1647 : 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1648 *result = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1649
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1650 if (temp_home)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1651 strcpy (result, temp_home);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1652
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1653 strcat (result, &filename[1]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1654 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1655 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1656 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1657 struct passwd *user_entry;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1658 int i, c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1659 char *username = (char *)xmalloc (257);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1660
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1661 for (i = 1; (c = filename[i]); i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1662 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1663 if (c == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1664 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1665 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1666 username[i - 1] = c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1667 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1668 if (c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1669 username[i - 1] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1670
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1671 user_entry = getpwnam (username);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1672
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1673 if (!user_entry)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1674 return (strdup (filename));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1675
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1676 result = (char *)xmalloc (1 + strlen (user_entry->pw_dir)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1677 + strlen (&filename[i]));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1678 strcpy (result, user_entry->pw_dir);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1679 strcat (result, &filename[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1680 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1681 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1682 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1683 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1684
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1685 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1686 output_name_from_input_name (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1687 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1688 return (expand_filename ((char *)NULL, name));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1689 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1690
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1691 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1692 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1693 /* Error Handling */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1694 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1695 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1696
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1697 /* Number of errors encountered. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1698 int errors_printed = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1699
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1700 /* Print the last error gotten from the file system. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1701 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1702 fs_error (char *filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1703 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1704 remember_error ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1705 perror (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1706 return (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1707 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1708
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1709 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1710 error (char *format, ...)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1711 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1712 va_list ap;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1713
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1714 remember_error ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1715 va_start (ap, format);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1716 vfprintf (stderr, format, ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1717 fprintf (stderr, "\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1718 va_end (ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1719 return ((int) 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1720 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1721
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1722 /* Just like error (), but print the line number as well. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1723 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1724 line_error (char *format, ...)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1725 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1726 va_list ap;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1727
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1728 remember_error ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1729 va_start (ap, format);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1730 fprintf (stderr, "%s:%d: ", input_filename, line_number);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1731 vfprintf (stderr, format, ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1732 fprintf (stderr, ".\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1733 va_end (ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1734 return ((int) 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1735 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1736
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1737 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1738 warning (char *format, ...)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1739 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1740 va_list ap;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1741
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1742 va_start (ap, format);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1743 if (print_warnings)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1744 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1745 fprintf (stderr, "%s:%d: Warning: ", input_filename, line_number);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1746 vfprintf (stderr, format, ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1747 fprintf (stderr, ".\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1748 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1749 va_end (ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1750 return ((int) 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1751 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1752
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1753 /* Remember that an error has been printed. If this is the first
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1754 error printed, then tell them which program is printing them.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1755 If more than max_error_level have been printed, then exit the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1756 program. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1757 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1758 remember_error (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1759 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1760 errors_printed++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1761 if (max_error_level && (errors_printed > max_error_level))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1762 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1763 fprintf (stderr, "Too many errors! Gave up.\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1764 flush_file_stack ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1765 cm_bye ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1766 exit (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1767 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1768 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1769
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1770 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1771 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1772 /* Hacking Tokens and Strings */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1773 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1774 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1775
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1776 /* Return the next token as a string pointer. We cons the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1777 string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1778 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1779 read_token (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1780 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1781 int i, character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1782 char *result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1783
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1784 /* If the first character to be read is self-delimiting, then that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1785 is the command itself. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1786 character = curchar ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1787 if (self_delimiting (character))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1788 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1789 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1790 result = strdup (" ");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1791 *result = character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1792 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1793 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1794
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1795 for (i = 0; ((input_text_offset != size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1796 && (character = curchar ())
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1797 && command_char (character));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1798 i++, input_text_offset++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1799 result = (char *)xmalloc (i + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1800 memcpy (result, &input_text[input_text_offset - i], i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1801 result[i] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1802 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1803 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1804
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1805 /* Return non-zero if CHARACTER is self-delimiting. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1806 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1807 self_delimiting (int character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1808 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1809 return (member (character, "{}:.@*'`,!?; \n\t"));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1810 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1811
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1812 /* Clear whitespace from the front and end of string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1813 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1814 canon_white (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1815 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1816 int len = strlen (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1817 int x;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1818
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1819 if (!len)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1820 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1821
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1822 for (x = 0; x < len; x++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1823 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1824 if (!cr_or_whitespace (string[x]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1825 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1826 strcpy (string, string + x);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1827 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1828 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1829 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1830 len = strlen (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1831 if (len)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1832 len--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1833 while (len > -1 && cr_or_whitespace (string[len]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1834 len--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1835 string[len + 1] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1836 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1837
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1838 /* Bash STRING, replacing all whitespace with just one space. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1839 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1840 fix_whitespace (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1841 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1842 char *temp = (char *)xmalloc (strlen (string) + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1843 int string_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1844 int temp_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1845 int c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1846
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1847 canon_white (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1848
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1849 while (string[string_index])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1850 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1851 c = temp[temp_index++] = string[string_index++];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1852
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1853 if (c == ' ' || c == '\n' || c == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1854 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1855 temp[temp_index - 1] = ' ';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1856 while ((c = string[string_index]) && (c == ' ' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1857 c == '\t' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1858 c == '\n'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1859 string_index++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1860 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1861 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1862 temp[temp_index] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1863 strcpy (string, temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1864 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1865 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1866
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1867 /* Discard text until the desired string is found. The string is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1868 included in the discarded text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1869 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1870 discard_until (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1871 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1872 int temp = search_forward (string, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1873
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1874 int tt = (temp < 0) ? size_of_input_text : temp + strlen (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1875 int from = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1876
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1877 /* Find out what line we are on. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1878 while (from != tt)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1879 if (input_text[from++] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1880 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1881
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1882 if (temp < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1883 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1884 input_text_offset = size_of_input_text - strlen (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1885
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1886 if (strcmp (string, "\n") != 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1887 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1888 line_error ("Expected `%s'", string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1889 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1890 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1891 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1892 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1893 input_text_offset = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1894
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1895 input_text_offset += strlen (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1896 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1897
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1898 /* Read characters from the file until we are at MATCH.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1899 Place the characters read into STRING.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1900 On exit input_text_offset is after the match string.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1901 Return the offset where the string starts. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1902 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1903 get_until (char *match, char **string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1904 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1905 int len, current_point, x, new_point, tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1906
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1907 current_point = x = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1908 new_point = search_forward (match, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1909
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1910 if (new_point < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1911 new_point = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1912 len = new_point - current_point;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1913
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1914 /* Keep track of which line number we are at. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1915 tem = new_point + (strlen (match) - 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1916 while (x != tem)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1917 if (input_text[x++] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1918 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1919
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1920 *string = (char *)xmalloc (len + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1921
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1922 memcpy (*string, &input_text[current_point], len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1923 (*string)[len] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1924
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1925 /* Now leave input_text_offset in a consistent state. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1926 input_text_offset = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1927
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1928 if (input_text_offset > size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1929 input_text_offset = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1930
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1931 return (new_point);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1932 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1933
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1934 /* Read characters from the file until we are at MATCH or end of line.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1935 Place the characters read into STRING. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1936 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1937 get_until_in_line (char *match, char **string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1938 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1939 int real_bottom, temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1940
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1941 real_bottom = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1942 temp = search_forward ("\n", input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1943
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1944 if (temp < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1945 temp = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1946
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1947 size_of_input_text = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1948 get_until (match, string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1949 size_of_input_text = real_bottom;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1950 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1951
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1952 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1953 get_rest_of_line (char **string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1954 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1955 get_until ("\n", string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1956 canon_white (*string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1957
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1958 if (curchar () == '\n') /* as opposed to the end of the file... */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1959 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1960 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1961 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1962 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1963 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1964
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1965 /* Backup the input pointer to the previous character, keeping track
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1966 of the current line number. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1967 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1968 backup_input_pointer (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1969 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1970 if (input_text_offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1971 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1972 input_text_offset--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1973 if (curchar () == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1974 line_number--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1975 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1976 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1977
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1978 /* Read characters from the file until we are at MATCH or closing brace.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1979 Place the characters read into STRING. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1980 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1981 get_until_in_braces (char *match, char **string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1982 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1983 int i, brace = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1984 int match_len = strlen (match);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1985 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1986
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1987 for (i = input_text_offset; i < size_of_input_text; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1988 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1989 if (input_text[i] == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1990 brace++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1991 else if (input_text[i] == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1992 brace--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1993 else if (input_text[i] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1994 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1995
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1996 if (brace < 0 ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1997 (brace == 0 && strncmp (input_text + i, match, match_len) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1998 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1999 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2000
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2001 match_len = i - input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2002 temp = (char *)xmalloc (2 + match_len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2003 strncpy (temp, input_text + input_text_offset, match_len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2004 temp[match_len] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2005 input_text_offset = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2006 *string = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2007 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2008
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2009 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2010 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2011 /* Converting the File */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2012 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2013 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2014
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2015 /* Convert the file named by NAME. The output is saved on the file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2016 named as the argument to the @setfilename command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2017 static char *suffixes[] = {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2018 "",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2019 ".texinfo",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2020 ".texi",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2021 ".txinfo",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2022 (char *)NULL
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2023 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2024
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2025 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2026 initialize_conversion (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2027 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2028 init_tag_table ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2029 init_indices ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2030 init_internals ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2031 init_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2032 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2033
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2034 /* We read in multiples of 4k, simply because it is a typical pipe size
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2035 on unix systems. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2036 #define _READ_BUFFER_GROWTH (4 * 4096)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2037
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2038 /* Convert the texinfo file coming from the open stream STREAM. Assume the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2039 source of the stream is named NAME. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2040 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2041 convert_from_stream (FILE *stream, char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2042 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2043 char *buffer = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2044 int buffer_offset = 0, buffer_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2045
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2046 initialize_conversion ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2047
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2048 /* Read until the end of the stream. This isn't strictly correct, since
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2049 the texinfo input may end before the stream ends, but it is a quick
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2050 working hueristic. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2051 while (!feof (stream))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2052 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2053 int count;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2054
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2055 if (buffer_offset + (_READ_BUFFER_GROWTH + 1) >= buffer_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2056 buffer = (char *)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2057 xrealloc (buffer, (buffer_size += _READ_BUFFER_GROWTH));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2058
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2059 count = fread (buffer + buffer_offset, 1, _READ_BUFFER_GROWTH, stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2060
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2061 if (count < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2062 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2063 perror (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2064 exit (FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2065 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2066
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2067 buffer_offset += count;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2068 if (count == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2069 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2070 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2071
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2072 /* Set the globals to the new file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2073 input_text = buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2074 size_of_input_text = buffer_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2075 input_filename = strdup (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2076 node_filename = strdup (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2077 input_text_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2078 line_number = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2079
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2080 /* Not strictly necessary. This magic prevents read_token () from doing
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2081 extra unnecessary work each time it is called (that is a lot of times).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2082 The SIZE_OF_INPUT_TEXT is one past the actual end of the text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2083 input_text[size_of_input_text] = '\n';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2084
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2085 convert_from_loaded_file (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2086 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2087
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2088 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2089 convert_from_file (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2090 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2091 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2092 char *filename = (char *)xmalloc (strlen (name) + 50);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2093
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2094 initialize_conversion ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2095
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2096 /* Try to load the file specified by NAME. If the file isn't found, and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2097 there is no suffix in NAME, then try NAME.texinfo, and NAME.texi. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2098 for (i = 0; suffixes[i]; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2099 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2100 strcpy (filename, name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2101 strcat (filename, suffixes[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2102
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2103 if (find_and_load (filename))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2104 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2105
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2106 if (!suffixes[i][0] && strrchr (filename, '.'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2107 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2108 fs_error (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2109 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2110 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2111 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2112 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2113
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2114 if (!suffixes[i])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2115 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2116 fs_error (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2117 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2118 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2119 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2120
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2121 input_filename = filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2122
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2123 convert_from_loaded_file (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2124 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2125
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2126 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2127 convert_from_loaded_file (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2128 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2129 char *real_output_filename = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2130
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2131 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2132 remember_itext (input_text, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2133 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2134
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2135 /* Search this file looking for the special string which starts conversion.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2136 Once found, we may truly begin. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2137 input_text_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2138 while (input_text_offset >= 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2139 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2140 input_text_offset =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2141 search_forward (setfilename_search, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2142
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2143 if ((input_text_offset == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2144 ((input_text_offset > 0) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2145 (input_text[input_text_offset -1] == '\n')))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2146 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2147 else if (input_text_offset > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2148 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2149 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2150
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2151 if (input_text_offset < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2152 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2153 if (!command_output_filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2154 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2155 #if defined (REQUIRE_SETFILENAME)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2156 error ("No `%s' found in `%s'", setfilename_search, name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2157 goto finished;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2158 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2159 register int i, end_of_first_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2160
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2161 /* Find the end of the first line in the file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2162 for (i = 0; i < size_of_input_text - 1; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2163 if (input_text[i] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2164 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2165
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2166 end_of_first_line = i + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2167
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2168 input_text_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2170 for (i = 0; i < end_of_first_line; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2171 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2172 if ((input_text[i] == '\\') &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2173 (strncmp (input_text + i + 1, "include", 7) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2174 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2175 input_text_offset = end_of_first_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2176 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2177 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2178 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2179 command_output_filename = output_name_from_input_name (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2180 #endif /* !REQUIRE_SETFILENAME */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2181 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2182 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2183 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2184 input_text_offset += strlen (setfilename_search);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2185
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2186 if (!command_output_filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2187 get_until ("\n", &output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2188 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2189 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2190 if (input_text_offset != -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2191 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2192 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2193 input_text_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2194
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2195 real_output_filename = output_filename = command_output_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2196 command_output_filename = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2197 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2198
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2199 canon_white (output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2200
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2201 if (real_output_filename &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2202 strcmp (real_output_filename, "-") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2203 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2204 real_output_filename = strdup (real_output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2205 output_stream = stdout;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2206 splitting = 0; /* Cannot split when writing to stdout. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2207 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2208 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2209 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2210 if (!real_output_filename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2211 real_output_filename = expand_filename (output_filename, name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2212 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2213 real_output_filename = strdup (real_output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2214
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2215 output_stream = fopen (real_output_filename, "w");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2216 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2217
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2218 if (output_stream != stdout)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2219 printf ("Making info file `%s' from `%s'.\n", output_filename, name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2220
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2221 if (output_stream == NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2222 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2223 fs_error (real_output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2224 goto finished;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2225 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2226
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2227 /* Make the displayable filename from output_filename. Only the base
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2228 portion of the filename need be displayed. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2229 if (output_stream != stdout)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2230 pretty_output_filename = filename_part (output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2231 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2232 pretty_output_filename = strdup ("stdout");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2233
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2234 /* For this file only, count the number of newlines from the top of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2235 the file to here. This way, we keep track of line numbers for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2236 error reporting. Line_number starts at 1, since the user isn't
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2237 zero-based. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2238 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2239 int temp = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2240 line_number = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2241 while (temp != input_text_offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2242 if (input_text[temp++] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2243 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2244 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2245
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2246 if (!no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2247 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2248 add_word_args ("This is Info file %s, produced by Makeinfo-%d.%d from ",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2249 output_filename, major_version, minor_version);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2250 add_word_args ("the input file %s.\n", input_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2251 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2252
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2253 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2254 reader_loop ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2255
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2256 finished:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2257 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2258 flush_file_stack ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2259
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2260 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2261 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2262 fclose (macro_expansion_output_stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2263 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2264
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2265 if (output_stream != NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2266 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2267 output_pending_notes ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2268 free_pending_notes ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2269 if (tag_table != NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2270 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2271 tag_table = (TAG_ENTRY *) reverse_list ((GENERIC_LIST *) tag_table);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2272 if (!no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2273 write_tag_table ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2274 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2275
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2276 if (output_stream != stdout)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2277 fclose (output_stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2278
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2279 /* If validating, then validate the entire file right now. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2280 if (validating)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2281 validate_file (tag_table);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2282
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2283 /* This used to test && !errors_printed.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2284 But some files might have legit warnings. So split anyway. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2285 if (splitting)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2286 split_file (real_output_filename, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2287 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2288 free (real_output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2289 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2291 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2292 free_and_clear (char **pointer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2293 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2294 if ((*pointer) != (char *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2295 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2296 free (*pointer);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2297 *pointer = (char *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2298 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2299 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2300
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2301 /* Initialize some state. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2302 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2303 init_internals (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2304 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2305 free_and_clear (&current_node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2306 free_and_clear (&output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2307 free_and_clear (&command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2308 free_and_clear (&input_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2309 free_node_references ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2310 init_insertion_stack ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2311 init_brace_stack ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2312 command_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2313 in_menu = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2314 top_node_seen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2315 non_top_node_seen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2316 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2317
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2318 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2319 init_paragraph (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2320 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2321 free_and_clear ((char **) &output_paragraph);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2322 output_paragraph = (unsigned char *)xmalloc (paragraph_buffer_len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2323 output_position = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2324 output_paragraph[0] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2325 output_paragraph_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2326 output_column = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2327 paragraph_is_open = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2328 current_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2329 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2330
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2331 /* Okay, we are ready to start the conversion. Call the reader on
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2332 some text, and fill the text as it is output. Handle commands by
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2333 remembering things like open braces and the current file position on a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2334 stack, and when the corresponding close brace is found, you can call
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2335 the function with the proper arguments. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2336 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2337 reader_loop (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2338 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2339 int character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2340 int done = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2341 int dash_count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2342
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2343 while (!done)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2344 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2345 if (input_text_offset >= size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2346 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2347
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2348 character = curchar ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2349
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2350 if (!in_fixed_width_font &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2351 (character == '\'' || character == '`') &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2352 input_text[input_text_offset + 1] == character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2353 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2354 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2355 character = '"';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2356 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2357
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2358 if (character == '-')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2359 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2360 dash_count++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2361 if (dash_count == 2 && !in_fixed_width_font)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2362 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2363 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2364 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2365 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2366 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2367 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2368 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2369 dash_count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2370 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2371
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2372 /* If this is a whitespace character, then check to see if the line
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2373 is blank. If so, advance to the carriage return. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2374 if (whitespace (character))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2375 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2376 register int i = input_text_offset + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2377
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2378 while (i < size_of_input_text && whitespace (input_text[i]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2379 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2380
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2381 if (i == size_of_input_text || input_text[i] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2382 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2383 if (i == size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2384 i--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2385
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2386 input_text_offset = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2387 character = curchar ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2388 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2389 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2390
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2391 if (character == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2392 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2393 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2394
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2395 /* Check for a menu entry here, since the "escape sequence"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2396 that begins menu entrys is "\n* ". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2397 if (in_menu && input_text_offset + 1 < size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2398 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2399 char *tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2400
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2401 /* Note that the value of TEM is discarded, since it is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2402 gauranteed to be NULL when glean_node_from_menu () is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2403 called with a non-zero argument. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2404 tem = glean_node_from_menu (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2405 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2406 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2407
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2408 switch (character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2409 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2410 case COMMAND_PREFIX:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2411 read_command ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2412 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2413
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2414 case '{':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2415
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2416 /* Special case. I'm not supposed to see this character by itself.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2417 If I do, it means there is a syntax error in the input text.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2418 Report the error here, but remember this brace on the stack so
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2419 you can ignore its partner. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2420
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2421 line_error ("Misplaced `{'");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2422 remember_brace (misplaced_brace);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2423
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2424 /* Don't advance input_text_offset since this happens in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2425 remember_brace ().
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2426 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2427 */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2428 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2429
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2430 case '}':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2431 pop_and_call_brace ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2432 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2433 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2434
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2435 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2436 add_char (character);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2437 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2438 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2439 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2440 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2441 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2442 maybe_write_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2443 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2444 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2445
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2446 /* Find the command corresponding to STRING. If the command
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2447 is found, return a pointer to the data structure. Otherwise
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2448 return (-1). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2449 static COMMAND *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2450 get_command_entry (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2451 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2452 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2453
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2454 for (i = 0; CommandTable[i].name; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2455 if (strcmp (CommandTable[i].name, string) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2456 return (&CommandTable[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2457
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2458 /* This command is not in our predefined command table. Perhaps
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2459 it is a user defined command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2460 for (i = 0; i < user_command_array_len; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2461 if (user_command_array[i] &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2462 (strcmp (user_command_array[i]->name, string) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2463 return (user_command_array[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2464
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2465 /* Nope, we never heard of this command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2466 return ((COMMAND *) -1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2467 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2468
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2469 /* input_text_offset is right at the command prefix character.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2470 Read the next token to determine what to do. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2471 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2472 read_command (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2473 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2474 COMMAND *entry;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2475
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2476 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2477 free_and_clear (&command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2478 command = read_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2479
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2480 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2481 /* Check to see if this command is a macro. If so, execute it here. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2482 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2483 MACRO_DEF *def;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2484
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2485 def = find_macro (command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2486
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2487 if (def)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2488 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2489 /* We disallow recursive use of a macro call. Inhibit the expansion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2490 of this macro during the life of its execution. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2491 if (!(def->flags & ME_RECURSE))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2492 def->inhibited = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2493
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2494 execute_macro (def);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2495
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2496 if (!(def->flags & ME_RECURSE))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2497 def->inhibited = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2498
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2499 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2500 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2501 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2502 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2503
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2504 entry = get_command_entry (command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2505
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2506 if (entry == (COMMAND *)-1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2507 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2508 line_error ("Unknown info command `%s'", command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2509 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2510 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2511
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2512 if (entry->argument_in_braces)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2513 remember_brace (entry->proc);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2514
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2515 (*(entry->proc)) (START, output_paragraph_offset, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2516 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2517
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2518 /* Return the string which invokes PROC; a pointer to a function. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2519 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2520 find_proc_name (COMMAND_FUNCTION *proc)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2521 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2522 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2523
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2524 for (i = 0; CommandTable[i].name; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2525 if (proc == CommandTable[i].proc)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2526 return (CommandTable[i].name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2527 return ("NO_NAME!");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2528 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2529
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2530 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2531 init_brace_stack (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2532 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2533 brace_stack = (BRACE_ELEMENT *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2534 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2535
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2536 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2537 remember_brace (COMMAND_FUNCTION *proc)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2538 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2539 if (curchar () != '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2540 line_error ("%c%s expected `{..}'", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2541 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2542 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2543 remember_brace_1 (proc, output_paragraph_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2544 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2545
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2546 /* Remember the current output position here. Save PROC
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2547 along with it so you can call it later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2548 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2549 remember_brace_1 (COMMAND_FUNCTION *proc, int position)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2550 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2551 BRACE_ELEMENT *new = (BRACE_ELEMENT *) xmalloc (sizeof (BRACE_ELEMENT));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2552 new->next = brace_stack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2553 new->proc = proc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2554 new->pos = position;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2555 new->line = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2556 brace_stack = new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2557 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2558
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2559 /* Pop the top of the brace stack, and call the associated function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2560 with the args END and POS. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2561 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2562 pop_and_call_brace (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2563 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2564 BRACE_ELEMENT *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2565 COMMAND_FUNCTION *proc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2566 int pos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2567
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2568 if (brace_stack == (BRACE_ELEMENT *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2569 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2570 line_error ("Unmatched close brace");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2571 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2572 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2573
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2574 pos = brace_stack->pos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2575 proc = brace_stack->proc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2576 temp = brace_stack->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2577 free (brace_stack);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2578 brace_stack = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2579
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2580 (*proc) (END, pos, output_paragraph_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2581 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2582
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2583 /* Shift all of the markers in `brace_stack' by AMOUNT. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2584 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2585 adjust_braces_following (int here, int amount)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2586 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2587 register BRACE_ELEMENT *stack = brace_stack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2588
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2589 while (stack)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2590 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2591 if (stack->pos >= here)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2592 stack->pos += amount;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2593 stack = stack->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2594 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2595 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2596
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2597 /* You call discard_braces () when you shouldn't have any braces on the stack.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2598 I used to think that this happens for commands that don't take arguments
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2599 in braces, but that was wrong because of things like @code{foo @@}. So now
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2600 I only detect it at the beginning of nodes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2601 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2602 discard_braces (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2603 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2604 if (!brace_stack)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2605 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2606
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2607 while (brace_stack)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2608 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2609 if (brace_stack->proc != misplaced_brace)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2610 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2611 char *proc_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2612 int temp_line_number = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2613
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2614 line_number = brace_stack->line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2615 proc_name = find_proc_name (brace_stack->proc);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2616 line_error ("%c%s missing close brace", COMMAND_PREFIX, proc_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2617 line_number = temp_line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2618 pop_and_call_brace ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2619 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2620 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2621 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2622 BRACE_ELEMENT *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2623 temp = brace_stack->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2624 free (brace_stack);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2625 brace_stack = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2626 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2627 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2628 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2629
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2630 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2631 get_char_len (int character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2632 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2633 /* Return the printed length of the character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2634 int len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2635
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2636 switch (character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2637 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2638 case '\t':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2639 len = (output_column + 8) & 0xf7;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2640 if (len > fill_column)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2641 len = fill_column - output_column;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2642 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2643 len = len - output_column;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2644 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2645
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2646 case '\n':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2647 len = fill_column - output_column;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2648 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2649
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2650 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2651 if (character < ' ')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2652 len = 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2653 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2654 len = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2655 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2656 return (len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2657 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2658
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2659 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2660 add_word_args (char *format, ...)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2661 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2662 va_list ap;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2663 char buffer[1000];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2664
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2665 va_start (ap, format);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2666 vsprintf (buffer, format, ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2667 add_word (buffer);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2668 va_end (ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2669 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2670
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2671 /* Add STRING to output_paragraph. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2672 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2673 add_word (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2674 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2675 while (*string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2676 add_char (*string++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2677 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2678
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2679 /* Non-zero if the last character inserted has the syntax class of NEWLINE. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2680 int last_char_was_newline = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2681
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2682 /* The actual last inserted character. Note that this may be something
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2683 other than NEWLINE even if last_char_was_newline is 1. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2684 int last_inserted_character = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2685
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2686 /* Non-zero means that a newline character has already been
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2687 inserted, so close_paragraph () should insert one less. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2688 int line_already_broken = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2689
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2690 /* When non-zero we have finished an insertion (see end_insertion ()) and we
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2691 want to ignore false continued paragraph closings. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2692 int insertion_paragraph_closed = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2693
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2694 /* Non-zero means attempt to make all of the lines have fill_column width. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2695 int do_justification = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2696
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2697 /* Add the character to the current paragraph. If filling_enabled is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2698 non-zero, then do filling as well. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2699 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2700 add_char (int character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2701 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2702 /* If we are avoiding outputting headers, and we are currently
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2703 in a menu, then simply return. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2704 if (no_headers && in_menu)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2705 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2706
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2707 /* If we are adding a character now, then we don't have to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2708 ignore close_paragraph () calls any more. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2709 if (must_start_paragraph && character != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2710 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2711 must_start_paragraph = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2712 line_already_broken = 0; /* The line is no longer broken. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2713 if (current_indent > output_column)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2714 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2715 indent (current_indent - output_column);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2716 output_column = current_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2717 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2718 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2719
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2720 if (non_splitting_words && member (character, " \t\n"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2721 character = ' ' | 0x80;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2722
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2723 insertion_paragraph_closed = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2724
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2725 switch (character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2726 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2727 case '\n':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2728 if (!filling_enabled)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2729 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2730 insert ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2731
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2732 if (force_flush_right)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2733 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2734 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2735 /* Hack to force single blank lines out in this mode. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2736 flush_output ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2737 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2738
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2739 output_column = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2740
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2741 if (!no_indent && paragraph_is_open)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2742 indent (output_column = current_indent);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2743 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2744 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2745 else /* CHARACTER is newline, and filling is enabled. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2746 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2747 if (sentence_ender (last_inserted_character))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2748 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2749 insert (' ');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2750 output_column++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2751 last_inserted_character = character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2752 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2753 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2754
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2755 if (last_char_was_newline)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2756 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2757 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2758 pending_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2759 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2760 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2761 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2762 last_char_was_newline = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2763 insert (' ');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2764 output_column++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2765 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2766 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2767
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2768 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2769 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2770 int len = get_char_len (character);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2771 int suppress_insert = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2772
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2773 if ((character == ' ') && (last_char_was_newline))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2774 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2775 if (!paragraph_is_open)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2776 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2777 pending_indent++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2778 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2779 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2780 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2781
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2782 if (!paragraph_is_open)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2783 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2784 start_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2785
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2786 /* If the paragraph is supposed to be indented a certain way,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2787 then discard all of the pending whitespace. Otherwise, we
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2788 let the whitespace stay. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2789 if (!paragraph_start_indent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2790 indent (pending_indent);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2791 pending_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2792 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2793
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2794 if ((output_column += len) > fill_column)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2795 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2796 if (filling_enabled)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2797 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2798 int temp = output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2799 while (--temp > 0 && output_paragraph[temp] != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2800 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2801 /* If we have found a space, we have the place to break
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2802 the line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2803 if (output_paragraph[temp] == ' ')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2804 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2805 /* Remove trailing whitespace from output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2806 while (temp && whitespace (output_paragraph[temp - 1]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2807 temp--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2808
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2809 output_paragraph[temp++] = '\n';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2810
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2811 /* We have correctly broken the line where we want
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2812 to. What we don't want is spaces following where
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2813 we have decided to break the line. We get rid of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2814 them. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2815 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2816 int t1 = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2817
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2818 for (;; t1++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2819 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2820 if (t1 == output_paragraph_offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2821 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2822 if (whitespace (character))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2823 suppress_insert = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2824 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2825 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2826 if (!whitespace (output_paragraph[t1]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2827 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2828 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2829
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2830 if (t1 != temp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2831 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2832 adjust_braces_following (temp, (- (t1 - temp)));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2833 strncpy ((char *) &output_paragraph[temp],
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2834 (char *) &output_paragraph[t1],
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2835 (output_paragraph_offset - t1));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2836 output_paragraph_offset -= (t1 - temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2837 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2838 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2839
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2840 /* Filled, but now indent if that is right. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2841 if (indented_fill && current_indent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2842 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2843 int buffer_len = ((output_paragraph_offset - temp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2844 + current_indent);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2845 char *temp_buffer = (char *)xmalloc (buffer_len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2846 int indentation = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2847
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2848 /* We have to shift any markers that are in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2849 front of the wrap point. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2850 adjust_braces_following (temp, current_indent);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2851
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2852 while (current_indent > 0 &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2853 indentation != current_indent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2854 temp_buffer[indentation++] = ' ';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2855
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2856 strncpy ((char *) &temp_buffer[current_indent],
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2857 (char *) &output_paragraph[temp],
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2858 buffer_len - current_indent);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2859
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2860 if (output_paragraph_offset + buffer_len
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2861 >= paragraph_buffer_len)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2862 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2863 unsigned char *tt = xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2864 (output_paragraph,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2865 (paragraph_buffer_len += buffer_len));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2866 output_paragraph = tt;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2867 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2868 strncpy ((char *) &output_paragraph[temp],
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2869 temp_buffer, buffer_len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2870 output_paragraph_offset += current_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2871 free (temp_buffer);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2872 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2873 output_column = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2874 while (temp < output_paragraph_offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2875 output_column +=
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2876 get_char_len (output_paragraph[temp++]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2877 output_column += len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2878 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2879 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2880 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2881 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2882 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2883
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2884 if (!suppress_insert)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2885 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2886 insert (character);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2887 last_inserted_character = character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2888 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2889 last_char_was_newline = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2890 line_already_broken = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2891 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2892 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2893 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2894
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2895 /* Insert CHARACTER into OUTPUT_PARAGRAPH. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2896 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2897 insert (int character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2898 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2899 output_paragraph[output_paragraph_offset++] = character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2900 if (output_paragraph_offset == paragraph_buffer_len)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2901 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2902 output_paragraph =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2903 xrealloc (output_paragraph, (paragraph_buffer_len += 100));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2904 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2905 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2906
2
ac2d302a0011 Import from CVS: tag r19-15b2
cvs
parents: 0
diff changeset
2907 /* Remove upto COUNT characters of whitespace from the current output
ac2d302a0011 Import from CVS: tag r19-15b2
cvs
parents: 0
diff changeset
2908 line. If COUNT is less than zero, then remove until none left. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2909 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2910 kill_self_indent (int count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2911 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2912 /* Handle infinite case first. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2913 if (count < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2914 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2915 output_column = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2916 while (output_paragraph_offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2917 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2918 if (whitespace (output_paragraph[output_paragraph_offset - 1]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2919 output_paragraph_offset--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2920 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2921 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2922 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2923 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2924 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2925 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2926 while (output_paragraph_offset && count--)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2927 if (whitespace (output_paragraph[output_paragraph_offset - 1]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2928 output_paragraph_offset--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2929 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2930 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2931 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2932 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2933
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2934 /* Non-zero means do not honor calls to flush_output (). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2935 static int flushing_ignored = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2936
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2937 /* Prevent calls to flush_output () from having any effect. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2938 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2939 inhibit_output_flushing (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2940 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2941 flushing_ignored++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2942 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2943
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2944 /* Allow calls to flush_output () to write the paragraph data. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2945 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2946 uninhibit_output_flushing (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2947 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2948 flushing_ignored--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2949 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2950
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2951 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2952 flush_output (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2953 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2954 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2955
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2956 if (!output_paragraph_offset || flushing_ignored)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2957 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2958
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2959 for (i = 0; i < output_paragraph_offset; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2960 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2961 if (output_paragraph[i] == (unsigned char)(' ' | 0x80) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2962 output_paragraph[i] == (unsigned char)('\t' | 0x80) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2963 output_paragraph[i] == (unsigned char)('\n' | 0x80) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2964 sentence_ender (UNMETA (output_paragraph[i])))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2965 output_paragraph[i] &= 0x7f;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2966 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2967
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2968 fwrite (output_paragraph, 1, output_paragraph_offset, output_stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2969
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2970 output_position += output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2971 output_paragraph_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2972 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2973
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2974 /* How to close a paragraph controlling the number of lines between
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2975 this one and the last one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2976
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2977 /* Paragraph spacing is controlled by this variable. It is the number of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2978 blank lines that you wish to appear between paragraphs. A value of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2979 1 creates a single blank line between paragraphs. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2980 int paragraph_spacing = DEFAULT_PARAGRAPH_SPACING;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2981
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2982 /* Close the current paragraph, leaving no blank lines between them. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2983 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2984 close_single_paragraph (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2985 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2986 close_paragraph_with_lines (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2987 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2988
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2989 /* Close a paragraph after an insertion has ended. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2990 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2991 close_insertion_paragraph (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2992 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2993 if (!insertion_paragraph_closed)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2994 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2995 /* Close the current paragraph, breaking the line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2996 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2997
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2998 /* Start a new paragraph here, inserting whatever indention is correct
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2999 for the now current insertion level (one above the one that we are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3000 ending). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3001 start_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3002
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3003 /* Tell close_paragraph () that the previous line has already been
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3004 broken, so it should insert one less newline. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3005 line_already_broken = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3006
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3007 /* Let functions such as add_char () know that we have already found a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3008 newline. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3009 ignore_blank_line ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3010 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3011 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3012 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3013 /* If the insertion paragraph is closed already, then we are seeing
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3014 two `@end' commands in a row. Note that the first one we saw was
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3015 handled in the first part of this if-then-else clause, and at that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3016 time start_paragraph () was called, partially to handle the proper
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3017 indentation of the current line. However, the indentation level
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3018 may have just changed again, so we may have to outdent the current
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3019 line to the new indentation level. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3020 if (current_indent < output_column)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3021 kill_self_indent (output_column - current_indent);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3022 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3023
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3024 insertion_paragraph_closed = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3025 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3026
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3027 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3028 close_paragraph_with_lines (int lines)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3029 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3030 int old_spacing = paragraph_spacing;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3031 paragraph_spacing = lines;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3032 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3033 paragraph_spacing = old_spacing;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3034 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3035
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3036 /* Close the currently open paragraph. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3037 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3038 close_paragraph (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3039 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3040 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3041
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3042 /* The insertion paragraph is no longer closed. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3043 insertion_paragraph_closed = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3044
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3045 if (paragraph_is_open && !must_start_paragraph)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3046 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3047 register int tindex, c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3048
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3049 tindex = output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3050
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3051 /* Back up to last non-newline/space character, forcing all such
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3052 subsequent characters to be newlines. This isn't strictly
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3053 necessary, but a couple of functions use the presence of a newline
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3054 to make decisions. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3055 for (tindex = output_paragraph_offset - 1; tindex >= 0; --tindex)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3056 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3057 c = output_paragraph[tindex];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3058
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3059 if (c == ' '|| c == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3060 output_paragraph[tindex] = '\n';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3061 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3062 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3063 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3064
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3065 /* All trailing whitespace is ignored. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3066 output_paragraph_offset = ++tindex;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3067
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3068 /* Break the line if that is appropriate. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3069 if (paragraph_spacing >= 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3070 insert ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3071
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3072 /* Add as many blank lines as is specified in PARAGRAPH_SPACING. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3073 if (!force_flush_right)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3074 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3075 for (i = 0; i < (paragraph_spacing - line_already_broken); i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3076 insert ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3077 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3078
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3079 /* If we are doing flush right indentation, then do it now
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3080 on the paragraph (really a single line). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3081 if (force_flush_right)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3082 do_flush_right_indentation ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3083
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3084 flush_output ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3085 paragraph_is_open = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3086 no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3087 output_column = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3088 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3089 ignore_blank_line ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3090 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3091
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3092 /* Make the last line just read look as if it were only a newline. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3093 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3094 ignore_blank_line (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3095 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3096 last_inserted_character = '\n';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3097 last_char_was_newline = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3098 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3099
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3100 /* Align the end of the text in output_paragraph with fill_column. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3101 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3102 do_flush_right_indentation (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3103 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3104 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3105 int temp_len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3106
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3107 kill_self_indent (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3108
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3109 if (output_paragraph[0] != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3110 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3111 output_paragraph[output_paragraph_offset] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3112
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3113 if (output_paragraph_offset < fill_column)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3114 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3115 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3116
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3117 if (fill_column >= paragraph_buffer_len)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3118 output_paragraph =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3119 xrealloc (output_paragraph,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3120 (paragraph_buffer_len += fill_column));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3121
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3122 temp_len = strlen ((char *)output_paragraph);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3123 temp = (char *)xmalloc (temp_len + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3124 memcpy (temp, (char *)output_paragraph, temp_len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3125
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3126 for (i = 0; i < fill_column - output_paragraph_offset; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3127 output_paragraph[i] = ' ';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3128
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3129 memcpy ((char *)output_paragraph + i, temp, temp_len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3130 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3131 output_paragraph_offset = fill_column;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3132 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3133 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3134 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3135
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3136 /* Begin a new paragraph. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3137 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3138 start_paragraph (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3139 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3140 /* First close existing one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3141 if (paragraph_is_open)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3142 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3143
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3144 /* In either case, the insertion paragraph is no longer closed. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3145 insertion_paragraph_closed = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3146
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3147 /* However, the paragraph is open! */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3148 paragraph_is_open = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3149
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3150 /* If we MUST_START_PARAGRAPH, that simply means that start_paragraph ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3151 had to be called before we would allow any other paragraph operations
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3152 to have an effect. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3153 if (!must_start_paragraph)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3154 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3155 int amount_to_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3156
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3157 /* If doing indentation, then insert the appropriate amount. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3158 if (!no_indent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3159 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3160 if (inhibit_paragraph_indentation)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3161 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3162 amount_to_indent = current_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3163 if (inhibit_paragraph_indentation < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3164 inhibit_paragraph_indentation++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3165 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3166 else if (paragraph_start_indent < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3167 amount_to_indent = current_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3168 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3169 amount_to_indent = current_indent + paragraph_start_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3170
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3171 if (amount_to_indent >= output_column)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3172 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3173 amount_to_indent -= output_column;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3174 indent (amount_to_indent);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3175 output_column += amount_to_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3176 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3177 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3178 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3179 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3180 must_start_paragraph = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3181 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3182
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3183 /* Insert the indentation specified by AMOUNT. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3184 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3185 indent (int amount)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3186 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3187 register BRACE_ELEMENT *elt = brace_stack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3188
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3189 /* For every START_POS saved within the brace stack which will be affected
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3190 by this indentation, bump that start pos forward. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3191 while (elt)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3192 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3193 if (elt->pos >= output_paragraph_offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3194 elt->pos += amount;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3195 elt = elt->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3196 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3197
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3198 while (--amount >= 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3199 insert (' ');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3200 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3201
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3202 /* Search forward for STRING in input_text.
2
ac2d302a0011 Import from CVS: tag r19-15b2
cvs
parents: 0
diff changeset
3203 FROM says where to start. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3204 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3205 search_forward (char *string, int from)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3206 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3207 int len = strlen (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3208
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3209 while (from < size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3210 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3211 if (strncmp (input_text + from, string, len) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3212 return (from);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3213 from++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3214 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3215 return (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3216 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3217
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3218 /* Whoops, Unix doesn't have strcasecmp. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3219
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3220 /* Case independent string compare. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3221 #if !defined (HAVE_STRCASECMP)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3222 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3223 strcasecmp (char *string1, char *string2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3224 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3225 char ch1, ch2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3226
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3227 for (;;)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3228 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3229 ch1 = *string1++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3230 ch2 = *string2++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3231
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3232 if (!(ch1 | ch2))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3233 return (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3234
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3235 ch1 = coerce_to_upper (ch1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3236 ch2 = coerce_to_upper (ch2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3237
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3238 if (ch1 != ch2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3239 return (ch1 - ch2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3240 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3241 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3242 #endif /* !HAVE_STRCASECMP */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3243
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3244 enum insertion_type { menu, quotation, lisp, smalllisp, example,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3245 smallexample, display, itemize, format, enumerate, cartouche, table,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3246 ftable, vtable, group, ifinfo, flushleft, flushright, ifset, ifclear, deffn,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3247 defun, defmac, defspec, defvr, defvar, defopt, deftypefn,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3248 deftypefun, deftypevr, deftypevar, defcv, defivar, defop, defmethod,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3249 deftypemethod, deftp, bad_type };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3250
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3251 char *insertion_type_names[] = { "menu", "quotation", "lisp",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3252 "smalllisp", "example", "smallexample", "display", "itemize",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3253 "format", "enumerate", "cartouche", "table", "ftable", "vtable", "group",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3254 "ifinfo", "flushleft", "flushright", "ifset", "ifclear", "deffn",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3255 "defun", "defmac", "defspec", "defvr", "defvar", "defopt",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3256 "deftypefn", "deftypefun", "deftypevr", "deftypevar", "defcv",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3257 "defivar", "defop", "defmethod", "deftypemethod", "deftp",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3258 "bad_type" };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3259
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3260 int insertion_level = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3261 typedef struct istack_elt
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3262 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3263 struct istack_elt *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3264 char *item_function;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3265 char *filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3266 int line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3267 int filling_enabled;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3268 int indented_fill;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3269 enum insertion_type insertion;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3270 int inhibited;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3271 } INSERTION_ELT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3272
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3273 INSERTION_ELT *insertion_stack = (INSERTION_ELT *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3274
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3275 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3276 init_insertion_stack (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3277 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3278 insertion_stack = (INSERTION_ELT *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3279 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3280
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3281 /* Return the type of the current insertion. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3282 static enum insertion_type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3283 current_insertion_type (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3284 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3285 if (!insertion_level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3286 return (bad_type);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3287 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3288 return (insertion_stack->insertion);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3289 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3291 /* Return a pointer to the string which is the function to wrap around
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3292 items. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3293 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3294 current_item_function (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3295 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3296 register int level, done;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3297 register INSERTION_ELT *elt;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3298
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3299 level = insertion_level;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3300 elt = insertion_stack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3301 done = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3302
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3303 /* Skip down through the stack until we find a non-conditional insertion. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3304 while (!done && (elt != NULL))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3305 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3306 switch (elt->insertion)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3307 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3308 case ifinfo:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3309 case ifset:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3310 case ifclear:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3311 case cartouche:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3312 elt = elt->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3313 level--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3314 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3315
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3316 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3317 done = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3318 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3319 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3320
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3321 if (!level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3322 return ((char *) NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3323 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3324 return (elt->item_function);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3325 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3326
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3327 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3328 get_item_function (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3329 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3330 char *item_function;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3331 get_rest_of_line (&item_function);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3332 backup_input_pointer ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3333 canon_white (item_function);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3334 return (item_function);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3335 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3336
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3337 /* Push the state of the current insertion on the stack. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3338 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3339 push_insertion (enum insertion_type type, char *item_function)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3340 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3341 INSERTION_ELT *new = (INSERTION_ELT *) xmalloc (sizeof (INSERTION_ELT));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3342
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3343 new->item_function = item_function;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3344 new->filling_enabled = filling_enabled;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3345 new->indented_fill = indented_fill;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3346 new->insertion = type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3347 new->line_number = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3348 new->filename = strdup (input_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3349 new->inhibited = inhibit_paragraph_indentation;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3350 new->next = insertion_stack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3351 insertion_stack = new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3352 insertion_level++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3353 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3354
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3355 /* Pop the value on top of the insertion stack into the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3356 global variables. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3357 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3358 pop_insertion (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3359 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3360 INSERTION_ELT *temp = insertion_stack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3361
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3362 if (temp == (INSERTION_ELT *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3363 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3364
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3365 inhibit_paragraph_indentation = temp->inhibited;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3366 filling_enabled = temp->filling_enabled;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3367 indented_fill = temp->indented_fill;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3368 free_and_clear (&(temp->item_function));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3369 free_and_clear (&(temp->filename));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3370 insertion_stack = insertion_stack->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3371 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3372 insertion_level--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3373 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3374
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3375 /* Return a pointer to the print name of this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3376 enumerated type. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3377 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3378 insertion_type_pname (enum insertion_type type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3379 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3380 if ((int) type < (int) bad_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3381 return (insertion_type_names[(int) type]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3382 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3383 return ("Broken-Type in insertion_type_pname");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3384 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3385
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3386 /* Return the insertion_type associated with NAME.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3387 If the type is not one of the known ones, return BAD_TYPE. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3388 static enum insertion_type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3389 find_type_from_name (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3390 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3391 int indecks = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3392 while (indecks < (int) bad_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3393 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3394 if (strcmp (name, insertion_type_names[indecks]) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3395 return (enum insertion_type) indecks;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3396 indecks++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3397 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3398 return (bad_type);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3399 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3400
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3401 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3402 do_nothing (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3403 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3404 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3405
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3406 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3407 defun_insertion (enum insertion_type type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3408 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3409 return
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3410 ((type == deffn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3411 || (type == defun)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3412 || (type == defmac)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3413 || (type == defspec)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3414 || (type == defvr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3415 || (type == defvar)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3416 || (type == defopt)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3417 || (type == deftypefn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3418 || (type == deftypefun)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3419 || (type == deftypevr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3420 || (type == deftypevar)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3421 || (type == defcv)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3422 || (type == defivar)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3423 || (type == defop)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3424 || (type == defmethod)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3425 || (type == deftypemethod)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3426 || (type == deftp));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3427 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3428
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3429 /* MAX_NS is the maximum nesting level for enumerations. I picked 100
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3430 which seemed reasonable. This doesn't control the number of items,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3431 just the number of nested lists. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3432 #define max_stack_depth 100
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3433 #define ENUM_DIGITS 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3434 #define ENUM_ALPHA 2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3435 typedef struct {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3436 int enumtype;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3437 int enumval;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3438 } DIGIT_ALPHA;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3439
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3440 DIGIT_ALPHA enumstack[max_stack_depth];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3441 int enumstack_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3442 int current_enumval = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3443 int current_enumtype = ENUM_DIGITS;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3444 char *enumeration_arg = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3445
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3446 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3447 start_enumerating (int at, int type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3448 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3449 if ((enumstack_offset + 1) == max_stack_depth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3450 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3451 line_error ("Enumeration stack overflow");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3452 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3453 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3454 enumstack[enumstack_offset].enumtype = current_enumtype;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3455 enumstack[enumstack_offset].enumval = current_enumval;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3456 enumstack_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3457 current_enumval = at;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3458 current_enumtype = type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3459 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3460
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3461 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3462 stop_enumerating (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3463 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3464 --enumstack_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3465 if (enumstack_offset < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3466 enumstack_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3467
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3468 current_enumval = enumstack[enumstack_offset].enumval;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3469 current_enumtype = enumstack[enumstack_offset].enumtype;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3470 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3471
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3472 /* Place a letter or digits into the output stream. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3473 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3474 enumerate_item (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3475 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3476 char temp[10];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3477
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3478 if (current_enumtype == ENUM_ALPHA)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3479 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3480 if (current_enumval == ('z' + 1) || current_enumval == ('Z' + 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3481 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3482 current_enumval = ((current_enumval - 1) == 'z' ? 'a' : 'A');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3483 warning ("Lettering overflow, restarting at %c", current_enumval);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3484 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3485 sprintf (temp, "%c. ", current_enumval);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3486 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3487 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3488 sprintf (temp, "%d. ", current_enumval);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3489
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3490 indent (output_column += (current_indent - strlen (temp)));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3491 add_word (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3492 current_enumval++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3493 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3494
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3495 /* This is where the work for all the "insertion" style
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3496 commands is done. A huge switch statement handles the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3497 various setups, and generic code is on both sides. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3498 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3499 begin_insertion (enum insertion_type type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3500 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3501 int no_discard = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3502
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3503 if (defun_insertion (type))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3504 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3505 push_insertion (type, strdup (""));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3506 no_discard++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3507 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3508 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3509 push_insertion (type, get_item_function ());
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3510
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3511 switch (type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3512 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3513 case menu:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3514 if (!no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3515 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3516
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3517 filling_enabled = no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3518 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3519
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3520 if (!no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3521 add_word ("* Menu:\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3522
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3523 in_menu++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3524 no_discard++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3525 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3526
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3527 /* I think @quotation is meant to do filling.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3528 If you don't want filling, then use @example. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3529 case quotation:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3530 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3531 last_char_was_newline = no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3532 indented_fill = filling_enabled = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3533 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3534 current_indent += default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3535 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3536
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3537 case display:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3538 case example:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3539 case smallexample:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3540 case lisp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3541 case smalllisp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3542 /* Just like @example, but no indentation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3543 case format:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3544
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3545 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3546 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3547 in_fixed_width_font++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3548 filling_enabled = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3549 last_char_was_newline = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3550
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3551 if (type != format)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3552 current_indent += default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3553
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3554 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3555
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3556 case table:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3557 case ftable:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3558 case vtable:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3559 case itemize:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3560 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3561 current_indent += default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3562 filling_enabled = indented_fill = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3563 #if defined (INDENT_PARAGRAPHS_IN_TABLE)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3564 inhibit_paragraph_indentation = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3565 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3566 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3567 #endif /* !INDENT_PARAGRAPHS_IN_TABLE */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3568
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3569 /* Make things work for losers who forget the itemize syntax. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3570 if (allow_lax_format && (type == itemize))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3571 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3572 if (!(*insertion_stack->item_function))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3573 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3574 free (insertion_stack->item_function);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3575 insertion_stack->item_function = strdup ("@bullet");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3576 insertion_stack->item_function[0] = COMMAND_PREFIX;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3577 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3578 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3579
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3580 if (!*insertion_stack->item_function)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3581 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3582 line_error ("%s requires an argument: the formatter for %citem",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3583 insertion_type_pname (type), COMMAND_PREFIX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3584 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3585 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3586
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3587 case enumerate:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3588 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3589 no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3590 #if defined (INDENT_PARAGRAPHS_IN_TABLE)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3591 inhibit_paragraph_indentation = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3592 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3593 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3594 #endif /* !INDENT_PARAGRAPHS_IN_TABLE */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3595
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3596 current_indent += default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3597 filling_enabled = indented_fill = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3598
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3599 if (isdigit (*enumeration_arg))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3600 start_enumerating (atoi (enumeration_arg), ENUM_DIGITS);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3601 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3602 start_enumerating (*enumeration_arg, ENUM_ALPHA);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3603 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3604
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3605 /* Does nothing special in makeinfo. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3606 case group:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3607 /* Only close the paragraph if we are not inside of an @example. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3608 if (!insertion_stack->next ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3609 insertion_stack->next->insertion != example)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3610 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3611 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3612
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3613 /* Insertions that are no-ops in info, but do something in TeX. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3614 case ifinfo:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3615 case ifset:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3616 case ifclear:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3617 case cartouche:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3618 if (in_menu)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3619 no_discard++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3620 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3621
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3622 case deffn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3623 case defun:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3624 case defmac:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3625 case defspec:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3626 case defvr:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3627 case defvar:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3628 case defopt:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3629 case deftypefn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3630 case deftypefun:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3631 case deftypevr:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3632 case deftypevar:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3633 case defcv:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3634 case defivar:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3635 case defop:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3636 case defmethod:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3637 case deftypemethod:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3638 case deftp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3639 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3640 filling_enabled = indented_fill = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3641 current_indent += default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3642 no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3643 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3644
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3645 case flushleft:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3646 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3647 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3648 filling_enabled = indented_fill = no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3649 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3650
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3651 case flushright:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3652 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3653 filling_enabled = indented_fill = no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3654 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3655 force_flush_right++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3656 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3657
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3658 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3659 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3660 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3661
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3662 if (!no_discard)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3663 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3664 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3665
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3666 /* Try to end the insertion with the specified TYPE.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3667 TYPE, with a value of bad_type, gets translated to match
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3668 the value currently on top of the stack.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3669 Otherwise, if TYPE doesn't match the top of the insertion stack,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3670 give error. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3671 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3672 end_insertion (enum insertion_type type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3673 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3674 enum insertion_type temp_type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3675
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3676 if (!insertion_level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3677 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3678
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3679 temp_type = current_insertion_type ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3680
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3681 if (type == bad_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3682 type = temp_type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3683
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3684 if (type != temp_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3685 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3686 line_error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3687 ("`%cend' expected `%s', but saw `%s'", COMMAND_PREFIX,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3688 insertion_type_pname (temp_type), insertion_type_pname (type));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3689 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3690 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3691
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3692 pop_insertion ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3693
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3694 switch (type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3695 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3696 /* Insertions which have no effect on paragraph formatting. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3697 case ifinfo:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3698 case ifset:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3699 case ifclear:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3700 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3701
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3702 case menu:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3703 in_menu--; /* No longer hacking menus. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3704 if (!no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3705 close_insertion_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3706 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3707
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3708 case enumerate:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3709 stop_enumerating ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3710 close_insertion_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3711 current_indent -= default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3712 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3713
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3714 case flushleft:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3715 case group:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3716 case cartouche:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3717 close_insertion_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3718 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3719
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3720 case format:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3721 case display:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3722 case example:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3723 case smallexample:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3724 case lisp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3725 case smalllisp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3726 case quotation:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3727
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3728 /* @quotation is the only one of the above without a fixed width
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3729 font. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3730 if (type != quotation)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3731 in_fixed_width_font--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3732
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3733 /* @format is the only fixed_width insertion without a change
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3734 in indentation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3735 if (type != format)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3736 current_indent -= default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3737
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3738 /* The ending of one of these insertions always marks the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3739 start of a new paragraph. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3740 close_insertion_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3741 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3742
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3743 case table:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3744 case ftable:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3745 case vtable:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3746 case itemize:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3747 current_indent -= default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3748 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3749
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3750 case flushright:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3751 force_flush_right--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3752 close_insertion_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3753 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3754
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3755 /* Handle the @defun style insertions with a default clause. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3756 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3757 current_indent -= default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3758 close_insertion_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3759 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3760 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3761 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3762
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3763 /* Insertions cannot cross certain boundaries, such as node beginnings. In
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3764 code that creates such boundaries, you should call discard_insertions ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3765 before doing anything else. It prints the errors for you, and cleans up
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3766 the insertion stack. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3767 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3768 discard_insertions (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3769 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3770 int real_line_number = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3771 while (insertion_stack)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3772 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3773 if (insertion_stack->insertion == ifinfo ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3774 insertion_stack->insertion == ifset ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3775 insertion_stack->insertion == ifclear ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3776 insertion_stack->insertion == cartouche)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3777 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3778 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3779 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3780 char *offender;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3781 char *current_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3782
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3783 current_filename = input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3784 offender = (char *)insertion_type_pname (insertion_stack->insertion);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3785 input_filename = insertion_stack->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3786 line_number = insertion_stack->line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3787 line_error ("This `%s' doesn't have a matching `%cend %s'", offender,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3788 COMMAND_PREFIX, offender);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3789 input_filename = current_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3790 pop_insertion ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3791 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3792 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3793 line_number = real_line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3794 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3795
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3796 /* The actual commands themselves. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3797
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3798 /* Commands which insert themselves. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3799 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3800 insert_self (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3801 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3802 add_word (command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3803 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3804
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3805 /* Force a line break in the output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3806 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3807 cm_asterisk (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3808 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3809 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3810 #if !defined (ASTERISK_NEW_PARAGRAPH)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3811 cm_noindent ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3812 #endif /* ASTERISK_NEW_PARAGRAPH */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3813 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3814
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3815 /* Insert ellipsis. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3816 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3817 cm_dots (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3818 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3819 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3820 add_word ("...");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3821 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3822
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3823 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3824 cm_bullet (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3825 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3826 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3827 add_char ('*');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3828 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3829
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3830 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3831 cm_minus (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3832 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3833 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3834 add_char ('-');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3835 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3836
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3837 /* Insert "TeX". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3838 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3839 cm_TeX (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3840 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3841 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3842 add_word ("TeX");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3843 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3844
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3845 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3846 cm_copyright (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3847 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3848 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3849 add_word ("(C)");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3850 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3851
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3852 #if defined (__osf__)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3853 #define LOCALTIME_CAST(x) (time_t *)(x)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3854 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3855 #define LOCALTIME_CAST(x) (x)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3856 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3857
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3858 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3859 cm_today (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3860 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3861 static char * months [12] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3862 { "January", "February", "March", "April", "May", "June", "July",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3863 "August", "September", "October", "November", "December" };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3864 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3865 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3866 long timer = time (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3867 struct tm *ts = localtime (LOCALTIME_CAST (&timer));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3868 add_word_args
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3869 ("%d %s %d",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3870 (ts -> tm_mday),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3871 (months [ts -> tm_mon]),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3872 ((ts -> tm_year) + 1900));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3873 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3874 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3875
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3876 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3877 cm_code (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3878 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3879 extern int printing_index;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3880
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3881 if (printing_index)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3882 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3883
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3884 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3885 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3886 in_fixed_width_font++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3887 add_char ('`');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3888 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3889 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3890 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3891 add_word ("'");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3892 in_fixed_width_font--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3893 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3894 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3895
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3896 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3897 cm_samp (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3898 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3899 cm_code (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3900 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3901
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3902 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3903 cm_file (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3904 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3905 cm_code (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3906 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3907
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3908 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3909 cm_kbd (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3910 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3911 cm_code (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3912 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3913
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3914 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3915 cm_key (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3916 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3917 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3918
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3919 /* Convert the character at position into CTL. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3920 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3921 cm_ctrl (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3922 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3923 /* Should we allow multiple character arguments? I think yes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3924 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3925 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3926 register int i, character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3927 #if defined (NO_MULTIPLE_CTRL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3928 if ((end - start) != 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3929 line_error ("%c%s expects a single character as an argument",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3930 COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3931 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3932 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3933 for (i = start; i < end; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3934 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3935 character = output_paragraph[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3936
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3937 if (isletter (character))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3938 output_paragraph[i] = CTL (coerce_to_upper (character));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3939 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3940 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3941 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3942
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3943 /* Small Caps in makeinfo just does all caps. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3944 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3945 cm_sc (int arg, int start_pos, int end_pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3946 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3947 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3948 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3949 while (start_pos < end_pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3950 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3951 output_paragraph[start_pos] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3952 coerce_to_upper (output_paragraph[start_pos]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3953 start_pos++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3954 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3955 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3956 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3957
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3958 /* @var in makeinfo just uppercases the text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3959 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3960 cm_var (int arg, int start_pos, int end_pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3961 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3962 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3963 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3964 while (start_pos < end_pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3965 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3966 output_paragraph[start_pos] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3967 coerce_to_upper (output_paragraph[start_pos]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3968 start_pos++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3969 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3970 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3971 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3972
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3973 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3974 cm_dfn (int arg, int position)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3975 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3976 add_char ('"');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3977 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3978
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3979 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3980 cm_emph (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3981 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3982 add_char ('*');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3983 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3984
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3985 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3986 cm_strong (int arg, int position)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3987 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3988 cm_emph (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3989 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3990
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3991 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3992 cm_cite (int arg, int position)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3993 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3994 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3995 add_word ("`");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3996 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3997 add_word ("'");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3998 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3999
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4000 /* Current text is italicized. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4001 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4002 cm_italic (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4003 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4004 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4005
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4006 /* Current text is highlighted. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4007 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4008 cm_bold (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4009 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4010 cm_italic (arg, start, end);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4011 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4012
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4013 /* Current text is in roman font. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4014 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4015 cm_roman (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4016 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4017 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4018
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4019 /* Current text is in roman font. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4020 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4021 cm_titlefont (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4022 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4023 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4024
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4025 /* Italicize titles. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4026 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4027 cm_title (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4028 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4029 cm_italic (arg, start, end);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4030 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4031
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4032 /* @refill is a NOP. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4033 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4034 cm_refill (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4035 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4036 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4037
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4038 /* Prevent the argument from being split across two lines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4039 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4040 cm_w (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4041 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4042 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4043 non_splitting_words++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4044 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4045 non_splitting_words--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4046 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4047
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4048
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4049 /* Explain that this command is obsolete, thus the user shouldn't
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4050 do anything with it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4051 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4052 cm_obsolete (int arg, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4053 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4054 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4055 warning ("The command `%c%s' is obsolete", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4056 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4057
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4058 /* Insert the text following input_text_offset up to the end of the line
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4059 in a new, separate paragraph. Directly underneath it, insert a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4060 line of WITH_CHAR, the same length of the inserted text. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4061 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4062 insert_and_underscore (int with_char)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4063 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4064 register int i, len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4065 int old_no_indent, starting_pos, ending_pos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4066 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4067
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4068 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4069 filling_enabled = indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4070 old_no_indent = no_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4071 no_indent = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4072
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4073 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4074 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4075 append_to_expansion_output (input_text_offset + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4076 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4077
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4078 get_rest_of_line (&temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4079
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4080 starting_pos = output_position + output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4081 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4082 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4083 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4084 char *temp1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4085
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4086 temp1 = (char *)xmalloc (2 + strlen (temp));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4087 sprintf (temp1, "%s\n", temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4088 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4089 me_execute_string (temp1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4090 free (temp1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4091 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4092 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4093 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4094 execute_string ("%s\n", temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4095
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4096 ending_pos = output_position + output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4097 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4098
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4099 len = (ending_pos - starting_pos) - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4100 for (i = 0; i < len; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4101 add_char (with_char);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4102 insert ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4103 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4104 filling_enabled = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4105 no_indent = old_no_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4106 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4107
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4108 /* Here is a structure which associates sectioning commands with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4109 an integer, hopefully to reflect the `depth' of the current
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4110 section. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4111 struct {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4112 char *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4113 int level;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4114 } section_alist[] = {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4115 { "unnumberedsubsubsec", 5 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4116 { "unnumberedsubsec", 4 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4117 { "unnumberedsec", 3 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4118 { "unnumbered", 2 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4119 { "appendixsubsubsec", 5 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4120 { "appendixsubsec", 4 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4121 { "appendixsec", 3 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4122 { "appendixsection", 3 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4123 { "appendix", 2 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4124 { "subsubsec", 5 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4125 { "subsubsection", 5 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4126 { "subsection", 4 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4127 { "section", 3 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4128 { "chapter", 2 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4129 { "top", 1 },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4130
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4131 { (char *)NULL, 0 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4132 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4133
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4134 /* Amount to offset the name of sectioning commands to levels by. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4135 int section_alist_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4136
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4137 /* Shift the meaning of @section to @chapter. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4138 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4139 cm_raisesections (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4140 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4141 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4142 section_alist_offset--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4143 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4144
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4145 /* Shift the meaning of @chapter to @section. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4146 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4147 cm_lowersections (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4148 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4149 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4150 section_alist_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4151 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4152
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4153 /* Return an integer which identifies the type section present in TEXT. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4154 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4155 what_section (char *text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4156 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4157 register int i, j;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4158 char *t;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4159
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4160 find_section_command:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4161 for (j = 0; text[j] && cr_or_whitespace (text[j]); j++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4162 if (text[j] != COMMAND_PREFIX)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4163 return (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4164
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4165 text = text + j + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4166
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4167 /* We skip @c, @comment, and @?index commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4168 if ((strncmp (text, "comment", strlen ("comment")) == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4169 (text[0] == 'c' && cr_or_whitespace (text[1])) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4170 (strcmp (text + 1, "index") == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4171 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4172 while (*text++ != '\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4173 goto find_section_command;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4174 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4175
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4176 /* Handle italicized sectioning commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4177 if (*text == 'i')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4178 text++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4179
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4180 for (j = 0; text[j] && !cr_or_whitespace (text[j]); j++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4181
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4182 for (i = 0; (t = section_alist[i].name); i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4183 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4184 if (j == strlen (t) && strncmp (t, text, j) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4185 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4186 int return_val;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4187
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4188 return_val = (section_alist[i].level + section_alist_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4189
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4190 if (return_val < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4191 return_val = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4192 else if (return_val > 5)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4193 return_val = 5;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4194 return (return_val);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4195 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4196 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4197 return (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4198 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4199
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4200 /* Set the level of @top to LEVEL. Return the old level of @top. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4201 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4202 set_top_section_level (int level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4203 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4204 register int i, result = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4205
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4206 for (i = 0; section_alist[i].name; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4207 if (strcmp (section_alist[i].name, "top") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4208 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4209 result = section_alist[i].level;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4210 section_alist[i].level = level;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4211 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4212 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4213 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4214 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4215
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4216 /* Treat this just like @unnumbered. The only difference is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4217 in node defaulting. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4218 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4219 cm_top (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4220 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4221 /* It is an error to have more than one @top. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4222 if (top_node_seen)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4223 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4224 TAG_ENTRY *tag = tag_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4225
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4226 line_error ("There already is a node having %ctop as a section",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4227 COMMAND_PREFIX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4228
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4229 while (tag != (TAG_ENTRY *)NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4230 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4231 if ((tag->flags & IS_TOP))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4232 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4233 int old_line_number = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4234 char *old_input_filename = input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4235
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4236 line_number = tag->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4237 input_filename = tag->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4238 line_error ("Here is the %ctop node", COMMAND_PREFIX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4239 input_filename = old_input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4240 line_number = old_line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4241 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4242 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4243 tag = tag->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4244 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4245 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4246 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4247 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4248 top_node_seen = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4249
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4250 /* It is an error to use @top before you have used @node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4251 if (!tag_table)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4252 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4253 char *top_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4254
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4255 get_rest_of_line (&top_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4256 free (top_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4257 line_error ("%ctop used before %cnode, defaulting to %s",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4258 COMMAND_PREFIX, COMMAND_PREFIX, top_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4259 execute_string ("@node Top, , (dir), (dir)\n@top %s\n", top_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4260 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4261 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4262
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4263 cm_unnumbered ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4264
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4265 /* The most recently defined node is the top node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4266 tag_table->flags |= IS_TOP;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4267
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4268 /* Now set the logical hierarchical level of the Top node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4269 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4270 int orig_offset = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4271
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4272 input_text_offset = search_forward (node_search_string, orig_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4273
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4274 if (input_text_offset > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4275 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4276 int this_section;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4277
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4278 /* We have encountered a non-top node, so mark that one exists. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4279 non_top_node_seen = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4280
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4281 /* Move to the end of this line, and find out what the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4282 sectioning command is here. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4283 while (input_text[input_text_offset] != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4284 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4285
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4286 if (input_text_offset < size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4287 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4288
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4289 this_section = what_section (input_text + input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4291 /* If we found a sectioning command, then give the top section
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4292 a level of this section - 1. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4293 if (this_section != -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4294 set_top_section_level (this_section - 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4295 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4296 input_text_offset = orig_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4297 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4298 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4299 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4300
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4301 /* Organized by level commands. That is, "*" == chapter, "=" == section. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4302 char *scoring_characters = "*=-.";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4303
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4304 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4305 sectioning_underscore (char *commanned)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4306 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4307 char character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4308 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4309 int level;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4310
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4311 temp = (char *)xmalloc (2 + strlen (commanned));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4312 temp[0] = COMMAND_PREFIX;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4313 strcpy (&temp[1], commanned);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4314 level = what_section (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4315 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4316 level -= 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4317
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4318 if (level < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4319 level = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4320
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4321 character = scoring_characters[level];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4322
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4323 insert_and_underscore (character);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4324 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4325
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4326 /* The remainder of the text on this line is a chapter heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4327 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4328 cm_chapter (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4329 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4330 sectioning_underscore ("chapter");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4331 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4332
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4333 /* The remainder of the text on this line is a section heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4334 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4335 cm_section (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4336 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4337 sectioning_underscore ("section");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4338 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4339
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4340 /* The remainder of the text on this line is a subsection heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4341 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4342 cm_subsection (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4343 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4344 sectioning_underscore ("subsection");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4345 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4346
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4347 /* The remainder of the text on this line is a subsubsection heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4348 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4349 cm_subsubsection (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4350 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4351 sectioning_underscore ("subsubsection");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4352 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4353
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4354 /* The remainder of the text on this line is an unnumbered heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4355 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4356 cm_unnumbered (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4357 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4358 cm_chapter ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4359 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4360
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4361 /* The remainder of the text on this line is an unnumbered section heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4362 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4363 cm_unnumberedsec (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4364 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4365 cm_section ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4366 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4367
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4368 /* The remainder of the text on this line is an unnumbered
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4369 subsection heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4370 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4371 cm_unnumberedsubsec (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4372 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4373 cm_subsection ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4374 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4375
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4376 /* The remainder of the text on this line is an unnumbered
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4377 subsubsection heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4378 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4379 cm_unnumberedsubsubsec (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4380 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4381 cm_subsubsection ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4382 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4383
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4384 /* The remainder of the text on this line is an appendix heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4385 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4386 cm_appendix (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4387 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4388 cm_chapter ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4389 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4390
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4391 /* The remainder of the text on this line is an appendix section heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4392 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4393 cm_appendixsec (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4394 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4395 cm_section ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4396 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4397
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4398 /* The remainder of the text on this line is an appendix subsection heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4399 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4400 cm_appendixsubsec (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4401 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4402 cm_subsection ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4403 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4404
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4405 /* The remainder of the text on this line is an appendix
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4406 subsubsection heading. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4407 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4408 cm_appendixsubsubsec (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4409 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4410 cm_subsubsection ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4411 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4412
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4413 /* Compatibility functions substitute for chapter, section, etc. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4414 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4415 cm_majorheading (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4416 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4417 cm_chapheading ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4418 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4419
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4420 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4421 cm_chapheading (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4422 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4423 cm_chapter ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4424 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4425
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4426 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4427 cm_heading (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4428 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4429 cm_section ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4430 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4431
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4432 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4433 cm_subheading (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4434 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4435 cm_subsection ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4436 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4437
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4438 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4439 cm_subsubheading (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4440 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4441 cm_subsubsection ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4442 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4443
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4444
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4445 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4446 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4447 /* Adding nodes, and making tags */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4448 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4449 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4450
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4451 /* Start a new tag table. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4452 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4453 init_tag_table (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4454 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4455 while (tag_table != (TAG_ENTRY *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4456 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4457 TAG_ENTRY *temp = tag_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4458 free (temp->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4459 free (temp->prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4460 free (temp->next);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4461 free (temp->up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4462 tag_table = tag_table->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4463 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4464 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4465 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4466
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4467 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4468 write_tag_table (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4469 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4470 write_tag_table_internal (0); /* Not indirect. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4471 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4472
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4473 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4474 write_tag_table_indirect (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4475 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4476 write_tag_table_internal (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4477 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4478
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4479 /* Write out the contents of the existing tag table.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4480 INDIRECT_P says how to format the output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4481 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4482 write_tag_table_internal (int indirect_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4483 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4484 TAG_ENTRY *node = tag_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4485 int old_indent = no_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4486
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4487 no_indent = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4488 filling_enabled = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4489 must_start_paragraph = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4490 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4491
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4492 if (!indirect_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4493 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4494 no_indent = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4495 insert ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4496 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4497
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4498 add_word_args ("\037\nTag Table:\n%s", indirect_p ? "(Indirect)\n" : "");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4499
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4500 while (node != (TAG_ENTRY *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4501 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4502 execute_string ("Node: %s", node->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4503 add_word_args ("\177%d\n", node->position);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4504 node = node->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4505 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4506
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4507 add_word ("\037\nEnd Tag Table\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4508 flush_output ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4509 no_indent = old_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4510 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4511
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4512 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4513 get_node_token (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4514 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4515 char *string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4516
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4517 get_until_in_line (",", &string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4518
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4519 if (curchar () == ',')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4520 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4521
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4522 canon_white (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4523
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4524 /* Force all versions of "top" to be "Top". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4525 normalize_node_name (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4526
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4527 return (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4528 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4529
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4530 /* Convert "top" and friends into "Top". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4531 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4532 normalize_node_name (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4533 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4534 if (strcasecmp (string, "Top") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4535 strcpy (string, "Top");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4536 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4537
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4538 /* Look up NAME in the tag table, and return the associated
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4539 tag_entry. If the node is not in the table return NULL. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4540 static TAG_ENTRY *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4541 find_node (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4542 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4543 TAG_ENTRY *tag = tag_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4544
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4545 while (tag != (TAG_ENTRY *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4546 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4547 if (strcmp (tag->node, name) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4548 return (tag);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4549 tag = tag->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4550 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4551 return ((TAG_ENTRY *) NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4552 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4553
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4554 /* Remember NODE and associates. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4555 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4556 remember_node (char *node, char *prev, char *next, char *up, int position,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4557 int line_no, int no_warn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4558 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4559 /* Check for existence of this tag already. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4560 if (validating)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4561 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4562 register TAG_ENTRY *tag = find_node (node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4563 if (tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4564 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4565 line_error ("Node `%s' multiply defined (%d is first definition)",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4566 node, tag->line_no);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4567 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4568 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4569 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4570
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4571 /* First, make this the current node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4572 current_node = node;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4573
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4574 /* Now add it to the list. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4575 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4576 TAG_ENTRY *new = (TAG_ENTRY *) xmalloc (sizeof (TAG_ENTRY));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4577 new->node = node;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4578 new->prev = prev;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4579 new->next = next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4580 new->up = up;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4581 new->position = position;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4582 new->line_no = line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4583 new->filename = node_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4584 new->touched = 0; /* not yet referenced. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4585 new->flags = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4586 if (no_warn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4587 new->flags |= NO_WARN;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4588 new->next_ent = tag_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4589 tag_table = new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4590 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4591 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4592
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4593 /* The order is: nodename, nextnode, prevnode, upnode.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4594 If all of the NEXT, PREV, and UP fields are empty, they are defaulted.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4595 You must follow a node command which has those fields defaulted
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4596 with a sectioning command (e.g. @chapter) giving the "level" of that node.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4597 It is an error not to do so.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4598 The defaults come from the menu in this node's parent. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4599 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4600 cm_node (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4601 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4602 char *node, *prev, *next, *up;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4603 int new_node_pos, defaulting, this_section, no_warn = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4604 extern int already_outputting_pending_notes;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4605
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4606 if (strcmp (command, "nwnode") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4607 no_warn = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4608
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4609 /* Get rid of unmatched brace arguments from previous commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4610 discard_braces ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4611
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4612 /* There also might be insertions left lying around that haven't been
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4613 ended yet. Do that also. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4614 discard_insertions ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4615
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4616 if (!already_outputting_pending_notes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4617 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4618 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4619 output_pending_notes ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4620 free_pending_notes ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4621 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4622
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4623 filling_enabled = indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4624 new_node_pos = output_position;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4625 current_footnote_number = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4626
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4627 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4628 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4629 append_to_expansion_output (input_text_offset + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4630 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4631
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4632 node = get_node_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4633 next = get_node_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4634 prev = get_node_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4635 up = get_node_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4636
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4637 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4638 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4639 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4640 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4641
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4642 no_indent = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4643 if (!no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4644 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4645 add_word_args ("\037\nFile: %s, Node: ", pretty_output_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4646
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4647 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4648 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4649 me_execute_string (node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4650 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4651 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4652 execute_string ("%s", node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4653 filling_enabled = indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4654 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4655
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4656 /* Check for defaulting of this node's next, prev, and up fields. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4657 defaulting = ((strlen (next) == 0) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4658 (strlen (prev) == 0) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4659 (strlen (up) == 0));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4660
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4661 this_section = what_section (input_text + input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4662
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4663 /* If we are defaulting, then look at the immediately following
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4664 sectioning command (error if none) to determine the node's
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4665 level. Find the node that contains the menu mentioning this node
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4666 that is one level up (error if not found). That node is the "Up"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4667 of this node. Default the "Next" and "Prev" from the menu. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4668 if (defaulting)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4669 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4670 NODE_REF *last_ref = (NODE_REF *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4671 NODE_REF *ref = node_references;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4672
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4673 if ((this_section < 0) && (strcmp (node, "Top") != 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4674 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4675 char *polite_section_name = "top";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4676 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4677
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4678 for (i = 0; section_alist[i].name; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4679 if (section_alist[i].level == current_section + 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4680 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4681 polite_section_name = section_alist[i].name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4682 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4683 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4684
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4685 line_error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4686 ("Node `%s' requires a sectioning command (e.g. %c%s)",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4687 node, COMMAND_PREFIX, polite_section_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4688 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4689 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4690 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4691 if (strcmp (node, "Top") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4692 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4693 /* Default the NEXT pointer to be the first menu item in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4694 this node, if there is a menu in this node. We have to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4695 try very hard to find the menu, as it may be obscured
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4696 by execution_strings which are on the filestack. For
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4697 every member of the filestack which has a FILENAME
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4698 member which is identical to the current INPUT_FILENAME,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4699 search forward from that offset. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4700 int saved_input_text_offset = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4701 int saved_size_of_input_text = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4702 char *saved_input_text = input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4703 FSTACK *next_file = filestack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4704
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4705 int orig_offset, orig_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4706
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4707 /* No matter what, make this file point back at `(dir)'. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4708 free (up); up = strdup ("(dir)");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4709
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4710 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4711 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4712 orig_offset = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4713 orig_size =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4714 search_forward (node_search_string, orig_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4715
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4716 if (orig_size < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4717 orig_size = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4718
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4719 input_text_offset =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4720 search_forward (menu_search_string, orig_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4721
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4722 if (input_text_offset > -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4723 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4724 char *nodename_from_menu = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4725
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4726 input_text_offset =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4727 search_forward ("\n* ", input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4728
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4729 if (input_text_offset != -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4730 nodename_from_menu = glean_node_from_menu (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4731
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4732 if (nodename_from_menu)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4733 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4734 free (next); next = nodename_from_menu;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4735 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4736 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4737 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4738
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4739 /* We got here, so it hasn't been found yet. Try
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4740 the next file on the filestack if there is one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4741 if (next_file &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4742 (strcmp (next_file->filename, input_filename) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4743 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4744 input_text = next_file->text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4745 input_text_offset = next_file->offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4746 size_of_input_text = next_file->size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4747 next_file = next_file->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4748 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4749 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4750 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4751 /* No more input files to check. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4752 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4753 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4754 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4755
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4756 input_text = saved_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4757 input_text_offset = saved_input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4758 size_of_input_text = saved_size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4759 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4760 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4761
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4762 /* Fix the level of the menu references in the Top node, iff it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4763 was declared with @top, and no subsequent reference was found. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4764 if (top_node_seen && !non_top_node_seen)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4765 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4766 /* Then this is the first non-@top node seen. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4767 int level;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4768
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4769 level = set_top_section_level (this_section - 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4770 non_top_node_seen = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4771
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4772 while (ref)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4773 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4774 if (ref->section == level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4775 ref->section = this_section - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4776 ref = ref->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4777 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4778
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4779 ref = node_references;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4780 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4781
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4782 while (ref)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4783 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4784 if (ref->section == (this_section - 1) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4785 ref->type == menu_reference &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4786 strcmp (ref->node, node) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4787 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4788 char *containing_node = ref->containing_node;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4789
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4790 free (up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4791 up = strdup (containing_node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4792
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4793 if (last_ref &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4794 last_ref->type == menu_reference &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4795 (strcmp (last_ref->containing_node,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4796 containing_node) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4797 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4798 free (next);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4799 next = strdup (last_ref->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4800 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4801
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4802 while ((ref->section == this_section - 1) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4803 (ref->next) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4804 (ref->next->type != menu_reference))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4805 ref = ref->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4806
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4807 if (ref->next && ref->type == menu_reference &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4808 (strcmp (ref->next->containing_node,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4809 containing_node) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4810 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4811 free (prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4812 prev = strdup (ref->next->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4813 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4814 else if (!ref->next &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4815 strcasecmp (ref->containing_node, "Top") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4816 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4817 free (prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4818 prev = strdup (ref->containing_node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4819 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4820 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4821 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4822 last_ref = ref;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4823 ref = ref->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4824 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4825 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4826
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4827 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4828 /* Insert the correct args if we are expanding macros, and the node's
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4829 pointers weren't defaulted. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4830 if (macro_expansion_output_stream && !defaulting)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4831 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4832 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4833 int op_orig = output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4834
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4835 temp = (char *)xmalloc (3 + strlen (next));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4836 sprintf (temp, ", %s", next);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4837 me_execute_string (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4838 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4839
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4840 temp = (char *)xmalloc (3 + strlen (prev));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4841 sprintf (temp, ", %s", prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4842 me_execute_string (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4843 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4844
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4845 temp = (char *)xmalloc (4 + strlen (up));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4846 sprintf (temp, ", %s", up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4847 me_execute_string (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4848 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4849
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4850 output_paragraph_offset = op_orig;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4851 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4852 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4853
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4854 if (!no_headers)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4855 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4856 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4857 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4858 me_inhibit_expansion++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4859 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4860
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4861 if (*next)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4862 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4863 execute_string (", Next: %s", next);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4864 filling_enabled = indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4865 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4866
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4867 if (*prev)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4868 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4869 execute_string (", Prev: %s", prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4870 filling_enabled = indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4871 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4872
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4873 if (*up)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4874 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4875 execute_string (", Up: %s", up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4876 filling_enabled = indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4877 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4878 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4879 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4880 me_inhibit_expansion--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4881 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4882 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4883
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4884 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4885 no_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4886
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4887 if (!*node)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4888 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4889 line_error ("No node name specified for `%c%s' command",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4890 COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4891 free (node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4892 free (next);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4893 free (prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4894 free (up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4895 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4896 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4897 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4898 if (!*next) { free (next); next = (char *)NULL; }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4899 if (!*prev) { free (prev); prev = (char *)NULL; }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4900 if (!*up) { free (up); up = (char *)NULL; }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4901 remember_node (node, prev, next, up, new_node_pos, line_number, no_warn);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4902 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4903
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4904 /* Change the section only if there was a sectioning command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4905 if (this_section >= 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4906 current_section = this_section;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4907
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4908 filling_enabled = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4909 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4910
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4911 /* Validation of an info file.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4912 Scan through the list of tag entrys touching the Prev, Next, and Up
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4913 elements of each. It is an error not to be able to touch one of them,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4914 except in the case of external node references, such as "(DIR)".
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4915
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4916 If the Prev is different from the Up,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4917 then the Prev node must have a Next pointing at this node.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4918
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4919 Every node except Top must have an Up.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4920 The Up node must contain some sort of reference, other than a Next,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4921 to this node.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4922
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4923 If the Next is different from the Next of the Up,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4924 then the Next node must have a Prev pointing at this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4925 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4926 validate_file (TAG_ENTRY *tag_tayble)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4927 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4928 char *old_input_filename = input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4929 TAG_ENTRY *tags = tag_tayble;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4930
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4931 while (tags != (TAG_ENTRY *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4932 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4933 register TAG_ENTRY *temp_tag;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4934
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4935 input_filename = tags->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4936 line_number = tags->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4937
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4938 /* If this is a "no warn" node, don't validate it in any way. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4939 if (tags->flags & NO_WARN)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4940 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4941 tags = tags->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4942 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4943 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4944
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4945 /* If this node has a Next, then make sure that the Next exists. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4946 if (tags->next)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4947 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4948 validate (tags->next, tags->line_no, "Next");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4949
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4950 /* If the Next node exists, and there is no Up, then make
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4951 sure that the Prev of the Next points back. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4952 if ((temp_tag = find_node (tags->next)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4953 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4954 char *prev;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4955
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4956 if (temp_tag->flags & NO_WARN)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4957 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4958 /* Do nothing if we aren't supposed to issue warnings
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4959 about this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4960 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4961 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4962 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4963 prev = temp_tag->prev;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4964 if (!prev || (strcmp (prev, tags->node) != 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4965 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4966 line_error ("Node `%s''s Next field not pointed back to",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4967 tags->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4968 line_number = temp_tag->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4969 input_filename = temp_tag->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4970 line_error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4971 ("This node (`%s') is the one with the bad `Prev'",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4972 temp_tag->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4973 input_filename = tags->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4974 line_number = tags->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4975 temp_tag->flags |= PREV_ERROR;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4976 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4977 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4978 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4979 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4980
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4981 /* Validate the Prev field if there is one, and we haven't already
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4982 complained about it in some way. You don't have to have a Prev
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4983 field at this stage. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4984 if (!(tags->flags & PREV_ERROR) && tags->prev)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4985 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4986 int valid = validate (tags->prev, tags->line_no, "Prev");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4987
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4988 if (!valid)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4989 tags->flags |= PREV_ERROR;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4990 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4991 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4992 /* If the Prev field is not the same as the Up field,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4993 then the node pointed to by the Prev field must have
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4994 a Next field which points to this node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4995 if (tags->up && (strcmp (tags->prev, tags->up) != 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4996 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4997 temp_tag = find_node (tags->prev);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4998
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4999 /* If we aren't supposed to issue warnings about the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5000 target node, do nothing. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5001 if (!temp_tag || (temp_tag->flags & NO_WARN))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5002 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5003 /* Do nothing. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5004 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5005 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5006 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5007 if (!temp_tag->next ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5008 (strcmp (temp_tag->next, tags->node) != 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5009 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5010 line_error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5011 ("Node `%s''s Prev field not pointed back to",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5012 tags->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5013 line_number = temp_tag->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5014 input_filename = temp_tag->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5015 line_error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5016 ("This node (`%s') is the one with the bad `Next'",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5017 temp_tag->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5018 input_filename = tags->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5019 line_number = tags->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5020 temp_tag->flags |= NEXT_ERROR;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5021 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5022 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5023 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5024 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5025 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5026
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5027 if (!tags->up && (strcasecmp (tags->node, "Top") != 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5028 line_error ("Node `%s' is missing an \"Up\" field", tags->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5029 else if (tags->up)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5030 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5031 int valid = validate (tags->up, tags->line_no, "Up");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5032
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5033 /* If node X has Up: Y, then warn if Y fails to have a menu item
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5034 or note pointing at X, if Y isn't of the form "(Y)". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5035 if (valid && *tags->up != '(')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5036 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5037 NODE_REF *nref, *tref, *list;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5038
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5039 tref = (NODE_REF *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5040 list = node_references;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5041
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5042 for (;;)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5043 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5044 if (!(nref = find_node_reference (tags->node, list)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5045 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5046
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5047 if (strcmp (nref->containing_node, tags->up) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5048 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5049 if (nref->type != menu_reference)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5050 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5051 tref = nref;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5052 list = nref->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5053 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5054 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5055 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5056 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5057 list = nref->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5058 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5059
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5060 if (!nref)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5061 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5062 temp_tag = find_node (tags->up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5063 line_number = temp_tag->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5064 input_filename = temp_tag->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5065 if (!tref)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5066 line_error (
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5067 "`%s' has an Up field of `%s', but `%s' has no menu item for `%s'",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5068 tags->node, tags->up, tags->up, tags->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5069 line_number = tags->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5070 input_filename = tags->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5071 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5072 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5073 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5074 tags = tags->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5075 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5076
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5077 validate_other_references (node_references);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5078 /* We have told the user about the references which didn't exist.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5079 Now tell him about the nodes which aren't referenced. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5080
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5081 tags = tag_tayble;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5082 while (tags != (TAG_ENTRY *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5083 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5084 /* If this node is a "no warn" node, do nothing. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5085 if (tags->flags & NO_WARN)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5086 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5087 tags = tags->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5088 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5089 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5090
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5091 /* Special hack. If the node in question appears to have
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5092 been referenced more than REFERENCE_WARNING_LIMIT times,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5093 give a warning. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5094 if (tags->touched > reference_warning_limit)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5095 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5096 input_filename = tags->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5097 line_number = tags->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5098 warning ("Node `%s' has been referenced %d times",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5099 tags->node, tags->touched);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5100 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5101
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5102 if (tags->touched == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5103 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5104 input_filename = tags->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5105 line_number = tags->line_no;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5106
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5107 /* Notice that the node "Top" is special, and doesn't have to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5108 be referenced. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5109 if (strcasecmp (tags->node, "Top") != 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5110 warning ("Unreferenced node `%s'", tags->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5111 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5112 tags = tags->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5113 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5114 input_filename = old_input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5115 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5116
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5117 /* Return 1 if tag correctly validated, or 0 if not. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5118 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5119 validate (char *tag, int line, char *label)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5120 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5121 TAG_ENTRY *result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5122
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5123 /* If there isn't a tag to verify, or if the tag is in another file,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5124 then it must be okay. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5125 if (!tag || !*tag || *tag == '(')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5126 return (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5127
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5128 /* Otherwise, the tag must exist. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5129 result = find_node (tag);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5130
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5131 if (!result)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5132 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5133 line_number = line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5134 line_error (
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5135 "Validation error. `%s' field points to node `%s', which doesn't exist",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5136 label, tag);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5137 return (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5138 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5139 result->touched++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5140 return (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5141 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5142
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5143 /* Split large output files into a series of smaller files. Each file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5144 is pointed to in the tag table, which then gets written out as the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5145 original file. The new files have the same name as the original file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5146 with a "-num" attached. SIZE is the largest number of bytes to allow
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5147 in any single split file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5148 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5149 split_file (char *filename, int size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5150 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5151 char *root_filename, *root_pathname;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5152 char *the_file;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5153 struct stat fileinfo;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5154 long file_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5155 char *the_header;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5156 int header_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5157
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5158 /* Can only do this to files with tag tables. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5159 if (!tag_table)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5160 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5161
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5162 if (size == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5163 size = DEFAULT_SPLIT_SIZE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5164
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5165 if ((stat (filename, &fileinfo) != 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5166 (((long) fileinfo.st_size) < SPLIT_SIZE_THRESHOLD))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5167 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5168 file_size = (long) fileinfo.st_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5170 the_file = find_and_load (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5171 if (!the_file)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5172 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5173
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5174 root_filename = filename_part (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5175 root_pathname = pathname_part (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5176
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5177 if (!root_pathname)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5178 root_pathname = strdup ("");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5179
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5180 /* Start splitting the file. Walk along the tag table
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5181 outputting sections of the file. When we have written
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5182 all of the nodes in the tag table, make the top-level
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5183 pointer file, which contains indirect pointers and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5184 tags for the nodes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5185 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5186 int which_file = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5187 TAG_ENTRY *tags = tag_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5188 char *indirect_info = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5189
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5190 /* Remember the `header' of this file. The first tag in the file is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5191 the bottom of the header; the top of the file is the start. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5192 the_header = (char *)xmalloc (1 + (header_size = tags->position));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5193 memcpy (the_header, the_file, header_size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5194
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5195 while (tags)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5196 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5197 int file_top, file_bot, limit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5198
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5199 /* Have to include the Control-_. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5200 file_top = file_bot = tags->position;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5201 limit = file_top + size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5202
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5203 /* If the rest of this file is only one node, then
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5204 that is the entire subfile. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5205 if (!tags->next_ent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5206 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5207 int i = tags->position + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5208 char last_char = the_file[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5209
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5210 while (i < file_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5211 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5212 if ((the_file[i] == '\037') &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5213 ((last_char == '\n') ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5214 (last_char == '\014')))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5215 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5216 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5217 last_char = the_file[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5218 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5219 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5220 file_bot = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5221 tags = tags->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5222 goto write_region;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5223 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5224
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5225 /* Otherwise, find the largest number of nodes that can fit in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5226 this subfile. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5227 for (; tags; tags = tags->next_ent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5228 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5229 if (!tags->next_ent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5230 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5231 /* This entry is the last node. Search forward for the end
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5232 of this node, and that is the end of this file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5233 int i = tags->position + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5234 char last_char = the_file[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5235
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5236 while (i < file_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5237 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5238 if ((the_file[i] == '\037') &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5239 ((last_char == '\n') ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5240 (last_char == '\014')))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5241 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5242 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5243 last_char = the_file[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5244 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5245 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5246 file_bot = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5247
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5248 if (file_bot < limit)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5249 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5250 tags = tags->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5251 goto write_region;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5252 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5253 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5254 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5255 /* Here we want to write out everything before the last
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5256 node, and then write the last node out in a file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5257 by itself. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5258 file_bot = tags->position;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5259 goto write_region;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5260 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5261 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5262
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5263 if (tags->next_ent->position > limit)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5264 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5265 if (tags->position == file_top)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5266 tags = tags->next_ent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5267
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5268 file_bot = tags->position;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5269
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5270 write_region:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5271 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5272 int fd;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5273 char *split_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5274
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5275 split_filename = (char *) xmalloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5276 (10 + strlen (root_pathname) + strlen (root_filename));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5277 sprintf
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5278 (split_filename,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5279 #ifdef MSDOS
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5280 "%s%s.%d", root_pathname, root_filename, which_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5281 #else /* !MSDOS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5282 "%s%s-%d", root_pathname, root_filename, which_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5283 #endif /* !MSDOS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5284
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5285 fd = open
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5286 (split_filename, O_WRONLY | O_TRUNC | O_CREAT, 0666);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5287
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5288 if ((fd < 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5289 (write (fd, the_header, header_size) != header_size) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5290 (write (fd, the_file + file_top, file_bot - file_top)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5291 != (file_bot - file_top)) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5292 ((close (fd)) < 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5293 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5294 perror (split_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5295 if (fd != -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5296 close (fd);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5297 exit (FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5298 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5299
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5300 if (!indirect_info)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5301 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5302 indirect_info = the_file + file_top;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5303 sprintf (indirect_info, "\037\nIndirect:\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5304 indirect_info += strlen (indirect_info);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5305 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5306
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5307 #ifdef MSDOS
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5308 sprintf (indirect_info, "%s.%d: %d\n",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5309 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5310 sprintf (indirect_info, "%s-%d: %d\n",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5311 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5312 root_filename, which_file, file_top);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5313
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5314 free (split_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5315 indirect_info += strlen (indirect_info);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5316 which_file++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5317 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5318 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5319 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5320 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5321 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5322
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5323 /* We have sucessfully created the subfiles. Now write out the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5324 original again. We must use `output_stream', or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5325 write_tag_table_indirect () won't know where to place the output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5326 output_stream = fopen (filename, "w");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5327 if (!output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5328 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5329 perror (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5330 exit (FATAL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5331 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5332
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5333 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5334 int distance = indirect_info - the_file;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5335 fwrite (the_file, 1, distance, output_stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5336
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5337 /* Inhibit newlines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5338 paragraph_is_open = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5339
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5340 write_tag_table_indirect ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5341 fclose (output_stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5342 free (the_header);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5343 free (the_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5344 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5345 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5346 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5347 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5348
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5349 /* Some menu hacking. This is used to remember menu references while
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5350 reading the input file. After the output file has been written, if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5351 validation is on, then we use the contents of NODE_REFERENCES as a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5352 list of nodes to validate. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5353 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5354 reftype_type_string (enum reftype type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5355 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5356 switch (type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5357 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5358 case menu_reference:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5359 return ("Menu");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5360 case followed_reference:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5361 return ("Followed-Reference");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5362 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5363 return ("Internal-bad-reference-type");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5364 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5365 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5366
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5367 /* Remember this node name for later validation use. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5368 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5369 remember_node_reference (char *node, int line, enum reftype type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5370 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5371 NODE_REF *temp = (NODE_REF *) xmalloc (sizeof (NODE_REF));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5372
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5373 temp->next = node_references;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5374 temp->node = strdup (node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5375 temp->line_no = line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5376 temp->section = current_section;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5377 temp->type = type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5378 temp->containing_node = (current_node ? strdup (current_node) : 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5379 temp->filename = node_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5380
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5381 node_references = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5382 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5383
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5384 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5385 validate_other_references (register NODE_REF *ref_list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5386 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5387 char *old_input_filename = input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5388
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5389 while (ref_list != (NODE_REF *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5390 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5391 input_filename = ref_list->filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5392 validate (ref_list->node, ref_list->line_no,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5393 reftype_type_string (ref_list->type));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5394 ref_list = ref_list->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5395 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5396 input_filename = old_input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5397 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5398
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5399 /* Find NODE in REF_LIST. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5400 static NODE_REF *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5401 find_node_reference (char *node, register NODE_REF *ref_list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5402 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5403 while (ref_list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5404 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5405 if (strcmp (node, ref_list->node) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5406 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5407 ref_list = ref_list->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5408 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5409 return (ref_list);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5410 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5411
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5412 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5413 free_node_references (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5414 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5415 register NODE_REF *list, *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5416
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5417 list = node_references;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5418
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5419 while (list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5420 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5421 temp = list;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5422 free (list->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5423 free (list->containing_node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5424 list = list->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5425 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5426 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5427 node_references = (NODE_REF *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5428 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5429
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5430 /* This function gets called at the start of every line while inside of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5431 a menu. It checks to see if the line starts with "* ", and if so,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5432 remembers the node reference that this menu refers to.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5433 input_text_offset is at the \n just before the line start. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5434 #define menu_starter "* "
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5435 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5436 glean_node_from_menu (int remember_reference)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5437 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5438 int i, orig_offset = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5439 char *nodename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5440
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5441 if (strncmp (&input_text[input_text_offset + 1],
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5442 menu_starter,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5443 strlen (menu_starter)) != 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5444 return ((char *)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5445 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5446 input_text_offset += strlen (menu_starter) + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5447
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5448 get_until_in_line (":", &nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5449 if (curchar () == ':')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5450 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5451 canon_white (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5452
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5453 if (curchar () == ':')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5454 goto save_node;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5455
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5456 free (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5457 get_rest_of_line (&nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5458
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5459 /* Special hack: If the nodename follows the menu item name,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5460 then we have to read the rest of the line in order to find
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5461 out what the nodename is. But we still have to read the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5462 line later, in order to process any formatting commands that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5463 might be present. So un-count the carriage return that has just
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5464 been counted. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5465 line_number--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5466
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5467 isolate_nodename (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5468
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5469 save_node:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5470 input_text_offset = orig_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5471 normalize_node_name (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5472 i = strlen (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5473 if (i && nodename[i - 1] == ':')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5474 nodename[i - 1] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5475
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5476 if (remember_reference)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5477 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5478 remember_node_reference (nodename, line_number, menu_reference);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5479 free (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5480 return ((char *)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5481 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5482 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5483 return (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5484 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5485
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5486 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5487 isolate_nodename (char *nodename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5488 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5489 register int i, c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5490 int paren_seen, paren;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5491
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5492 if (!nodename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5493 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5494
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5495 canon_white (nodename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5496 paren_seen = paren = i = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5497
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5498 if (*nodename == '.' || !*nodename)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5499 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5500 *nodename = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5501 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5502 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5503
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5504 if (*nodename == '(')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5505 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5506 paren++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5507 paren_seen++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5508 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5509 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5510
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5511 for (; (c = nodename[i]); i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5512 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5513 if (paren)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5514 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5515 if (c == '(')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5516 paren++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5517 else if (c == ')')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5518 paren--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5519
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5520 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5521 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5522
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5523 /* If the character following the close paren is a space, then this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5524 node has no more characters associated with it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5525 if (c == '\t' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5526 c == '\n' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5527 c == ',' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5528 ((paren_seen && nodename[i - 1] == ')') &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5529 (c == ' ' || c == '.')) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5530 (c == '.' &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5531 ((!nodename[i + 1] ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5532 (cr_or_whitespace (nodename[i + 1])) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5533 (nodename[i + 1] == ')')))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5534 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5535 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5536 nodename[i] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5537 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5538
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5539 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5540 cm_menu (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5541 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5542 begin_insertion (menu);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5543 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5544
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5545
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5546 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5547 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5548 /* Cross Reference Hacking */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5549 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5550 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5551
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5552 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5553 get_xref_token (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5554 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5555 char *string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5556
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5557 get_until_in_braces (",", &string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5558 if (curchar () == ',')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5559 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5560 fix_whitespace (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5561 return (string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5562 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5563
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5564 int px_ref_flag = 0; /* Controls initial output string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5565
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5566 /* Make a cross reference. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5567 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5568 cm_xref (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5569 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5570 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5571 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5572 char *arg1, *arg2, *arg3, *arg4, *arg5;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5573
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5574 arg1 = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5575 arg2 = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5576 arg3 = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5577 arg4 = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5578 arg5 = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5579
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5580 add_word_args ("%s", px_ref_flag ? "*note " : "*Note ");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5581
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5582 if (*arg5 || *arg4)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5583 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5584 char *node_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5585
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5586 if (!*arg2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5587 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5588 if (*arg3)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5589 node_name = arg3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5590 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5591 node_name = arg1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5592 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5593 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5594 node_name = arg2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5595
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5596 execute_string ("%s: (%s)%s", node_name, arg4, arg1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5597 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5598 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5599 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5600 remember_node_reference (arg1, line_number, followed_reference);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5601
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5602 if (*arg3)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5603 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5604 if (!*arg2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5605 execute_string ("%s: %s", arg3, arg1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5606 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5607 execute_string ("%s: %s", arg2, arg1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5608 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5609 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5610 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5611 if (*arg2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5612 execute_string ("%s: %s", arg2, arg1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5613 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5614 execute_string ("%s::", arg1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5615 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5616
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5617 /* Free all of the arguments found. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5618 if (arg1) free (arg1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5619 if (arg2) free (arg2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5620 if (arg3) free (arg3);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5621 if (arg4) free (arg4);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5622 if (arg5) free (arg5);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5623 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5624 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5625 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5626 /* Check to make sure that the next non-whitespace character is either
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5627 a period or a comma. input_text_offset is pointing at the "}" which
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5628 ended the xref or pxref command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5629 int temp = input_text_offset + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5630
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5631 if (output_paragraph[output_paragraph_offset - 2] == ':' &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5632 output_paragraph[output_paragraph_offset - 1] == ':')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5633 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5634 while (temp < size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5635 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5636 if (cr_or_whitespace (input_text[temp]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5637 temp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5638 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5639 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5640 if (input_text[temp] == '.' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5641 input_text[temp] == ',' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5642 input_text[temp] == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5643 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5644 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5645 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5646 line_error (
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5647 "Cross-reference must be terminated with a period or a comma");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5648 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5649 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5650 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5651 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5652 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5653 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5654
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5655 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5656 cm_pxref (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5657 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5658 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5659 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5660 px_ref_flag++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5661 cm_xref (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5662 px_ref_flag--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5663 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5664 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5665 add_char ('.');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5666 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5667
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5668 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5669 cm_inforef (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5670 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5671 if (arg == START)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5672 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5673 char *node, *pname, *file;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5674
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5675 node = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5676 pname = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5677 file = get_xref_token ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5678
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5679 execute_string ("*note %s: (%s)%s", pname, file, node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5680 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5681 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5682
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5683 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5684 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5685 /* Insertion Command Stubs */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5686 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5687 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5688
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5689 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5690 cm_quotation (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5691 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5692 begin_insertion (quotation);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5693 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5694
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5695 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5696 cm_example (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5697 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5698 begin_insertion (example);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5699 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5700
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5701 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5702 cm_smallexample (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5703 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5704 begin_insertion (smallexample);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5705 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5706
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5707 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5708 cm_lisp (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5709 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5710 begin_insertion (lisp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5711 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5712
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5713 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5714 cm_smalllisp (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5715 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5716 begin_insertion (smalllisp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5717 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5718
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5719 /* @cartouche/@end cartouche draws box with rounded corners in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5720 TeX output. Right now, just a NOP insertion. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5721 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5722 cm_cartouche (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5723 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5724 begin_insertion (cartouche);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5725 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5726
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5727 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5728 cm_format (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5729 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5730 begin_insertion (format);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5731 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5732
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5733 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5734 cm_display (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5735 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5736 begin_insertion (display);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5737 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5738
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5739 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5740 cm_itemize (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5741 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5742 begin_insertion (itemize);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5743 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5744
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5745 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5746 cm_enumerate (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5747 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5748 do_enumeration (enumerate, "1");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5749 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5750
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5751 /* Start an enumeration insertion of type TYPE. If the user supplied
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5752 no argument on the line, then use DEFAULT_STRING as the initial string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5753 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5754 do_enumeration (int type, char *default_string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5755 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5756 get_until_in_line (".", &enumeration_arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5757 canon_white (enumeration_arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5758
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5759 if (!*enumeration_arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5760 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5761 free (enumeration_arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5762 enumeration_arg = strdup (default_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5763 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5764
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5765 if (!isdigit (*enumeration_arg) && !isletter (*enumeration_arg))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5766 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5767 warning ("%s requires a letter or a digit", insertion_type_pname (type));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5768
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5769 switch (type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5770 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5771 case enumerate:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5772 default_string = "1";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5773 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5774 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5775 enumeration_arg = strdup (default_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5776 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5777 begin_insertion (type);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5778 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5779
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5780 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5781 cm_table (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5782 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5783 begin_insertion (table);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5784 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5785
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5786 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5787 cm_ftable (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5788 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5789 begin_insertion (ftable);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5790 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5791
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5792 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5793 cm_vtable (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5794 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5795 begin_insertion (vtable);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5796 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5797
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5798 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5799 cm_group (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5800 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5801 begin_insertion (group);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5802 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5803
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5804 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5805 cm_ifinfo (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5806 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5807 /* begin_insertion (ifinfo); */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5808 /* BPW: @ifinfo can cross hierarchies */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5809 ifinfo_count++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5810 if (in_menu)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5811 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5812 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5813
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5814 /* Begin an insertion where the lines are not filled or indented. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5815 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5816 cm_flushleft (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5817 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5818 begin_insertion (flushleft);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5819 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5820
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5821 /* Begin an insertion where the lines are not filled, and each line is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5822 forced to the right-hand side of the page. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5823 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5824 cm_flushright (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5825 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5826 begin_insertion (flushright);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5827 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5828
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5829
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5830 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5831 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5832 /* Conditional Handling */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5833 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5834 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5835
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5836 /* A structure which contains `defined' variables. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5837 typedef struct _defines {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5838 struct _defines *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5839 char *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5840 char *value;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5841 } DEFINE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5842
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5843 /* The linked list of `set' defines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5844 DEFINE *defines = (DEFINE *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5845
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5846 /* Add NAME to the list of `set' defines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5847 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5848 set (char *name, char *value)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5849 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5850 DEFINE *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5851
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5852 for (temp = defines; temp; temp = temp->next)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5853 if (strcmp (name, temp->name) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5854 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5855 free (temp->value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5856 temp->value = strdup (value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5857 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5858 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5859
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5860 temp = (DEFINE *)xmalloc (sizeof (DEFINE));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5861 temp->next = defines;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5862 temp->name = strdup (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5863 temp->value = strdup (value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5864 defines = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5865 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5866
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5867 /* Remove NAME from the list of `set' defines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5868 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5869 clear (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5870 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5871 register DEFINE *temp, *last;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5872
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5873 last = (DEFINE *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5874 temp = defines;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5875
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5876 while (temp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5877 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5878 if (strcmp (temp->name, name) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5879 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5880 if (last)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5881 last->next = temp->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5882 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5883 defines = temp->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5884
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5885 free (temp->name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5886 free (temp->value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5887 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5888 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5889 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5890 last = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5891 temp = temp->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5892 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5893 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5894
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5895 /* Return the value of NAME. The return value is NULL if NAME is unset. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5896 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5897 set_p (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5898 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5899 register DEFINE *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5900
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5901 for (temp = defines; temp; temp = temp->next)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5902 if (strcmp (temp->name, name) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5903 return (temp->value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5904
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5905 return ((char *)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5906 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5907
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5908 /* Conditionally parse based on the current command name. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5909 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5910 command_name_condition (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5911 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5912 char *discarder;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5913
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5914 discarder = (char *)xmalloc (8 + strlen (command));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5915
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5916 sprintf (discarder, "\n%cend %s", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5917 discard_until (discarder);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5918 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5919
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5920 free (discarder);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5921 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5922
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5923 /* Create a variable whose name appears as the first word on this line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5924 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5925 cm_set (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5926 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5927 handle_variable (SET);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5928 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5929
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5930 /* Remove a variable whose name appears as the first word on this line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5931 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5932 cm_clear (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5933 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5934 handle_variable (CLEAR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5935 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5936
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5937 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5938 cm_ifset (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5939 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5940 handle_variable (IFSET);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5941 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5942
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5943 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5944 cm_ifclear (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5945 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5946 handle_variable (IFCLEAR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5947 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5948
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5949 /* This command takes braces, but we parse the contents specially, so we
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5950 don't use the standard brace popping code.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5951
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5952 The syntax @ifeq{arg1, arg2, texinfo commands} performs texinfo commands
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5953 if ARG1 and ARG2 caselessly string compare to the same string, otherwise,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5954 it produces no output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5955 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5956 cm_ifeq (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5957 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5958 char **arglist;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5959
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5960 arglist = get_brace_args (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5961
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5962 if (arglist)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5963 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5964 if (array_len (arglist) > 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5965 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5966 if ((strcasecmp (arglist[0], arglist[1]) == 0) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5967 (arglist[2] != (char *)NULL))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5968 execute_string ("%s\n", arglist[2]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5969 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5970
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5971 free_array (arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5972 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5973 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5974
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5975 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5976 cm_value (int arg, int start_pos, int end_pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5977 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5978 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5979 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5980 char *name, *value;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5981 name = (char *)&output_paragraph[start_pos];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5982 output_paragraph[end_pos] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5983 name = strdup (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5984 value = set_p (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5985 output_column -= end_pos - start_pos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5986 output_paragraph_offset = start_pos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5987
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5988 if (value)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5989 execute_string ("%s", value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5990 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5991 add_word_args ("{No Value For \"%s\"}", name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5992
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5993 free (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5994 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5995 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5996
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5997 /* Set, clear, or conditionalize based on ACTION. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5998 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5999 handle_variable (int action)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6000 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6001 char *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6002
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6003 get_rest_of_line (&name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6004 backup_input_pointer ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6005 canon_white (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6006 handle_variable_internal (action, name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6007 free (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6008 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6009
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6010 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6011 handle_variable_internal (int action, char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6012 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6013 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6014 int delimiter, additional_text_present = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6015
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6016 /* Only the first word of NAME is a valid tag. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6017 temp = name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6018 delimiter = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6019 while (*temp && (delimiter || !whitespace (*temp)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6020 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6021 /* #if defined (SET_WITH_EQUAL) */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6022 if (*temp == '"' || *temp == '\'')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6023 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6024 if (*temp == delimiter)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6025 delimiter = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6026 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6027 delimiter = *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6028 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6029 /* #endif SET_WITH_EQUAL */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6030 temp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6031 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6032
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6033 if (*temp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6034 additional_text_present++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6035
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6036 *temp = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6037
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6038 if (!*name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6039 line_error ("%c%s requires a name", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6040 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6041 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6042 switch (action)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6043 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6044 case SET:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6045 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6046 char *value;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6047
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6048 #if defined (SET_WITH_EQUAL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6049 /* Allow a value to be saved along with a variable. The value is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6050 the text following an `=' sign in NAME, if any is present. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6051
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6052 for (value = name; *value && *value != '='; value++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6053
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6054 if (*value)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6055 *value++ = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6056
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6057 if (*value == '"' || *value == '\'')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6058 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6059 value++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6060 value[strlen (value) - 1] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6061 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6062
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6063 #else /* !SET_WITH_EQUAL */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6064 /* The VALUE of NAME is the remainder of the line sans
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6065 whitespace. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6066 if (additional_text_present)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6067 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6068 value = temp + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6069 canon_white (value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6070 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6071 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6072 value = "";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6073 #endif /* !SET_WITH_VALUE */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6074
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6075 set (name, value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6076 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6077 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6078
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6079 case CLEAR:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6080 clear (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6081 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6082
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6083 case IFSET:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6084 case IFCLEAR:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6085 /* If IFSET and NAME is not set, or if IFCLEAR and NAME is set,
2
ac2d302a0011 Import from CVS: tag r19-15b2
cvs
parents: 0
diff changeset
6086 read lines from the file until we reach a matching
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6087 "@end CONDITION". This means that we only take note of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6088 "@ifset/clear" and "@end" commands. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6089 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6090 char condition[8];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6091 int condition_len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6092
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6093 if (action == IFSET)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6094 strcpy (condition, "ifset");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6095 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6096 strcpy (condition, "ifclear");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6097
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6098 condition_len = strlen (condition);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6099
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6100 if ((action == IFSET && !set_p (name)) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6101 (action == IFCLEAR && set_p (name)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6102 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6103 int level = 0, done = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6104
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6105 while (!done)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6106 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6107 char *freeable_line, *line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6108
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6109 get_rest_of_line (&freeable_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6110
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6111 for (line = freeable_line; whitespace (*line); line++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6112
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6113 if (*line == COMMAND_PREFIX &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6114 (strncmp (line + 1, condition, condition_len) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6115 level++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6116 else if (strncmp (line, "@end", 4) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6117 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6118 char *cname = line + 4;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6119 char *temp2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6120
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6121 while (*cname && whitespace (*cname))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6122 cname++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6123 temp2 = cname;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6124
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6125 while (*temp2 && !whitespace (*temp2))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6126 temp2++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6127 *temp2 = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6128
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6129 if (strcmp (cname, condition) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6130 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6131 if (!level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6132 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6133 done = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6134 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6135 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6136 level--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6137 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6138 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6139 free (freeable_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6140 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6141 /* We found the end of a false @ifset/ifclear. If we are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6142 in a menu, back up over the newline that ends the ifset,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6143 since that newline may also begin the next menu entry. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6144 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6145 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6146 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6147 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6148 if (action == IFSET)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6149 begin_insertion (ifset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6150 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6151 begin_insertion (ifclear);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6152 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6153 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6154 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6155 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6156 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6157 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6158
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6159
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6160 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6161 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6162 /* Execution of Random Text not in file */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6163 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6164 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6165
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6166 typedef struct {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6167 char *string; /* The string buffer. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6168 int size; /* The size of the buffer. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6169 int in_use; /* Non-zero means string currently in use. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6170 } EXECUTION_STRING;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6171
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6172 static EXECUTION_STRING **execution_strings = (EXECUTION_STRING **)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6173 static int execution_strings_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6174 static int execution_strings_slots = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6175
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6176 static EXECUTION_STRING *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6177 get_execution_string (int initial_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6178 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6179 register int i = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6180 EXECUTION_STRING *es = (EXECUTION_STRING *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6181
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6182 if (execution_strings)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6183 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6184 for (i = 0; i < execution_strings_index; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6185 if (execution_strings[i] && (execution_strings[i]->in_use == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6186 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6187 es = execution_strings[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6188 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6189 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6190 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6191
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6192 if (!es)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6193 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6194 if (execution_strings_index + 1 >= execution_strings_slots)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6195 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6196 execution_strings = (EXECUTION_STRING **)xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6197 (execution_strings,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6198 (execution_strings_slots += 3) * sizeof (EXECUTION_STRING *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6199 for (; i < execution_strings_slots; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6200 execution_strings[i] = (EXECUTION_STRING *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6201 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6202
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6203 execution_strings[execution_strings_index] =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6204 (EXECUTION_STRING *)xmalloc (sizeof (EXECUTION_STRING));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6205 es = execution_strings[execution_strings_index];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6206 execution_strings_index++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6207
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6208 es->size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6209 es->string = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6210 es->in_use = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6211 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6212
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6213 if (initial_size > es->size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6214 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6215 es->string = (char *) xrealloc (es->string, initial_size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6216 es->size = initial_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6217 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6218 return (es);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6219 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6220
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6221 /* Execute the string produced by formatting the ARGs with FORMAT. This
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6222 is like submitting a new file with @include. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6223
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6224 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6225 execute_string (char *formatte, ...)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6226 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6227 va_list ap;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6228 EXECUTION_STRING *es;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6229 char *temp_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6230
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6231 es = get_execution_string (4000);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6232 temp_string = es->string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6233 es->in_use = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6234
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6235 va_start (ap, formatte);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6236 vsprintf (temp_string, formatte, ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6237 va_end (ap);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6238
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6239 pushfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6240 input_text_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6241 input_text = temp_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6242 input_filename = strdup (input_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6243 size_of_input_text = strlen (temp_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6244
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6245 executing_string++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6246 reader_loop ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6247 free (input_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6248
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6249 popfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6250 executing_string--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6251 es->in_use = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6252 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6253
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6254 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6255 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6256 /* @itemx, @item */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6257 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6258 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6259
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6260 static int itemx_flag = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6261
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6262 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6263 cm_itemx (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6264 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6265 itemx_flag++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6266 cm_item ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6267 itemx_flag--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6268 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6269
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6270 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6271 cm_item (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6272 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6273 char *rest_of_line, *item_func;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6274
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6275 /* Can only hack "@item" while inside of an insertion. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6276 if (insertion_level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6277 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6278 INSERTION_ELT *stack = insertion_stack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6279 int original_input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6280
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6281 skip_whitespace ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6282 original_input_text_offset = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6283
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6284 get_rest_of_line (&rest_of_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6285 canon_white (rest_of_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6286 item_func = current_item_function ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6287
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6288 /* Okay, do the right thing depending on which insertion function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6289 is active. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6291 switch_top:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6292 switch (stack->insertion)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6293 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6294 case ifinfo:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6295 case ifset:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6296 case ifclear:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6297 case cartouche:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6298 stack = stack->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6299 if (!stack)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6300 goto no_insertion;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6301 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6302 goto switch_top;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6303 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6304
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6305 case menu:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6306 case quotation:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6307 case example:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6308 case smallexample:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6309 case lisp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6310 case format:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6311 case display:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6312 case group:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6313 line_error ("The `%c%s' command is meaningless within a `@%s' block",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6314 COMMAND_PREFIX, command,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6315 insertion_type_pname (current_insertion_type ()));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6316 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6317
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6318 case itemize:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6319 case enumerate:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6320 if (itemx_flag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6321 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6322 line_error ("%citemx is not meaningful inside of a `%s' block",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6323 COMMAND_PREFIX,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6324 insertion_type_pname (current_insertion_type ()));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6325 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6326 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6327 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6328 start_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6329 kill_self_indent (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6330 filling_enabled = indented_fill = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6331
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6332 if (current_insertion_type () == itemize)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6333 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6334 indent (output_column = current_indent - 2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6335
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6336 /* I need some way to determine whether this command
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6337 takes braces or not. I believe the user can type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6338 either "@bullet" or "@bullet{}". Of course, they
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6339 can also type "o" or "#" or whatever else they want. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6340 if (item_func && *item_func)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6341 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6342 if (*item_func == COMMAND_PREFIX)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6343 if (item_func[strlen (item_func) - 1] != '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6344 execute_string ("%s{}", item_func);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6345 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6346 execute_string ("%s", item_func);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6347 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6348 execute_string ("%s", item_func);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6349 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6350 insert (' ');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6351 output_column++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6352 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6353 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6354 enumerate_item ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6355
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6356 /* Special hack. This makes close paragraph ignore you until
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6357 the start_paragraph () function has been called. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6358 must_start_paragraph = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6359
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6360 /* Ultra special hack. It appears that some people incorrectly
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6361 place text directly after the @item, instead of on a new line
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6362 by itself. This happens to work in TeX, so I make it work
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6363 here. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6364 if (*rest_of_line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6365 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6366 line_number--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6367 input_text_offset = original_input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6368 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6369 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6370 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6371
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6372 case table:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6373 case ftable:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6374 case vtable:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6375 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6376 /* Get rid of extra characters. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6377 kill_self_indent (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6378
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6379 /* close_paragraph () almost does what we want. The problem
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6380 is when paragraph_is_open, and last_char_was_newline, and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6381 the last newline has been turned into a space, because
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6382 filling_enabled. I handle it here. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6383 if (last_char_was_newline && filling_enabled && paragraph_is_open)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6384 insert ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6385 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6386
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6387 #if defined (INDENT_PARAGRAPHS_IN_TABLE)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6388 /* Indent on a new line, but back up one indentation level. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6389 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6390 int t;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6391
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6392 t = inhibit_paragraph_indentation;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6393 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6394 /* At this point, inserting any non-whitespace character will
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6395 force the existing indentation to be output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6396 add_char ('i');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6397 inhibit_paragraph_indentation = t;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6398 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6399 #else /* !INDENT_PARAGRAPHS_IN_TABLE */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6400 add_char ('i');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6401 #endif /* !INDENT_PARAGRAPHS_IN_TABLE */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6402
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6403 output_paragraph_offset--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6404 kill_self_indent (default_indentation_increment + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6405
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6406 /* Add item's argument to the line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6407 filling_enabled = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6408 if (item_func && *item_func)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6409 execute_string ("%s{%s}", item_func, rest_of_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6410 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6411 execute_string ("%s", rest_of_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6412
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6413 if (current_insertion_type () == ftable)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6414 execute_string ("%cfindex %s\n", COMMAND_PREFIX, rest_of_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6415
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6416 if (current_insertion_type () == vtable)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6417 execute_string ("%cvindex %s\n", COMMAND_PREFIX, rest_of_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6418
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6419 /* Start a new line, and let start_paragraph ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6420 do the indenting of it for you. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6421 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6422 indented_fill = filling_enabled = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6423 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6424
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6425 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6426 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6427 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6428 free (rest_of_line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6429 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6430 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6431 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6432 no_insertion:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6433 line_error ("%c%s found outside of an insertion block",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6434 COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6435 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6436 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6437
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6438
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6439 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6440 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6441 /* Defun and Friends */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6442 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6443 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6444
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6445 #define DEFUN_SELF_DELIMITING(c) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6446 (((c) == '(') \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6447 || ((c) == ')') \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6448 || ((c) == '[') \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6449 || ((c) == ']'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6450
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6451 struct token_accumulator
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6452 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6453 unsigned int length;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6454 unsigned int index;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6455 char **tokens;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6456 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6457
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6458 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6459 initialize_token_accumulator (struct token_accumulator *accumulator)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6460 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6461 (accumulator->length) = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6462 (accumulator->index) = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6463 (accumulator->tokens) = NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6464 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6465
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6466 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6467 accumulate_token (struct token_accumulator *accumulator, char *token)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6468 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6469 if ((accumulator->index) >= (accumulator->length))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6470 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6471 (accumulator->length) += 10;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6472 (accumulator->tokens) = (char **) xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6473 (accumulator->tokens, (accumulator->length * sizeof (char *)));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6474 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6475 accumulator->tokens[accumulator->index] = token;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6476 accumulator->index += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6477 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6478
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6479 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6480 copy_substring (char *start, char *end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6481 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6482 char *result, *scan, *scan_result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6483
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6484 result = (char *) xmalloc ((end - start) + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6485 scan_result = result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6486 scan = start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6487
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6488 while (scan < end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6489 *scan_result++ = *scan++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6490
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6491 *scan_result = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6492 return (result);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6493 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6494
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6495 /* Given `string' pointing at an open brace, skip forward and return a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6496 pointer to just past the matching close brace. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6497 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6498 scan_group_in_string (char **string_pointer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6499 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6500 register int c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6501 register char *scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6502 register unsigned int level = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6503
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6504 scan_string = (*string_pointer) + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6505
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6506 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6507 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6508 if (level == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6509 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6510 (*string_pointer) = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6511 return (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6512 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6513 c = (*scan_string++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6514 if (c == '\0')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6515 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6516 /* Tweak line_number to compensate for fact that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6517 we gobbled the whole line before coming here. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6518 line_number -= 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6519 line_error ("Missing `}' in %cdef arg", COMMAND_PREFIX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6520 line_number += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6521 (*string_pointer) = (scan_string - 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6522 return (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6523 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6524 if (c == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6525 level += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6526 if (c == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6527 level -= 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6528 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6529 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6530
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6531 /* Return a list of tokens from the contents of `string'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6532 Commands and brace-delimited groups count as single tokens.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6533 Contiguous whitespace characters are converted to a token
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6534 consisting of a single space. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6535 static char **
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6536 args_from_string (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6537 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6538 struct token_accumulator accumulator;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6539 register char *scan_string = string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6540 char *token_start, *token_end;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6541
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6542 initialize_token_accumulator (&accumulator);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6543
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6544 while ((*scan_string) != '\0')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6545 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6546 /* Replace arbitrary whitespace by a single space. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6547 if (whitespace (*scan_string))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6548 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6549 scan_string += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6550 while (whitespace (*scan_string))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6551 scan_string += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6552 accumulate_token ((&accumulator), (strdup (" ")));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6553 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6554 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6555
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6556 /* Commands count as single tokens. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6557 if ((*scan_string) == COMMAND_PREFIX)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6558 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6559 token_start = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6560 scan_string += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6561 if (self_delimiting (*scan_string))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6562 scan_string += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6563 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6564 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6565 register int c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6566 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6567 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6568 c = *scan_string++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6569
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6570 if ((c == '\0') || (c == '{') || (whitespace (c)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6571 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6572 scan_string -= 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6573 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6574 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6575 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6576
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6577 if (*scan_string == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6578 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6579 char *s = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6580 (void) scan_group_in_string (&s);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6581 scan_string = s;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6582 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6583 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6584 token_end = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6585 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6586
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6587 /* Parentheses and brackets are self-delimiting. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6588 else if (DEFUN_SELF_DELIMITING (*scan_string))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6589 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6590 token_start = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6591 scan_string += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6592 token_end = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6593 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6594
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6595 /* Open brace introduces a group that is a single token. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6596 else if (*scan_string == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6597 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6598 char *s = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6599 int balanced = scan_group_in_string (&s);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6600
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6601 token_start = scan_string + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6602 scan_string = s;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6603 token_end = balanced ? (scan_string - 1) : scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6604 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6605
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6606 /* Otherwise a token is delimited by whitespace, parentheses,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6607 brackets, or braces. A token is also ended by a command. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6608 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6609 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6610 token_start = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6611
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6612 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6613 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6614 register int c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6615
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6616 c = *scan_string++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6617
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6618 if (!c ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6619 (whitespace (c) || DEFUN_SELF_DELIMITING (c) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6620 c == '{' || c == '}'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6621 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6622 scan_string--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6623 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6624 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6625
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6626 /* If we encounter a command imbedded within a token,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6627 then end the token. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6628 if (c == COMMAND_PREFIX)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6629 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6630 scan_string--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6631 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6632 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6633 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6634 token_end = scan_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6635 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6636
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6637 accumulate_token
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6638 (&accumulator, copy_substring (token_start, token_end));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6639 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6640 accumulate_token (&accumulator, NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6641 return (accumulator.tokens);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6642 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6643
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6644 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6645 process_defun_args (char **defun_args, int auto_var_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6646 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6647 int pending_space = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6648
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6649 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6650 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6651 char *defun_arg = *defun_args++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6652
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6653 if (defun_arg == NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6654 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6655
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6656 if (defun_arg[0] == ' ')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6657 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6658 pending_space = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6659 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6660 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6661
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6662 if (pending_space)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6663 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6664 add_char (' ');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6665 pending_space = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6666 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6667
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6668 if (DEFUN_SELF_DELIMITING (defun_arg[0]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6669 add_char (defun_arg[0]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6670 else if (defun_arg[0] == '&')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6671 add_word (defun_arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6672 else if (defun_arg[0] == COMMAND_PREFIX)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6673 execute_string ("%s", defun_arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6674 else if (auto_var_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6675 execute_string ("%cvar{%s}", COMMAND_PREFIX, defun_arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6676 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6677 add_word (defun_arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6678 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6679 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6680
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6681 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6682 next_nonwhite_defun_arg (char ***arg_pointer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6683 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6684 char **scan = (*arg_pointer);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6685 char *arg = (*scan++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6686
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6687 if ((arg != 0) && (*arg == ' '))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6688 arg = *scan++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6689
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6690 if (arg == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6691 scan -= 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6692
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6693 *arg_pointer = scan;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6694
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6695 return ((arg == 0) ? "" : arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6696 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6697
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6698 /* Make the defun type insertion.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6699 TYPE says which insertion this is.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6700 X_P says not to start a new insertion if non-zero. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6701 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6702 defun_internal (enum insertion_type type, int x_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6703 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6704 enum insertion_type base_type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6705 char **defun_args, **scan_args;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6706 char *category, *defined_name, *type_name, *type_name2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6707
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6708 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6709 char *line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6710 get_rest_of_line (&line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6711 defun_args = (args_from_string (line));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6712 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6713 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6714
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6715 scan_args = defun_args;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6716
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6717 switch (type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6718 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6719 case defun:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6720 category = "Function";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6721 base_type = deffn;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6722 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6723 case defmac:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6724 category = "Macro";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6725 base_type = deffn;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6726 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6727 case defspec:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6728 category = "Special Form";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6729 base_type = deffn;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6730 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6731 case defvar:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6732 category = "Variable";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6733 base_type = defvr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6734 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6735 case defopt:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6736 category = "User Option";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6737 base_type = defvr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6738 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6739 case deftypefun:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6740 category = "Function";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6741 base_type = deftypefn;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6742 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6743 case deftypevar:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6744 category = "Variable";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6745 base_type = deftypevr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6746 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6747 case defivar:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6748 category = "Instance Variable";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6749 base_type = defcv;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6750 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6751 case defmethod:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6752 category = "Method";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6753 base_type = defop;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6754 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6755 case deftypemethod:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6756 category = "Method";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6757 base_type = deftypemethod;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6758 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6759 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6760 category = next_nonwhite_defun_arg (&scan_args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6761 base_type = type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6762 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6763 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6764
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6765 if ((base_type == deftypefn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6766 || (base_type == deftypevr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6767 || (base_type == defcv)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6768 || (base_type == defop)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6769 || (base_type == deftypemethod))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6770 type_name = next_nonwhite_defun_arg (&scan_args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6771
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6772 if (base_type == deftypemethod)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6773 type_name2 = next_nonwhite_defun_arg (&scan_args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6774
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6775 defined_name = next_nonwhite_defun_arg (&scan_args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6776
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6777 /* This hack exists solely for the purposes of formatting the texinfo
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6778 manual. I couldn't think of a better way. The token might be
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6779 a simple @@ followed immediately by more text. If this is the case,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6780 then the next defun arg is part of this one, and we should concatenate
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6781 them. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6782 if (*scan_args && **scan_args && !whitespace (**scan_args) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6783 (strcmp (defined_name, "@@") == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6784 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6785 char *tem = (char *)xmalloc (3 + strlen (scan_args[0]));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6786
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6787 sprintf (tem, "@@%s", scan_args[0]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6788
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6789 free (scan_args[0]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6790 scan_args[0] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6791 scan_args++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6792 defined_name = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6793 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6794
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6795 if (!x_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6796 begin_insertion (type);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6797
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6798 /* Write the definition header line.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6799 This should start at the normal indentation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6800 current_indent -= default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6801 start_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6802
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6803 switch (base_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6804 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6805 case deffn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6806 case defvr:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6807 case deftp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6808 execute_string (" -- %s: %s", category, defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6809 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6810 case deftypefn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6811 case deftypevr:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6812 execute_string (" -- %s: %s %s", category, type_name, defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6813 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6814 case defcv:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6815 execute_string (" -- %s of %s: %s", category, type_name, defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6816 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6817 case defop:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6818 execute_string (" -- %s on %s: %s", category, type_name, defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6819 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6820 case deftypemethod:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6821 execute_string (" -- %s on %s: %s %s", category, type_name, type_name2,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6822 defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6823 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6824 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6825 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6826 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6827 current_indent += default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6828
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6829 /* Now process the function arguments, if any.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6830 If these carry onto the next line, they should be indented by two
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6831 increments to distinguish them from the body of the definition,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6832 which is indented by one increment. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6833 current_indent += default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6834
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6835 switch (base_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6836 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6837 case deffn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6838 case defop:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6839 process_defun_args (scan_args, 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6840 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6841 case deftp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6842 case deftypefn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6843 case deftypemethod:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6844 process_defun_args (scan_args, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6845 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6846 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6847 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6848 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6849 current_indent -= default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6850 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6851
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6852 /* Make an entry in the appropriate index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6853 switch (base_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6854 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6855 case deffn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6856 case deftypefn:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6857 execute_string ("%cfindex %s\n", COMMAND_PREFIX, defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6858 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6859 case defvr:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6860 case deftypevr:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6861 case defcv:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6862 execute_string ("%cvindex %s\n", COMMAND_PREFIX, defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6863 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6864 case defop:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6865 case deftypemethod:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6866 execute_string ("%cfindex %s on %s\n",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6867 COMMAND_PREFIX, defined_name, type_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6868 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6869 case deftp:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6870 execute_string ("%ctindex %s\n", COMMAND_PREFIX, defined_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6871 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6872 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6873 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6874 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6875
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6876 /* Deallocate the token list. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6877 scan_args = defun_args;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6878 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6879 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6880 char * arg = (*scan_args++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6881 if (arg == NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6882 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6883 free (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6884 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6885 free (defun_args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6886 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6887
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6888 /* Add an entry for a function, macro, special form, variable, or option.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6889 If the name of the calling command ends in `x', then this is an extra
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6890 entry included in the body of an insertion of the same type. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6891 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6892 cm_defun (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6893 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6894 int x_p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6895 enum insertion_type type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6896 char *temp = strdup (command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6897
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6898 x_p = (command[strlen (command) - 1] == 'x');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6899
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6900 if (x_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6901 temp[strlen (temp) - 1] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6902
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6903 type = find_type_from_name (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6904 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6905
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6906 /* If we are adding to an already existing insertion, then make sure
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6907 that we are already in an insertion of type TYPE. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6908 if (x_p &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6909 (!insertion_level || insertion_stack->insertion != type))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6910 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6911 line_error ("Must be in a `%s' insertion in order to use `%s'x",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6912 command, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6913 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6914 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6915 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6916
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6917 defun_internal (type, x_p);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6918 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6919
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6920 /* End existing insertion block. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6921 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6922 cm_end (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6923 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6924 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6925 enum insertion_type type;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6926
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6927 get_rest_of_line (&temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6928 canon_white (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6929
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6930 if (strlen (temp) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6931 line_error ("`%c%s' needs something after it", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6932
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6933 type = find_type_from_name (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6934
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6935 if (type == bad_type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6936 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6937 line_error ("Bad argument to `%s', `%s', using `%s'",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6938 command, temp, insertion_type_pname (current_insertion_type ()));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6939 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6940
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6941 /* see comment under cm_ifinfo() */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6942 if (type == ifinfo)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6943 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6944 if (!ifinfo_count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6945 line_error ("Unmatched `%c%s'", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6946 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6947 ifinfo_count--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6948 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6949 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6950 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6951 if (!insertion_level)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6952 line_error ("Unmatched `%c%s'", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6953 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6954 end_insertion (type);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6955 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6956
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6957 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6958 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6959
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6960
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6961 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6962 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6963 /* Other Random Commands */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6964 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6965 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6966
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6967 /* This says to inhibit the indentation of the next paragraph, but
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6968 not of following paragraphs. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6969 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6970 cm_noindent (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6971 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6972 if (!inhibit_paragraph_indentation)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6973 inhibit_paragraph_indentation = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6974 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6975
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6976 /* I don't know exactly what to do with this. Should I allow
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6977 someone to switch filenames in the middle of output? Since the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6978 file could be partially written, this doesn't seem to make sense.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6979 Another option: ignore it, since they don't *really* want to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6980 switch files. Finally, complain, or at least warn. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6981 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6982 cm_setfilename (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6983 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6984 char *filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6985 get_rest_of_line (&filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6986 /* warning ("`@%s %s' encountered and ignored", command, filename); */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6987 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6988 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6989
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6990 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6991 cm_ignore_line (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6992 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6993 discard_until ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6994 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6995
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6996 /* @br can be immediately followed by `{}', so we have to read those here.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6997 It should simply close the paragraph. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6998 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6999 cm_br (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7000 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7001 if (looking_at ("{}"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7002 input_text_offset += 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7003
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7004 if (curchar () == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7005 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7006 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7007 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7008 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7009
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7010 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7011 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7012
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7013 /* Insert the number of blank lines passed as argument. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7014 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7015 cm_sp (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7016 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7017 int lines;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7018 char *line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7019
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7020 get_rest_of_line (&line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7021
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7022 if (sscanf (line, "%d", &lines) != 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7023 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7024 line_error ("%csp requires a positive numeric argument", COMMAND_PREFIX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7025 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7026 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7027 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7028 if (lines < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7029 lines = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7030
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7031 while (lines--)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7032 add_char ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7033 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7034 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7035 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7036
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7037 /* Start a new line with just this text on it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7038 Then center the line of text.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7039 This always ends the current paragraph. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7040 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7041 cm_center (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7042 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7043 register int i, start, length;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7044 int fudge_factor = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7045 unsigned char *line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7046
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7047 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7048 filling_enabled = indented_fill = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7049 cm_noindent ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7050 start = output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7051 inhibit_output_flushing ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7052 get_rest_of_line ((char **)&line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7053 execute_string ((char *)line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7054 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7055 uninhibit_output_flushing ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7056
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7057 i = output_paragraph_offset - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7058 while (i > (start - 1) && output_paragraph[i] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7059 i--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7060
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7061 output_paragraph_offset = ++i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7062 length = output_paragraph_offset - start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7063
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7064 if (length < (fill_column - fudge_factor))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7065 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7066 line = (unsigned char *)xmalloc (1 + length);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7067 memcpy (line, (char *)(output_paragraph + start), length);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7068
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7069 i = (fill_column - fudge_factor - length) / 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7070 output_paragraph_offset = start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7071
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7072 while (i--)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7073 insert (' ');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7074
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7075 for (i = 0; i < length; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7076 insert (line[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7077
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7078 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7079 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7080
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7081 insert ('\n');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7082 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7083 filling_enabled = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7084 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7085
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7086 /* Show what an expression returns. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7087 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7088 cm_result (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7089 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7090 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7091 add_word ("=>");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7092 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7093
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7094 /* What an expression expands to. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7095 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7096 cm_expansion (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7097 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7098 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7099 add_word ("==>");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7100 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7101
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7102 /* Indicates two expressions are equivalent. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7103 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7104 cm_equiv (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7105 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7106 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7107 add_word ("==");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7108 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7109
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7110 /* What an expression may print. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7111 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7112 cm_print (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7113 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7114 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7115 add_word ("-|");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7116 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7117
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7118 /* An error signaled. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7119 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7120 cm_error (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7121 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7122 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7123 add_word ("error-->");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7124 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7125
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7126 /* The location of point in an example of a buffer. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7127 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7128 cm_point (int arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7129 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7130 if (arg == END)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7131 add_word ("-!-");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7132 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7133
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7134 /* Start a new line with just this text on it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7135 The text is outdented one level if possible. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7136 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7137 cm_exdent (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7138 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7139 char *line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7140 int i = current_indent;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7141
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7142 if (current_indent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7143 current_indent -= default_indentation_increment;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7144
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7145 get_rest_of_line (&line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7146 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7147 execute_string ("%s", line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7148 current_indent = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7149 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7150 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7151 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7152
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7153 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7154 cm_include (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7155 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7156 cm_infoinclude ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7157 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7158
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7159 #if !defined (HAVE_STRERROR)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7160 extern char *sys_errlist[];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7161 extern int sys_nerr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7162
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7163 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7164 strerror (num)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7165 int num;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7166 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7167 if (num >= sys_nerr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7168 return ("Unknown file system error");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7169 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7170 return (sys_errlist[num]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7171 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7172 #endif /* !HAVE_STRERROR */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7173
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7174 /* Remember this file, and move onto the next. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7175 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7176 cm_infoinclude (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7177 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7178 char *filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7179
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7180 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7181 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7182 me_append_before_this_command ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7183 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7184
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7185 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7186 get_rest_of_line (&filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7187
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7188 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7189 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7190 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7191 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7192
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7193 pushfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7194
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7195 /* In verbose mode we print info about including another file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7196 if (verbose_mode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7197 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7198 register int i = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7199 register FSTACK *stack = filestack;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7200
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7201 for (i = 0, stack = filestack; stack; stack = stack->next, i++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7202
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7203 i *= 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7204
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7205 printf ("%*s", i, "");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7206 printf ("%c%s %s\n", COMMAND_PREFIX, command, filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7207 fflush (stdout);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7208 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7209
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7210 if (!find_and_load (filename))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7211 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7212 popfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7213 line_number--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7214
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7215 /* Cannot "@include foo", in line 5 of "/wh/bar". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7216 line_error ("`%c%s %s': %s", COMMAND_PREFIX, command, filename,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7217 strerror (errno));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7218
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7219 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7220 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7221 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7222 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7223 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7224 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7225 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7226 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7227 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7228 reader_loop ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7229 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7230 free (filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7231 popfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7232 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7233
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7234 /* The other side of a malformed expression. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7235 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7236 misplaced_brace (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7237 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7238 line_error ("Misplaced `}'");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7239 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7240
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7241 /* Don't let the filling algorithm insert extra whitespace here. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7242 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7243 cm_force_abbreviated_whitespace (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7244 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7245 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7246
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7247 /* Do not let this character signify the end of a sentence, though
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7248 if it was seen without the command prefix it normally would. We
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7249 do this by turning on the 8th bit of the character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7250 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7251 cm_ignore_sentence_ender (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7252 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7253 add_char (META ((*command)));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7254 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7255
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7256 /* Signals end of processing. Easy to make this happen. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7257 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7258 cm_bye (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7259 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7260 input_text_offset = size_of_input_text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7261 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7262
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7263 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7264 cm_asis (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7265 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7266 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7267
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7268 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7269 cm_math (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7270 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7271 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7272
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7273
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7274 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7275 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7276 /* Indexing Stuff */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7277 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7278 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7279
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7280
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7281 /* An index element... */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7282 typedef struct index_elt
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7283 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7284 struct index_elt *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7285 char *entry; /* The index entry itself. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7286 char *node; /* The node from whence it came. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7287 int code; /* Non-zero means add `@code{...}' when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7288 printing this element. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7289 int defining_line; /* Line number where this entry was written. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7290 } INDEX_ELT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7291
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7292 /* A list of short-names for each index, and the index to that index in our
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7293 index array, the_indices. In addition, for each index, it is remembered
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7294 whether that index is a code index or not. Code indices have @code{}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7295 inserted around the first word when they are printed with printindex. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7296 typedef struct
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7297 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7298 char *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7299 int index;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7300 int code;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7301 } INDEX_ALIST;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7302
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7303 INDEX_ALIST **name_index_alist = (INDEX_ALIST **) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7304
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7305 /* An array of pointers. Each one is for a different index. The
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7306 "synindex" command changes which array slot is pointed to by a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7307 given "index". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7308 INDEX_ELT **the_indices = (INDEX_ELT **) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7309
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7310 /* The number of defined indices. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7311 int defined_indices = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7312
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7313 /* We predefine these. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7314 #define program_index 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7315 #define function_index 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7316 #define concept_index 2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7317 #define variable_index 3
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7318 #define datatype_index 4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7319 #define key_index 5
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7320
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7321 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7322 init_indices (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7323 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7324 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7325
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7326 /* Create the default data structures. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7327
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7328 /* Initialize data space. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7329 if (!the_indices)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7330 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7331 the_indices = (INDEX_ELT **) xmalloc ((1 + defined_indices) *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7332 sizeof (INDEX_ELT *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7333 the_indices[defined_indices] = (INDEX_ELT *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7334
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7335 name_index_alist = (INDEX_ALIST **) xmalloc ((1 + defined_indices) *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7336 sizeof (INDEX_ALIST *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7337 name_index_alist[defined_indices] = (INDEX_ALIST *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7338 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7339
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7340 /* If there were existing indices, get rid of them now. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7341 for (i = 0; i < defined_indices; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7342 undefindex (name_index_alist[i]->name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7343
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7344 /* Add the default indices. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7345 top_defindex ("pg", 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7346 top_defindex ("fn", 1); /* "fn" is a code index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7347 top_defindex ("cp", 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7348 top_defindex ("vr", 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7349 top_defindex ("tp", 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7350 top_defindex ("ky", 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7351
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7352 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7353
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7354 /* Find which element in the known list of indices has this name.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7355 Returns -1 if NAME isn't found. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7356 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7357 find_index_offset (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7358 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7359 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7360 for (i = 0; i < defined_indices; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7361 if (name_index_alist[i] &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7362 strcmp (name, name_index_alist[i]->name) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7363 return (name_index_alist[i]->index);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7364 return (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7365 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7366
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7367 /* Return a pointer to the entry of (name . index) for this name.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7368 Return NULL if the index doesn't exist. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7369 static INDEX_ALIST *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7370 find_index (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7371 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7372 int offset = find_index_offset (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7373 if (offset > -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7374 return (name_index_alist[offset]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7375 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7376 return ((INDEX_ALIST *) NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7377 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7378
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7379 /* Given an index name, return the offset in the_indices of this index,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7380 or -1 if there is no such index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7381 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7382 translate_index (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7383 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7384 INDEX_ALIST *which = find_index (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7385
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7386 if (which)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7387 return (which->index);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7388 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7389 return (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7390 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7391
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7392 /* Return the index list which belongs to NAME. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7393 static INDEX_ELT *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7394 index_list (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7395 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7396 int which = translate_index (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7397 if (which < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7398 return ((INDEX_ELT *) -1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7399 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7400 return (the_indices[which]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7401 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7402
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7403 /* Please release me, let me go... */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7404 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7405 free_index (INDEX_ELT *indecks)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7406 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7407 INDEX_ELT *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7408
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7409 while ((temp = indecks) != (INDEX_ELT *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7410 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7411 free (temp->entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7412 free (temp->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7413 indecks = indecks->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7414 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7415 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7416 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7417
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7418 /* Flush an index by name. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7419 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7420 undefindex (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7421 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7422 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7423 int which = find_index_offset (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7424
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7425 if (which < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7426 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7427
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7428 i = name_index_alist[which]->index;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7429
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7430 free_index (the_indices[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7431 the_indices[i] = (INDEX_ELT *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7432
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7433 free (name_index_alist[which]->name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7434 free (name_index_alist[which]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7435 name_index_alist[which] = (INDEX_ALIST *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7436 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7437
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7438 /* Define an index known as NAME. We assign the slot number.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7439 CODE if non-zero says to make this a code index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7440 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7441 defindex (char *name, int code)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7442 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7443 register int i, slot;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7444
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7445 /* If it already exists, flush it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7446 undefindex (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7447
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7448 /* Try to find an empty slot. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7449 slot = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7450 for (i = 0; i < defined_indices; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7451 if (!name_index_alist[i])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7452 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7453 slot = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7454 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7455 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7456
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7457 if (slot < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7458 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7459 /* No such luck. Make space for another index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7460 slot = defined_indices;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7461 defined_indices++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7462
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7463 name_index_alist = (INDEX_ALIST **)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7464 xrealloc ((char *)name_index_alist,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7465 (1 + defined_indices) * sizeof (INDEX_ALIST *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7466 the_indices = (INDEX_ELT **)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7467 xrealloc ((char *)the_indices,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7468 (1 + defined_indices) * sizeof (INDEX_ELT *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7469 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7470
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7471 /* We have a slot. Start assigning. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7472 name_index_alist[slot] = (INDEX_ALIST *) xmalloc (sizeof (INDEX_ALIST));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7473 name_index_alist[slot]->name = strdup (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7474 name_index_alist[slot]->index = slot;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7475 name_index_alist[slot]->code = code;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7476
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7477 the_indices[slot] = (INDEX_ELT *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7478 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7479
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7480 /* Add the arguments to the current index command to the index NAME. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7481 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7482 index_add_arg (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7483 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7484 int which;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7485 char *index_entry;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7486 INDEX_ALIST *tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7487
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7488 tem = find_index (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7489
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7490 which = tem ? tem->index : -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7491
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7492 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7493 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7494 append_to_expansion_output (input_text_offset + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7495 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7496
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7497 get_rest_of_line (&index_entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7498 ignore_blank_line ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7499
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7500 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7501 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7502 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7503 int op_orig;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7504
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7505 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7506 op_orig = output_paragraph_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7507 me_execute_string (index_entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7508 me_execute_string ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7509 output_paragraph_offset = op_orig;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7510 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7511 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7512
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7513 if (which < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7514 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7515 line_error ("Unknown index reference `%s'", name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7516 free (index_entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7517 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7518 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7519 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7520 INDEX_ELT *new = (INDEX_ELT *) xmalloc (sizeof (INDEX_ELT));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7521 new->next = the_indices[which];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7522 new->entry = index_entry;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7523 new->node = current_node;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7524 new->code = tem->code;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7525 new->defining_line = line_number - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7526 the_indices[which] = new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7527 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7528 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7529
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7530 #define INDEX_COMMAND_SUFFIX "index"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7531
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7532 /* The function which user defined index commands call. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7533 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7534 gen_index (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7535 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7536 char *name = strdup (command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7537 if ((int) strlen (name) >= (int) strlen ("index"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7538 name[strlen (name) - strlen ("index")] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7539 index_add_arg (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7540 free (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7541 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7542
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7543 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7544 top_defindex (char *name, int code)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7545 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7546 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7547
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7548 temp = (char *) xmalloc (1 + strlen (name) + strlen ("index"));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7549 sprintf (temp, "%sindex", name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7550 define_user_command (temp, gen_index, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7551 defindex (name, code);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7552 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7553 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7554
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7555 /* Define a new index command. Arg is name of index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7556 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7557 cm_defindex (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7558 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7559 gen_defindex (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7560 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7561
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7562 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7563 cm_defcodeindex (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7564 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7565 gen_defindex (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7566 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7567
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7568 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7569 gen_defindex (int code)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7570 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7571 char *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7572 get_rest_of_line (&name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7573
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7574 if (find_index (name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7575 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7576 line_error ("Index `%s' already exists", name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7577 free (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7578 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7579 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7580 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7581 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7582 char *temp = (char *) alloca (1 + strlen (name) + strlen ("index"));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7583 sprintf (temp, "%sindex", name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7584 define_user_command (temp, gen_index, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7585 defindex (name, code);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7586 free (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7587 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7588 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7589
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7590 /* Append LIST2 to LIST1. Return the head of the list. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7591 static INDEX_ELT *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7592 index_append (INDEX_ELT *head, INDEX_ELT *tail)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7593 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7594 register INDEX_ELT *t_head = head;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7595
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7596 if (!t_head)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7597 return (tail);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7598
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7599 while (t_head->next)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7600 t_head = t_head->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7601 t_head->next = tail;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7602 return (head);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7603 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7604
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7605 /* Expects 2 args, on the same line. Both are index abbreviations.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7606 Make the first one be a synonym for the second one, i.e. make the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7607 first one have the same index as the second one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7608 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7609 cm_synindex (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7610 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7611 int redirector, redirectee;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7612 char *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7613
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7614 skip_whitespace ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7615 get_until_in_line (" ", &temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7616 redirectee = find_index_offset (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7617 skip_whitespace ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7618 free_and_clear (&temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7619 get_until_in_line (" ", &temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7620 redirector = find_index_offset (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7621 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7622 if (redirector < 0 || redirectee < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7623 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7624 line_error ("Unknown index reference");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7625 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7626 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7627 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7628 /* I think that we should let the user make indices synonymous to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7629 each other without any lossage of info. This means that one can
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7630 say @synindex cp dt anywhere in the file, and things that used to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7631 be in cp will go into dt. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7632 INDEX_ELT *i1 = the_indices[redirectee], *i2 = the_indices[redirector];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7633
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7634 if (i1 || i2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7635 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7636 if (i1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7637 the_indices[redirectee] = index_append (i1, i2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7638 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7639 the_indices[redirectee] = index_append (i2, i1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7640 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7641
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7642 name_index_alist[redirectee]->index =
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7643 name_index_alist[redirector]->index;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7644 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7645 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7646
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7647 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7648 cm_pindex (void) /* Pinhead index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7649 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7650 index_add_arg ("pg");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7651 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7652
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7653 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7654 cm_vindex (void) /* Variable index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7655 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7656 index_add_arg ("vr");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7657 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7658
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7659 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7660 cm_kindex (void) /* Key index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7661 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7662 index_add_arg ("ky");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7663 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7664
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7665 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7666 cm_cindex (void) /* Concept index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7667 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7668 index_add_arg ("cp");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7669 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7670
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7671 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7672 cm_findex (void) /* Function index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7673 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7674 index_add_arg ("fn");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7675 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7676
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7677 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7678 cm_tindex (void) /* Data Type index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7679 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7680 index_add_arg ("tp");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7681 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7682
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7683 /* Sorting the index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7684 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7685 index_element_compare (INDEX_ELT **element1, INDEX_ELT **element2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7686 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7687 /* This needs to ignore leading non-text characters. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7688 return (strcasecmp ((*element1)->entry, (*element2)->entry));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7689 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7690
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7691 /* Force all index entries to be unique. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7692 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7693 make_index_entries_unique (INDEX_ELT **array, int count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7694 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7695 register int i, j;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7696 INDEX_ELT **copy;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7697
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7698 copy = (INDEX_ELT **)xmalloc ((1 + count) * sizeof (INDEX_ELT *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7699
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7700 for (i = 0, j = 0; i < count; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7701 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7702 if ((i == (count - 1)) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7703 (array[i]->node != array[i + 1]->node) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7704 (strcasecmp (array[i]->entry, array[i + 1]->entry) != 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7705 copy[j++] = array[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7706 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7707 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7708 free (array[i]->entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7709 free (array[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7710 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7711 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7712 copy[j] = (INDEX_ELT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7713
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7714 /* Now COPY contains only unique entries. Duplicated entries in the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7715 original array have been freed. Replace the current array with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7716 the copy, fixing the NEXT pointers. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7717 for (i = 0; copy[i] != (INDEX_ELT *)NULL; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7718 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7719 int counter = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7720 copy[i]->next = copy[i + 1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7721
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7722 /* Fix entry names which are the same. They point to different nodes,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7723 so we make the entry name unique. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7724 if ((copy[i + 1] != (INDEX_ELT *)NULL) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7725 (strcmp (copy[i]->entry, copy[i + 1]->entry) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7726 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7727 char *new_entry_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7728
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7729 new_entry_name = (char *)xmalloc (10 + strlen (copy[i]->entry));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7730 sprintf (new_entry_name, "%s <%d>", copy[i]->entry, counter);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7731 free (copy[i]->entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7732 copy[i]->entry = new_entry_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7733 counter++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7734 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7735 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7736 counter = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7737
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7738 array[i] = copy[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7739 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7740 array[i] = (INDEX_ELT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7741
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7742 /* Free the storage used only by COPY. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7743 free (copy);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7744 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7745
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7746 /* Sort the index passed in INDEX, returning an array of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7747 pointers to elements. The array is terminated with a NULL
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7748 pointer. We call qsort because it's supposed to be fast.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7749 I think this looks bad. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7750 static INDEX_ELT **
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7751 sort_index (INDEX_ELT *indecks)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7752 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7753 INDEX_ELT *temp = indecks;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7754 INDEX_ELT **array;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7755 int count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7756
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7757 while (temp != (INDEX_ELT *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7758 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7759 count++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7760 temp = temp->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7761 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7762
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7763 /* We have the length. Make an array. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7764
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7765 array = (INDEX_ELT **) xmalloc ((count + 1) * sizeof (INDEX_ELT *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7766 count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7767 temp = indecks;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7768
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7769 while (temp != (INDEX_ELT *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7770 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7771 array[count++] = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7772 temp = temp->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7773 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7774 array[count] = (INDEX_ELT *) NULL; /* terminate the array. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7775
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7776 /* Sort the array. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7777 qsort (array, count, sizeof (INDEX_ELT *), (int (*)()) index_element_compare);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7778 make_index_entries_unique (array, count);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7779 return (array);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7780 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7781
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7782 /* Non-zero means that we are in the middle of printing an index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7783 int printing_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7784
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7785 /* Takes one arg, a short name of an index to print.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7786 Outputs a menu of the sorted elements of the index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7787 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7788 cm_printindex (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7789 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7790 int item;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7791 INDEX_ELT *indecks;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7792 INDEX_ELT **array;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7793 char *index_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7794 int old_inhibitions = inhibit_paragraph_indentation;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7795 int previous_filling_enabled_value = filling_enabled;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7796
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7797 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7798 get_rest_of_line (&index_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7799
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7800 indecks = index_list (index_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7801 if (indecks == (INDEX_ELT *)-1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7802 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7803 line_error ("Unknown index name `%s'", index_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7804 free (index_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7805 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7806 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7807 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7808 free (index_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7809
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7810 array = sort_index (indecks);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7811
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7812 filling_enabled = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7813 inhibit_paragraph_indentation = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7814 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7815 add_word ("* Menu:\n\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7816
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7817 printing_index = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7818
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7819 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7820 me_inhibit_expansion++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7821 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7822
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7823 for (item = 0; (indecks = array[item]); item++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7824 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7825 int real_line_number = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7826
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7827 /* Let errors generated while making the index entry point back
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7828 at the line which contains the entry. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7829 line_number = indecks->defining_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7830
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7831 /* If this particular entry should be printed as a "code" index,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7832 then wrap the entry with "@code{...}". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7833 if (indecks->code)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7834 execute_string ("* %ccode{%s}: ", COMMAND_PREFIX, indecks->entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7835 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7836 execute_string ("* %s: ", indecks->entry);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7837
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7838 /* Pad the front of the destination nodename so that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7839 the output looks nice. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7840 if (fill_column > 40 && output_column < 40)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7841 indent (40 - output_column);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7842
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7843 execute_string ("%s.\n", indecks->node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7844
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7845 line_number = real_line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7846 flush_output ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7847 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7848
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7849 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7850 me_inhibit_expansion--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7851 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7852
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7853 printing_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7854 free (array);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7855 close_single_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7856 filling_enabled = previous_filling_enabled_value;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7857 inhibit_paragraph_indentation = old_inhibitions;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7858 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7859
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7860
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7861 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7862 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7863 /* Making User Defined Commands */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7864 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7865 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7866
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7867 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7868 define_user_command (char *name, COMMAND_FUNCTION *proc, int needs_braces_p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7869 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7870 int slot = user_command_array_len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7871 user_command_array_len++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7872
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7873 if (!user_command_array)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7874 user_command_array = (COMMAND **) xmalloc (1 * sizeof (COMMAND *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7875
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7876 user_command_array = (COMMAND **) xrealloc (user_command_array,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7877 (1 + user_command_array_len) *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7878 sizeof (COMMAND *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7879
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7880 user_command_array[slot] = (COMMAND *) xmalloc (sizeof (COMMAND));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7881 user_command_array[slot]->name = strdup (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7882 user_command_array[slot]->proc = proc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7883 user_command_array[slot]->argument_in_braces = needs_braces_p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7884 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7885
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7886 #if 0 /* unused */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7887 /* Make ALIAS run the named FUNCTION. Copies properties from FUNCTION. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7888 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7889 define_alias (char *alias, char *function)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7890 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7891 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7892 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7893
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7894 /* Set the paragraph indentation variable to the value specified in STRING.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7895 Values can be:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7896 `asis': Don't change existing indentation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7897 `none': Remove existing indentation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7898 NUM: Indent NUM spaces at the starts of paragraphs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7899 Note that if NUM is zero, we assume `none'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7900
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7901 Returns 0 if successful, or non-zero if STRING isn't one of the above. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7902 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7903 set_paragraph_indent (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7904 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7905 if (strcmp (string, "asis") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7906 paragraph_start_indent = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7907 else if (strcmp (string, "none") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7908 paragraph_start_indent = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7909 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7910 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7911 if (sscanf (string, "%d", &paragraph_start_indent) != 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7912 return (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7913 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7914 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7915 if (paragraph_start_indent == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7916 paragraph_start_indent = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7917 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7918 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7919 return (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7920 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7921
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7922 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7923 cm_paragraphindent (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7924 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7925 char *arg;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7926
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7927 get_rest_of_line (&arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7928 if (set_paragraph_indent (arg) != 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7929 line_error ("Bad argument to %c%s", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7930
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7931 free (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7932 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7933
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7934 /* Some support for footnotes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7935
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7936 /* Footnotes are a new construct in Info. We don't know the best method
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7937 of implementing them for sure, so we present two possiblities.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7938
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7939 SeparateNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7940 Make them look like followed references, with the reference
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7941 destinations in a makeinfo manufactured node or,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7942
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7943 EndNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7944 Make them appear at the bottom of the node that they originally
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7945 appeared in. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7946 #define SeparateNode 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7947 #define EndNode 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7948
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7949 int footnote_style = EndNode;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7950 int first_footnote_this_node = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7951 int footnote_count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7952
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7953 /* Set the footnote style based on he style identifier in STRING. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7954 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7955 set_footnote_style (char *string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7956 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7957 if ((strcasecmp (string, "separate") == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7958 (strcasecmp (string, "MN") == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7959 footnote_style = SeparateNode;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7960 else if ((strcasecmp (string, "end") == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7961 (strcasecmp (string, "EN") == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7962 footnote_style = EndNode;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7963 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7964 return (-1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7965
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7966 return (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7967 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7968
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7969 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7970 cm_footnotestyle (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7971 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7972 char *arg;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7973
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7974 get_rest_of_line (&arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7975
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7976 if (set_footnote_style (arg) != 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7977 line_error ("Bad argument to %c%s", COMMAND_PREFIX, command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7978
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7979 free (arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7980 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7981
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7982 typedef struct fn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7983 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7984 struct fn *next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7985 char *marker;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7986 char *note;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7987 } FN;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7988
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7989 FN *pending_notes = (FN *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7990
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7991 /* A method for remembering footnotes. Note that this list gets output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7992 at the end of the current node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7993 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7994 remember_note (char *marker, char *note)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7995 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7996 FN *temp = (FN *) xmalloc (sizeof (FN));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7997
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7998 temp->marker = strdup (marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7999 temp->note = strdup (note);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8000 temp->next = pending_notes;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8001 pending_notes = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8002 footnote_count++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8003 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8004
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8005 /* How to get rid of existing footnotes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8006 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8007 free_pending_notes (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8008 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8009 FN *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8010
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8011 while ((temp = pending_notes) != (FN *) NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8012 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8013 free (temp->marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8014 free (temp->note);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8015 pending_notes = pending_notes->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8016 free (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8017 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8018 first_footnote_this_node = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8019 footnote_count = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8020 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8021
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8022 /* What to do when you see a @footnote construct. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8023
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8024 /* Handle a "footnote".
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8025 footnote *{this is a footnote}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8026 where "*" is the marker character for this note. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8027 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8028 cm_footnote (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8029 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8030 char *marker;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8031 char *note;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8032
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8033 get_until ("{", &marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8034 canon_white (marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8035
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8036 /* Read the argument in braces. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8037 if (curchar () != '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8038 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8039 line_error ("`%c%s' expected more than just `%s'. It needs something in `{...}'",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8040 COMMAND_PREFIX, command, marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8041 free (marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8042 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8043 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8044 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8045 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8046 int braces = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8047 int temp = ++input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8048 int len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8049
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8050 while (braces)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8051 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8052 if (temp == size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8053 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8054 line_error ("No closing brace for footnote `%s'", marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8055 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8056 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8057
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8058 if (input_text[temp] == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8059 braces++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8060 else if (input_text[temp] == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8061 braces--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8062 else if (input_text[temp] == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8063 line_number ++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8064
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8065 temp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8066 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8067
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8068 len = (temp - input_text_offset) - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8069 note = (char *)xmalloc (len + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8070 strncpy (note, &input_text[input_text_offset], len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8071 note[len] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8072 input_text_offset = temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8073 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8074
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8075 if (!current_node || !*current_node)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8076 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8077 line_error ("Footnote defined without parent node");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8078 free (marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8079 free (note);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8080 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8081 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8082
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8083 if (!*marker)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8084 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8085 free (marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8086
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8087 if (number_footnotes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8088 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8089 marker = (char *)xmalloc (10);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8090 sprintf (marker, "%d", current_footnote_number);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8091 current_footnote_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8092 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8093 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8094 marker = strdup ("*");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8095 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8096
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8097 remember_note (marker, note);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8098
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8099 /* Your method should at least insert MARKER. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8100 switch (footnote_style)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8101 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8102 case SeparateNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8103 add_word_args ("(%s)", marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8104 if (first_footnote_this_node)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8105 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8106 char *temp_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8107
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8108 temp_string = (char *)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8109 xmalloc ((strlen (current_node)) + (strlen ("-Footnotes")) + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8110
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8111 add_word_args (" (*note %s-Footnotes::)", current_node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8112 strcpy (temp_string, current_node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8113 strcat (temp_string, "-Footnotes");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8114 remember_node_reference (temp_string, line_number, followed_reference);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8115 free (temp_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8116 first_footnote_this_node = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8117 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8118 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8119
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8120 case EndNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8121 add_word_args ("(%s)", marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8122 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8123
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8124 default:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8125 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8126 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8127 free (marker);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8128 free (note);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8129 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8130
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8131 /* Non-zero means that we are currently in the process of outputting
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8132 footnotes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8133 int already_outputting_pending_notes = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8134
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8135 /* Output the footnotes. We are at the end of the current node. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8136 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8137 output_pending_notes (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8138 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8139 FN *footnote = pending_notes;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8140
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8141 if (!pending_notes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8142 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8143
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8144 switch (footnote_style)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8145 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8146
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8147 case SeparateNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8148 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8149 char *old_current_node = current_node;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8150 char *old_command = strdup (command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8151
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8152 already_outputting_pending_notes++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8153 execute_string ("%cnode %s-Footnotes,,,%s\n",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8154 COMMAND_PREFIX, current_node, current_node);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8155 already_outputting_pending_notes--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8156 current_node = old_current_node;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8157 free (command);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8158 command = old_command;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8159 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8160 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8161
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8162 case EndNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8163 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8164 in_fixed_width_font++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8165 execute_string ("---------- Footnotes ----------\n\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8166 in_fixed_width_font--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8167 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8168 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8170 /* Handle the footnotes in reverse order. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8171 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8172 FN **array = (FN **) xmalloc ((footnote_count + 1) * sizeof (FN *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8173
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8174 array[footnote_count] = (FN *) NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8175
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8176 while (--footnote_count > -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8177 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8178 array[footnote_count] = footnote;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8179 footnote = footnote->next;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8180 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8181
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8182 filling_enabled = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8183 indented_fill = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8184
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8185 while ((footnote = array[++footnote_count]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8186 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8187
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8188 switch (footnote_style)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8189 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8190 case SeparateNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8191 case EndNode:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8192 execute_string ("(%s) %s", footnote->marker, footnote->note);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8193 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8194 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8195 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8196 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8197 close_paragraph ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8198 free (array);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8199 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8200 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8201
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8202
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8203 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8204 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8205 /* User definable Macros (text substitution) */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8206 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8207 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8208
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8209 #if defined (HAVE_MACROS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8210
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8211 /* Array of macros and definitions. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8212 MACRO_DEF **macro_list = (MACRO_DEF **)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8213
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8214 int macro_list_len = 0; /* Number of elements. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8215 int macro_list_size = 0; /* Number of slots in total. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8216
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8217 /* Return the macro definition of NAME or NULL if NAME is not defined. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8218 static MACRO_DEF *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8219 find_macro (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8220 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8221 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8222 register MACRO_DEF *def;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8223
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8224 def = (MACRO_DEF *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8225 for (i = 0; macro_list && (def = macro_list[i]); i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8226 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8227 if ((!def->inhibited) && (strcmp (def->name, name) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8228 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8229 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8230 return (def);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8231 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8232
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8233 /* Add the macro NAME with ARGLIST and BODY to the list of defined macros.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8234 SOURCE_FILE is the name of the file where this definition can be found,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8235 and SOURCE_LINENO is the line number within that file. If a macro already
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8236 exists with NAME, then a warning is produced, and that previous
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8237 definition is overwritten. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8238 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8239 add_macro (char *name, char **arglist, char *body, char *source_file,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8240 int source_lineno, int flags)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8241 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8242 register MACRO_DEF *def;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8243
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8244 def = find_macro (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8245
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8246 if (!def)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8247 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8248 if (macro_list_len + 2 >= macro_list_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8249 macro_list = (MACRO_DEF **)xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8250 (macro_list, ((macro_list_size += 10) * sizeof (MACRO_DEF *)));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8251
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8252 macro_list[macro_list_len] = (MACRO_DEF *)xmalloc (sizeof (MACRO_DEF));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8253 macro_list[macro_list_len + 1] = (MACRO_DEF *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8254
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8255 def = macro_list[macro_list_len];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8256 macro_list_len += 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8257 def->name = name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8258 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8259 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8260 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8261 char *temp_filename = input_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8262 int temp_line = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8263
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8264 warning ("The macro `%s' is previously defined", name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8265
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8266 input_filename = def->source_file;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8267 line_number = def->source_lineno;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8268
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8269 warning ("Here is the previous definition of `%s'", name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8270
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8271 input_filename = temp_filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8272 line_number = temp_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8273
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8274 if (def->arglist)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8275 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8276 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8277
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8278 for (i = 0; def->arglist[i]; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8279 free (def->arglist[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8280
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8281 free (def->arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8282 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8283 free (def->source_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8284 free (def->body);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8285 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8286
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8287 def->source_file = strdup (source_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8288 def->source_lineno = source_lineno;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8289 def->body = body;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8290 def->arglist = arglist;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8291 def->inhibited = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8292 def->flags = flags;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8293 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8294
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8295 /* Delete the macro with name NAME. The macro is deleted from the list,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8296 but it is also returned. If there was no macro defined, NULL is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8297 returned. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8298 static MACRO_DEF *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8299 delete_macro (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8300 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8301 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8302 register MACRO_DEF *def;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8303
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8304 def = (MACRO_DEF *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8305
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8306 for (i = 0; macro_list && (def = macro_list[i]); i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8307 if (strcmp (def->name, name) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8308 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8309 memcpy (macro_list + i, macro_list + i + 1,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8310 ((macro_list_len + 1) - i) * sizeof (MACRO_DEF *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8311 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8312 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8313 return (def);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8314 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8315
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8316 /* Return the arglist on the current line. This can behave in two different
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8317 ways, depending on the variable BRACES_REQUIRED_FOR_MACRO_ARGS. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8318 int braces_required_for_macro_args = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8319
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8320 static char **
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8321 get_macro_args (MACRO_DEF *def)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8322 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8323 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8324 char *word;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8325
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8326 /* Quickly check to see if this macro has been invoked with any arguments.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8327 If not, then don't skip any of the following whitespace. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8328 for (i = input_text_offset; i < size_of_input_text; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8329 if (!cr_or_whitespace (input_text[i]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8330 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8331
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8332 if (input_text[i] != '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8333 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8334 if (braces_required_for_macro_args)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8335 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8336 return ((char **)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8337 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8338 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8339 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8340 /* Braces are not required to fill out the macro arguments. If
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8341 this macro takes one argument, it is considered to be the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8342 remainder of the line, sans whitespace. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8343 if (def->arglist && def->arglist[0] && !def->arglist[1])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8344 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8345 char **arglist;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8346
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8347 get_rest_of_line (&word);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8348 input_text_offset--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8349 canon_white (word);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8350 arglist = (char **)xmalloc (2 * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8351 arglist[0] = word;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8352 arglist[1] = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8353 return (arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8354 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8355 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8356 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8357 /* The macro either took no arguments, or took more than
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8358 one argument. In that case, it must be invoked with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8359 arguments surrounded by braces. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8360 return ((char **)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8361 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8362 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8363 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8364 return (get_brace_args (def->flags & ME_QUOTE_ARG));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8365 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8366
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8367 /* Substitute actual parameters for named parameters in body.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8368 The named parameters which appear in BODY must by surrounded
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8369 reverse slashes, as in \foo\. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8370 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8371 apply (char **named, char **actuals, char *body)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8372 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8373 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8374 int new_body_index, new_body_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8375 char *new_body, *text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8376 int length_of_actuals;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8377
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8378 length_of_actuals = array_len (actuals);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8379 new_body_size = strlen (body);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8380 new_body = (char *)xmalloc (1 + new_body_size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8381
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8382 /* Copy chars from BODY into NEW_BODY. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8383 i = 0; new_body_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8384
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8385 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8386 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8387 if (!body[i])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8388 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8389
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8390 if (body[i] != '\\')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8391 new_body[new_body_index++] = body[i++];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8392 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8393 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8394 /* Snarf parameter name, check against named parameters. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8395 char *param;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8396 int param_start, which, len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8397
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8398 param_start = ++i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8399 while ((body[i]) && (body[i] != '\\'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8400 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8401
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8402 len = i - param_start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8403 param = (char *)xmalloc (1 + len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8404 memcpy (param, body + param_start, len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8405 param[len] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8406
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8407 if (body[i])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8408 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8409
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8410 /* Now check against named parameters. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8411 for (which = 0; named && named[which]; which++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8412 if (strcmp (named[which], param) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8413 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8414
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8415 if (named[which])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8416 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8417 if (which < length_of_actuals)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8418 text = actuals[which];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8419 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8420 text = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8421
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8422 if (!text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8423 text = "";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8424
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8425 len = strlen (text);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8426 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8427 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8428 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8429 len += 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8430 text = (char *)xmalloc (1 + len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8431 sprintf (text, "\\%s\\", param);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8432 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8433
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8434 if ((int) (2 + strlen (param)) < len)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8435 new_body = (char *)xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8436 (new_body, new_body_size += (1 + len));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8437
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8438 free (param);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8439
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8440 strcpy (new_body + new_body_index, text);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8441 new_body_index += len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8442
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8443 if (!named[which])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8444 free (text);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8445 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8446 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8447 new_body[new_body_index] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8448 return (new_body);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8449 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8450
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8451 /* Execute the macro passed in DEF, a pointer to a MACRO_DEF. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8452 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8453 execute_macro (MACRO_DEF *def)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8454 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8455 char **arglist;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8456 int num_args;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8457 char *execution_string = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8458
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8459 if (macro_expansion_output_stream && !me_inhibit_expansion)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8460 me_append_before_this_command ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8461
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8462 /* Find out how many arguments this macro definition takes. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8463 num_args = array_len (def->arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8464
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8465 /* Gather the arguments present on the line if there are any. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8466 arglist = get_macro_args (def);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8467
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8468 if (num_args < array_len (arglist))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8469 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8470 free_array (arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8471 line_error ("Macro `%s' called with too many args", def->name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8472 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8473 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8474
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8475 if (def->body)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8476 execution_string = apply (def->arglist, arglist, def->body);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8477
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8478 free_array (arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8479
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8480 if (def->body)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8481 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8482 if (macro_expansion_output_stream && !me_inhibit_expansion)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8483 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8484 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8485 me_execute_string (execution_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8486 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8487 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8488 execute_string (execution_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8489
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8490 free (execution_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8491 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8492 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8493
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8494 /* Read and remember the definition of a macro. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8495 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8496 cm_macro (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8497 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8498 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8499 char *name, **arglist, *body, *line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8500 int body_size, body_index;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8501 int depth = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8502 int defining_line = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8503 int flags = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8504
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8505 arglist = (char **)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8506 body = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8507 body_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8508 body_index = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8509
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8510 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8511 me_append_before_this_command ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8512
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8513 skip_whitespace ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8514
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8515 /* Get the name of the macro. This is the set of characters which are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8516 not whitespace and are not `{' immediately following the @macro. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8517 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8518 int start = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8519 int len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8520
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8521 for (i = start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8522 (i < size_of_input_text) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8523 (input_text[i] != '{') &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8524 (!cr_or_whitespace (input_text[i]));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8525 i++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8526
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8527 len = i - start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8528 name = (char *)xmalloc (1 + len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8529 strncpy (name, input_text + start, len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8530 name[len] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8531 input_text_offset = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8532 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8533
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8534 skip_whitespace ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8535
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8536 /* It is not required that the definition of a macro includes an arglist.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8537 If not, don't try to get the named parameters, just use a null list. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8538 if (curchar () == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8539 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8540 int arglist_index = 0, arglist_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8541 int gathering_words = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8542 char *word = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8543 int character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8544
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8545 /* Read the words inside of the braces which determine the arglist.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8546 These words will be replaced within the body of the macro at
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8547 execution time. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8548
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8549 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8550 skip_whitespace_and_newlines ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8551
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8552 while (gathering_words)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8553 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8554 int len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8555
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8556 for (i = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8557 (character = input_text[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8558 i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8559 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8560 switch (character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8561 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8562 case '\n':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8563 line_number++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8564 case ' ':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8565 case '\t':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8566 case ',':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8567 case '}':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8568 /* Found the end of the current arglist word. Save it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8569 len = i - input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8570 word = (char *)xmalloc (1 + len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8571 strncpy (word, input_text + input_text_offset, len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8572 word[len] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8573 input_text_offset = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8574
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8575 /* Advance to the comma or close-brace that signified
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8576 the end of the argument. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8577 while ((character = curchar ())
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8578 && character != ','
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8579 && character != '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8580 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8581
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8582 /* Add the word to our list of words. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8583 if ((arglist_index + 2) >= arglist_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8584 arglist = (char **)xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8585 (arglist, (arglist_size += 10) * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8586
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8587 arglist[arglist_index++] = word;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8588 arglist[arglist_index] = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8589 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8590 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8591
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8592 if (character == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8593 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8594 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8595 gathering_words = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8596 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8597 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8598
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8599 if (character == ',')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8600 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8601 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8602 skip_whitespace_and_newlines ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8603 i = input_text_offset - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8604 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8605 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8606 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8607 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8608
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8609 /* Read the text carefully until we find an "@end macro" which
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8610 matches this one. The text in between is the body of the macro. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8611 skip_whitespace_and_newlines ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8612
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8613 while (depth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8614 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8615 if ((input_text_offset + 9) > size_of_input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8616 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8617 int temp_line = line_number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8618 line_number = defining_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8619 line_error ("%cend macro not found", COMMAND_PREFIX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8620 line_number = temp_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8621 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8622 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8623
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8624 get_rest_of_line (&line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8625
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8626 /* Handle commands only meaningful within a macro. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8627 if ((*line == COMMAND_PREFIX) && (depth == 1) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8628 (strncmp (line + 1, "allow-recursion", 15) == 0) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8629 (line[16] == '\0' || whitespace (line[16])))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8630 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8631 for (i = 16; whitespace (line[i]); i++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8632 strcpy (line, line + i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8633 flags |= ME_RECURSE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8634 if (!*line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8635 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8636 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8637 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8638 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8639 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8640
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8641 if ((*line == COMMAND_PREFIX) && (depth == 1) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8642 (strncmp (line + 1, "quote-arg", 9) == 0) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8643 (line[10] == '\0' || whitespace (line[10])))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8644 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8645 for (i = 16; whitespace (line[i]); i++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8646 strcpy (line, line + i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8647
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8648 if (arglist && arglist[0] && !arglist[1])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8649 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8650 flags |= ME_QUOTE_ARG;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8651 if (!*line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8652 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8653 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8654 continue;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8655 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8656 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8657 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8658 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8659 line_error ("%cquote-arg only useful when the macro takes a single argument",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8660 COMMAND_PREFIX);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8661 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8662 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8663
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8664 if ((*line == COMMAND_PREFIX) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8665 (strncmp (line + 1, "macro ", 6) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8666 depth++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8667
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8668 if ((*line == COMMAND_PREFIX) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8669 (strncmp (line + 1, "end macro", 9) == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8670 depth--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8671
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8672 if (depth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8673 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8674 if ((int) (body_index + strlen (line) + 3) >= body_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8675 body = (char *)xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8676 (body, body_size += 3 + strlen (line));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8677 strcpy (body + body_index, line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8678 body_index += strlen (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8679 body[body_index++] = '\n';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8680 body[body_index] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8681 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8682 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8683 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8684
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8685 /* We now have the name, the arglist, and the body. However, BODY
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8686 includes the final newline which preceded the `@end macro' text.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8687 Delete it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8688 if (body && strlen (body))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8689 body[strlen (body) - 1] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8690
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8691 add_macro (name, arglist, body, input_filename, defining_line, flags);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8692
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8693 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8694 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8695 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8696
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8697 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8698 cm_unmacro (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8699 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8700 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8701 char *line, *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8702 MACRO_DEF *def;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8703
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8704 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8705 me_append_before_this_command ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8706
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8707 get_rest_of_line (&line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8708 canon_white (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8709
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8710 for (i = 0; line[i] && !whitespace (line[i]); i++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8711 name = (char *)xmalloc (i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8712 strncpy (name, line, i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8713 name[i] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8714
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8715 def = delete_macro (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8716
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8717 if (def)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8718 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8719 free (def->source_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8720 free (def->name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8721 free (def->body);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8722
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8723 if (def->arglist)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8724 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8725 register int ii;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8726
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8727 for (ii = 0; def->arglist[ii]; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8728 free (def->arglist[ii]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8729
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8730 free (def->arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8731 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8732
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8733 free (def);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8734 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8735
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8736 free (line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8737 free (name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8738
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8739 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8740 remember_itext (input_text, input_text_offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8741 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8742
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8743 /* How to output sections of the input file verbatim. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8744
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8745 /* Set the value of POINTER's offset to OFFSET. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8746 static ITEXT *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8747 remember_itext (char *pointer, int offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8748 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8749 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8750 ITEXT *itext = (ITEXT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8751
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8752 /* If we have no info, initialize a blank list. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8753 if (!itext_info)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8754 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8755 itext_info = (ITEXT **)xmalloc ((itext_size = 10) * sizeof (ITEXT *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8756 for (i = 0; i < itext_size; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8757 itext_info[i] = (ITEXT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8758 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8759
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8760 /* If the pointer is already present in the list, then set the offset. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8761 for (i = 0; i < itext_size; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8762 if ((itext_info[i] != (ITEXT *)NULL) &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8763 (itext_info[i]->pointer == pointer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8764 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8765 itext = itext_info[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8766 itext_info[i]->offset = offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8767 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8768 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8769
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8770 if (i == itext_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8771 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8772 /* Find a blank slot, (or create a new one), and remember the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8773 pointer and offset. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8774 for (i = 0; i < itext_size; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8775 if (itext_info[i] == (ITEXT *)NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8776 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8777
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8778 /* If not found, then add some slots. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8779 if (i == itext_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8780 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8781 register int j;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8782
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8783 itext_info = (ITEXT **)xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8784 (itext_info, (itext_size += 10) * sizeof (ITEXT *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8785
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8786 for (j = i; j < itext_size; j++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8787 itext_info[j] = (ITEXT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8788 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8789
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8790 /* Now add the pointer and the offset. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8791 itext_info[i] = (ITEXT *)xmalloc (sizeof (ITEXT));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8792 itext_info[i]->pointer = pointer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8793 itext_info[i]->offset = offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8794 itext = itext_info[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8795 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8796 return (itext);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8797 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8798
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8799 /* Forget the input text associated with POINTER. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8800 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8801 forget_itext (char *pointer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8802 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8803 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8804
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8805 for (i = 0; i < itext_size; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8806 if (itext_info[i] && (itext_info[i]->pointer == pointer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8807 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8808 free (itext_info[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8809 itext_info[i] = (ITEXT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8810 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8811 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8812 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8813
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8814 /* Append the text which appeared in input_text from the last offset to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8815 the character just before the command that we are currently executing. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8816 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8817 me_append_before_this_command (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8818 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8819 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8820
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8821 for (i = input_text_offset; i && (input_text[i] != COMMAND_PREFIX); i--);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8822 maybe_write_itext (input_text, i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8823 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8824
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8825 /* Similar to execute_string (), but only takes a single string argument,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8826 and remembers the input text location, etc. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8827 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8828 me_execute_string (char *execution_string)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8829 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8830 pushfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8831 input_text_offset = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8832 input_text = execution_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8833 input_filename = strdup (input_filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8834 size_of_input_text = strlen (execution_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8835
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8836 remember_itext (execution_string, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8837
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8838 executing_string++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8839 reader_loop ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8840 popfile ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8841 executing_string--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8842 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8843
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8844 /* Append the text which appears in input_text from the last offset to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8845 the current OFFSET. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8846 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8847 append_to_expansion_output (int offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8848 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8849 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8850 ITEXT *itext = (ITEXT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8851
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8852 for (i = 0; i < itext_size; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8853 if (itext_info[i] && itext_info[i]->pointer == input_text)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8854 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8855 itext = itext_info[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8856 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8857 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8858
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8859 if (!itext)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8860 itext = remember_itext (input_text, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8861
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8862 if (offset > itext_info[i]->offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8863 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8864 write_region_to_macro_output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8865 (input_text, itext_info[i]->offset, offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8866 remember_itext (input_text, offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8867 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8868 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8869
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8870 /* Only write this input text iff it appears in our itext list. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8871 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8872 maybe_write_itext (char *pointer, int offset)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8873 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8874 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8875 ITEXT *itext = (ITEXT *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8876
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8877 for (i = 0; i < itext_size; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8878 if (itext_info[i] && (itext_info[i]->pointer == pointer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8879 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8880 itext = itext_info[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8881 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8882 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8883
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8884 if (itext && (itext->offset < offset))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8885 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8886 write_region_to_macro_output (itext->pointer, itext->offset, offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8887 remember_itext (pointer, offset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8888 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8889 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8890
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8891 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8892 write_region_to_macro_output (char *string, int start, int end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8893 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8894 if (macro_expansion_output_stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8895 fwrite (string + start, 1, end - start, macro_expansion_output_stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8896 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8897
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8898 #endif /* HAVE_MACROS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8899
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8900 /* Return the length of the array in ARRAY. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8901 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8902 array_len (char **array)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8903 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8904 register int i = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8905
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8906 if (array)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8907 for (i = 0; array[i] != (char *)NULL; i++);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8908
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8909 return (i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8910 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8911
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8912 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8913 free_array (char **array)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8914 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8915 if (array)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8916 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8917 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8918
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8919 for (i = 0; array[i] != (char *)NULL; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8920 free (array[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8921
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8922 free (array);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8923 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8924 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8925
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8926 /* Function is used even when we don't have macros. Although, I have
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8927 to admit, it is unlikely that you would have a use for it if you
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8928 aren't using macros. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8929 static char **
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8930 get_brace_args (int quote_single)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8931 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8932 char **arglist, *word;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8933 int arglist_index, arglist_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8934 int character, escape_seen, start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8935 int depth = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8936
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8937 /* There is an arglist in braces here, so gather the args inside of it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8938 skip_whitespace_and_newlines ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8939 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8940 arglist = (char **)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8941 arglist_index = arglist_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8942
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8943 get_arg:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8944 skip_whitespace_and_newlines ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8945 start = input_text_offset;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8946 escape_seen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8947
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8948 while ((character = curchar ()))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8949 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8950 if (character == '\\')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8951 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8952 input_text_offset += 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8953 escape_seen = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8954 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8955 else if (character == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8956 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8957 depth++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8958 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8959 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8960 else if ((character == ',' && !quote_single) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8961 ((character == '}') && depth == 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8962 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8963 int len = input_text_offset - start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8964
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8965 if (len || (character != '}'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8966 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8967 word = (char *)xmalloc (1 + len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8968 strncpy (word, input_text + start, len);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8969 word[len] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8970
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8971 /* Clean up escaped characters. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8972 if (escape_seen)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8973 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8974 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8975
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8976 for (i = 0; word[i]; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8977 if (word[i] == '\\')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8978 memcpy (word + i, word + i + 1, strlen (word + i + 1));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8979 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8980
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8981 if (arglist_index + 2 >= arglist_size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8982 arglist = (char **)xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8983 (arglist, (arglist_size += 10) * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8984
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8985 arglist[arglist_index++] = word;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8986 arglist[arglist_index] = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8987 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8988
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8989 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8990 if (character == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8991 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8992 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8993 goto get_arg;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8994 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8995 else if (character == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8996 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8997 depth--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8998 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8999 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9000 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9001 input_text_offset++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9002 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9003 return (arglist);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9004 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9005
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9006 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9007 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9008 /* Looking For Include Files */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9009 /* */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9010 /* **************************************************************** */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9011
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9012 /* Given a string containing units of information separated by colons,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9013 return the next one pointed to by INDEX, or NULL if there are no more.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9014 Advance INDEX to the character after the colon. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9015 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9016 extract_colon_unit (char *string, int *indecks)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9017 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9018 int i, start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9019
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9020 i = *indecks;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9021
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9022 if (!string || (i >= (int) strlen (string)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9023 return ((char *)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9024
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9025 /* Each call to this routine leaves the index pointing at a colon if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9026 there is more to the path. If I is > 0, then increment past the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9027 `:'. If I is 0, then the path has a leading colon. Trailing colons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9028 are handled OK by the `else' part of the if statement; an empty
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9029 string is returned in that case. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9030 if (i && string[i] == ':')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9031 i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9032
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9033 start = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9034
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9035 while (string[i] && string[i] != ':') i++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9036
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9037 *indecks = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9038
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9039 if (i == start)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9040 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9041 if (string[i])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9042 (*indecks)++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9043
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9044 /* Return "" in the case of a trailing `:'. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9045 return (strdup (""));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9046 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9047 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9048 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9049 char *value;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9050
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9051 value = (char *)xmalloc (1 + (i - start));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9052 strncpy (value, &string[start], (i - start));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9053 value [i - start] = '\0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9054
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9055 return (value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9056 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9057 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9058
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9059 /* Return the full pathname for FILENAME by searching along PATH.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9060 When found, return the stat () info for FILENAME in FINFO.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9061 If PATH is NULL, only the current directory is searched.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9062 If the file could not be found, return a NULL pointer. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9063 static char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9064 get_file_info_in_path (char *filename, char *path, struct stat *finfo)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9065 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9066 char *dir;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9067 int result, indecks = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9068
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9069 if (path == (char *)NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9070 path = ".";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9071
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9072 /* Handle absolute pathnames. "./foo", "/foo", "../foo". */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9073 if (*filename == '/' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9074 (*filename == '.' &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9075 (filename[1] == '/' ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9076 (filename[1] == '.' && filename[2] == '/'))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9077 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9078 if (stat (filename, finfo) == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9079 return (strdup (filename));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9080 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9081 return ((char *)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9082 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9083
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9084 while ((dir = extract_colon_unit (path, &indecks)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9085 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9086 char *fullpath;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9087
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9088 if (!*dir)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9089 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9090 free (dir);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9091 dir = strdup (".");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9092 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9093
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9094 fullpath = (char *)xmalloc (2 + strlen (dir) + strlen (filename));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9095 sprintf (fullpath, "%s/%s", dir, filename);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9096 free (dir);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9097
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9098 result = stat (fullpath, finfo);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9099
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9100 if (result == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9101 return (fullpath);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9102 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9103 free (fullpath);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9104 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9105 return ((char *)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9106 }