Many new patches
[libffi.git] / patches / stand-alone
1 Index: libffi/ChangeLog.libffi
2 ===================================================================
3 --- /dev/null
4 +++ libffi/ChangeLog.libffi
5 @@ -0,0 +1,584 @@
6 +2011-02-08  Andreas Tobler  <andreast@fgznet.ch>
7 +
8 +       * testsuite/lib/libffi.exp: Tweak for stand-alone mode.
9 +
10 +2009-12-25  Samuli Suominen  <ssuominen@gentoo.org>
11 +
12 +       * configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64.
13 +       * configure: Rebuilt.
14 +       * fficonfig.h.in: Rebuilt.
15 +
16 +2009-06-16  Andrew Haley  <aph@redhat.com>
17 +
18 +       * testsuite/libffi.call/cls_align_sint64.c,
19 +       testsuite/libffi.call/cls_align_uint64.c,
20 +       testsuite/libffi.call/cls_longdouble_va.c,
21 +       testsuite/libffi.call/cls_ulonglong.c,
22 +       testsuite/libffi.call/return_ll1.c,
23 +       testsuite/libffi.call/stret_medium2.c: Fix printf format
24 +       specifiers.
25 +       * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs.
26 +       * testsuite/libffi.call/float2.c: Fix dg-excess-errors.
27 +       * testsuite/libffi.call/ffitest.h,
28 +       testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define.
29 +
30 +2009-06-12  Andrew Haley  <aph@redhat.com>
31 +
32 +       * testsuite/libffi.call/cls_align_sint64.c,
33 +       testsuite/libffi.call/cls_align_uint64.c,
34 +       testsuite/libffi.call/cls_ulonglong.c,
35 +       testsuite/libffi.call/return_ll1.c,
36 +       testsuite/libffi.call/stret_medium2.c: Fix printf format
37 +       specifiers.
38 +       testsuite/libffi.special/unwindtest.cc: include stdint.h.
39 +
40 +2009-06-11  Timothy Wall  <twall@users.sf.net>
41 +
42 +       * Makefile.am,
43 +        configure.ac,
44 +        include/ffi.h.in,
45 +        include/ffi_common.h,
46 +        src/closures.c,
47 +        src/dlmalloc.c,
48 +        src/x86/ffi.c,
49 +        src/x86/ffitarget.h,
50 +        src/x86/win64.S (new),
51 +       README: Added win64 support (mingw or MSVC)
52 +        * Makefile.in,
53 +        include/Makefile.in,
54 +        man/Makefile.in,
55 +        testsuite/Makefile.in,
56 +        configure,
57 +        aclocal.m4: Regenerated
58 +        * ltcf-c.sh: properly escape cygwin/w32 path
59 +        * man/ffi_call.3: Clarify size requirements for return value.
60 +        * src/x86/ffi64.c: Fix filename in comment.
61 +        * src/x86/win32.S: Remove unused extern.
62 +
63 +        * testsuite/libffi.call/closure_fn0.c,
64 +        testsuite/libffi.call/closure_fn1.c,
65 +        testsuite/libffi.call/closure_fn2.c,
66 +        testsuite/libffi.call/closure_fn3.c,
67 +        testsuite/libffi.call/closure_fn4.c,
68 +        testsuite/libffi.call/closure_fn5.c,
69 +        testsuite/libffi.call/closure_fn6.c,
70 +       testsuite/libffi.call/closure_stdcall.c,
71 +       testsuite/libffi.call/cls_12byte.c,
72 +       testsuite/libffi.call/cls_16byte.c,
73 +       testsuite/libffi.call/cls_18byte.c,
74 +       testsuite/libffi.call/cls_19byte.c,
75 +       testsuite/libffi.call/cls_1_1byte.c,
76 +       testsuite/libffi.call/cls_20byte.c,
77 +       testsuite/libffi.call/cls_20byte1.c,
78 +       testsuite/libffi.call/cls_24byte.c,
79 +       testsuite/libffi.call/cls_2byte.c,
80 +       testsuite/libffi.call/cls_3_1byte.c,
81 +       testsuite/libffi.call/cls_3byte1.c,
82 +       testsuite/libffi.call/cls_3byte2.c,
83 +       testsuite/libffi.call/cls_4_1byte.c,
84 +       testsuite/libffi.call/cls_4byte.c,
85 +       testsuite/libffi.call/cls_5_1_byte.c,
86 +       testsuite/libffi.call/cls_5byte.c,
87 +       testsuite/libffi.call/cls_64byte.c,
88 +       testsuite/libffi.call/cls_6_1_byte.c,
89 +       testsuite/libffi.call/cls_6byte.c,
90 +       testsuite/libffi.call/cls_7_1_byte.c,
91 +       testsuite/libffi.call/cls_7byte.c,
92 +       testsuite/libffi.call/cls_8byte.c,
93 +       testsuite/libffi.call/cls_9byte1.c,
94 +       testsuite/libffi.call/cls_9byte2.c,
95 +       testsuite/libffi.call/cls_align_double.c,
96 +       testsuite/libffi.call/cls_align_float.c,
97 +       testsuite/libffi.call/cls_align_longdouble.c,
98 +       testsuite/libffi.call/cls_align_longdouble_split.c,
99 +       testsuite/libffi.call/cls_align_longdouble_split2.c,
100 +       testsuite/libffi.call/cls_align_pointer.c,
101 +       testsuite/libffi.call/cls_align_sint16.c,
102 +       testsuite/libffi.call/cls_align_sint32.c,
103 +       testsuite/libffi.call/cls_align_sint64.c,
104 +       testsuite/libffi.call/cls_align_uint16.c,
105 +       testsuite/libffi.call/cls_align_uint32.c,
106 +       testsuite/libffi.call/cls_align_uint64.c,
107 +       testsuite/libffi.call/cls_dbls_struct.c,
108 +       testsuite/libffi.call/cls_double.c,
109 +       testsuite/libffi.call/cls_double_va.c,
110 +       testsuite/libffi.call/cls_float.c,
111 +       testsuite/libffi.call/cls_longdouble.c,
112 +       testsuite/libffi.call/cls_longdouble_va.c,
113 +       testsuite/libffi.call/cls_multi_schar.c,
114 +       testsuite/libffi.call/cls_multi_sshort.c,
115 +       testsuite/libffi.call/cls_multi_sshortchar.c,
116 +       testsuite/libffi.call/cls_multi_uchar.c,
117 +       testsuite/libffi.call/cls_multi_ushort.c,
118 +       testsuite/libffi.call/cls_multi_ushortchar.c,
119 +       testsuite/libffi.call/cls_pointer.c,
120 +       testsuite/libffi.call/cls_pointer_stack.c,
121 +       testsuite/libffi.call/cls_schar.c,
122 +       testsuite/libffi.call/cls_sint.c,
123 +       testsuite/libffi.call/cls_sshort.c,
124 +       testsuite/libffi.call/cls_uchar.c,
125 +       testsuite/libffi.call/cls_uint.c,
126 +       testsuite/libffi.call/cls_ulonglong.c,
127 +       testsuite/libffi.call/cls_ushort.c,
128 +       testsuite/libffi.call/err_bad_abi.c,
129 +       testsuite/libffi.call/err_bad_typedef.c,
130 +       testsuite/libffi.call/float2.c,
131 +       testsuite/libffi.call/huge_struct.c,
132 +       testsuite/libffi.call/nested_struct.c,
133 +       testsuite/libffi.call/nested_struct1.c,
134 +       testsuite/libffi.call/nested_struct10.c,
135 +       testsuite/libffi.call/nested_struct2.c,
136 +       testsuite/libffi.call/nested_struct3.c,
137 +       testsuite/libffi.call/nested_struct4.c,
138 +       testsuite/libffi.call/nested_struct5.c,
139 +       testsuite/libffi.call/nested_struct6.c,
140 +       testsuite/libffi.call/nested_struct7.c,
141 +       testsuite/libffi.call/nested_struct8.c,
142 +       testsuite/libffi.call/nested_struct9.c,
143 +       testsuite/libffi.call/problem1.c,
144 +       testsuite/libffi.call/return_ldl.c,
145 +       testsuite/libffi.call/return_ll1.c,
146 +       testsuite/libffi.call/stret_large.c,
147 +       testsuite/libffi.call/stret_large2.c,
148 +       testsuite/libffi.call/stret_medium.c,
149 +       testsuite/libffi.call/stret_medium2.c,
150 +        testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead
151 +        of checking for MMAP.  Use intptr_t instead of long casts.
152 +
153 +2009-06-04  Andrew Haley  <aph@redhat.com>
154 +
155 +       * src/powerpc/ffitarget.h: Fix misapplied merge from gcc.
156 +
157 +2009-06-04  Andrew Haley  <aph@redhat.com>
158 +
159 +       * src/mips/o32.S,
160 +       src/mips/n32.S: Fix licence formatting.
161 +
162 +2009-06-04  Andrew Haley  <aph@redhat.com>
163 +
164 +       * src/x86/darwin.S: Fix licence formatting.
165 +       src/x86/win32.S: Likewise.
166 +       src/sh64/sysv.S: Likewise.
167 +       src/sh/sysv.S: Likewise.
168 +
169 +2009-06-04  Andrew Haley  <aph@redhat.com>
170 +
171 +       * src/sh64/ffi.c: Remove lint directives.  Was missing from merge
172 +       of Andreas Tobler's patch from 2006-04-22.
173 +       
174 +2009-06-04  Andrew Haley  <aph@redhat.com>
175 +
176 +       * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of
177 +       2007-03-07.
178 +
179 +2008-12-26  Timothy Wall  <twall@users.sf.net>
180 +
181 +       * testsuite/libffi.call/cls_longdouble.c,
182 +        testsuite/libffi.call/cls_longdouble_va.c,
183 +        testsuite/libffi.call/cls_align_longdouble.c,
184 +        testsuite/libffi.call/cls_align_longdouble_split.c,
185 +        testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected
186 +        failures on x86_64 cygwin/mingw.
187 +
188 +2008-12-22  Timothy Wall  <twall@users.sf.net>
189 +
190 +       * testsuite/libffi.call/closure_fn0.c,
191 +        testsuite/libffi.call/closure_fn1.c,    
192 +        testsuite/libffi.call/closure_fn2.c,    
193 +        testsuite/libffi.call/closure_fn3.c,    
194 +        testsuite/libffi.call/closure_fn4.c,    
195 +        testsuite/libffi.call/closure_fn5.c,    
196 +        testsuite/libffi.call/closure_fn6.c,    
197 +        testsuite/libffi.call/closure_loc_fn0.c,    
198 +        testsuite/libffi.call/closure_stdcall.c,    
199 +        testsuite/libffi.call/cls_align_pointer.c,    
200 +        testsuite/libffi.call/cls_pointer.c,    
201 +        testsuite/libffi.call/cls_pointer_stack.c: use portable cast from
202 +        pointer to integer (intptr_t).
203 +        * testsuite/libffi.call/cls_longdouble.c: disable for win64.
204 +       
205 +2008-12-19  Anthony Green  <green@redhat.com>
206 +
207 +       * configure.ac: Bump version to 3.0.8.
208 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
209 +       * libtool-version: Increment revision.
210 +       * README: Update for new release.
211 +
212 +2008-11-11  Anthony Green  <green@redhat.com>
213 +
214 +       * configure.ac: Bump version to 3.0.7.
215 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
216 +       * libtool-version: Increment revision.
217 +       * README: Update for new release.
218 +
219 +2008-08-25  Andreas Tobler  <a.tobler@schweiz.org>
220 +
221 +       * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and
222 +       FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum.
223 +       Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT.
224 +       Adjust copyright notice.
225 +       * src/powerpc/ffi.c: Add two new flags to indicate if we have one
226 +       register or two register to use for FFI_SYSV structs.
227 +       (ffi_prep_cif_machdep): Pass the right register flag introduced above.
228 +       (ffi_closure_helper_SYSV): Fix the return type for
229 +       FFI_SYSV_TYPE_SMALL_STRUCT. Comment.
230 +       Adjust copyright notice.
231 +
232 +2008-07-24  Anthony Green  <green@redhat.com>
233 +
234 +       * testsuite/libffi.call/cls_dbls_struct.c,
235 +       testsuite/libffi.call/cls_double_va.c,
236 +       testsuite/libffi.call/cls_longdouble.c,
237 +       testsuite/libffi.call/cls_longdouble_va.c,
238 +       testsuite/libffi.call/cls_pointer.c,
239 +       testsuite/libffi.call/cls_pointer_stack.c,
240 +       testsuite/libffi.call/err_bad_abi.c: Clean up failures from
241 +       compiler warnings.
242 +
243 +2008-07-17  Anthony Green  <green@redhat.com>
244 +
245 +       * configure.ac: Bump version to 3.0.6.
246 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
247 +       * libtool-version: Increment revision.  Add documentation.
248 +       * README: Update for new release.
249 +
250 +2008-07-16  Kaz Kojima  <kkojima@gcc.gnu.org>
251 +
252 +       * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned
253 +       int.
254 +
255 +2008-07-16  Kaz Kojima  <kkojima@gcc.gnu.org>
256 +
257 +       * src/sh/sysv.S: Add .note.GNU-stack on Linux.
258 +       * src/sh64/sysv.S: Likewise.
259 +
260 +2008-04-03  Anthony Green  <green@redhat.com>
261 +
262 +       * libffi.pc.in (Libs): Add -L${libdir}.
263 +       * configure.ac: Bump version to 3.0.5.
264 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
265 +       * libtool-version: Increment revision.
266 +       * README: Update for new release.
267 +
268 +2008-04-03  Anthony Green  <green@redhat.com>
269 +           Xerces Ranby  <xerxes@zafena.se>
270 +
271 +       * include/ffi.h.in: Wrap definition of target architecture to
272 +       protect from double definitions.
273 +
274 +2008-03-22  Moriyoshi Koizumi  <moriyoshi@gmail.com>
275 +
276 +       * src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in
277 +       closure_loc_fn0.c.
278 +       * testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0):
279 +       New test.
280 +
281 +2008-03-04  Anthony Green  <green@redhat.com>
282 +           Blake Chaffin
283 +           hos@tamanegi.org
284 +
285 +       * testsuite/libffi.call/cls_align_longdouble_split2.c
286 +          testsuite/libffi.call/cls_align_longdouble_split.c
287 +          testsuite/libffi.call/cls_dbls_struct.c
288 +          testsuite/libffi.call/cls_double_va.c
289 +          testsuite/libffi.call/cls_longdouble.c
290 +          testsuite/libffi.call/cls_longdouble_va.c
291 +          testsuite/libffi.call/cls_pointer.c
292 +          testsuite/libffi.call/cls_pointer_stack.c
293 +          testsuite/libffi.call/err_bad_abi.c
294 +          testsuite/libffi.call/err_bad_typedef.c
295 +          testsuite/libffi.call/huge_struct.c
296 +          testsuite/libffi.call/stret_large2.c
297 +          testsuite/libffi.call/stret_large.c
298 +          testsuite/libffi.call/stret_medium2.c
299 +          testsuite/libffi.call/stret_medium.c: New tests from Apple.
300 +
301 +2008-02-26  Jakub Jelinek  <jakub@redhat.com>
302 +            Anthony Green  <green@redhat.com>
303 +
304 +       * src/alpha/osf.S: Add .note.GNU-stack on Linux.
305 +       * src/s390/sysv.S: Likewise.
306 +       * src/powerpc/linux64.S: Likewise.
307 +       * src/powerpc/linux64_closure.S: Likewise.
308 +       * src/powerpc/ppc_closure.S: Likewise.
309 +       * src/powerpc/sysv.S: Likewise.
310 +       * src/x86/unix64.S: Likewise.
311 +       * src/x86/sysv.S: Likewise.
312 +       * src/sparc/v8.S: Likewise.
313 +       * src/sparc/v9.S: Likewise.
314 +       * src/m68k/sysv.S: Likewise.
315 +       * src/ia64/unix.S: Likewise.
316 +       * src/arm/sysv.S: Likewise.
317 +
318 +2008-02-26  Anthony Green  <green@redhat.com>
319 +            Thomas Heller  <theller@ctypes.org>
320 +
321 +       * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C
322 +       comment.
323 +
324 +2008-02-26  Anthony Green  <green@redhat.org>
325 +            Thomas Heller  <theller@ctypes.org>
326 +
327 +       * include/ffi.h.in: Change void (*)() to void (*)(void).
328 +
329 +2008-02-26  Anthony Green  <green@redhat.org>
330 +            Thomas Heller  <theller@ctypes.org>
331 +
332 +       * src/alpha/ffi.c: Change void (*)() to void (*)(void).
333 +       src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c,
334 +       src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c,
335 +       src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S,
336 +       src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c,
337 +       src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c,
338 +       src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S,
339 +       src/x86/ffi64.c: Ditto.
340 +
341 +2008-02-24  Anthony Green  <green@redhat.org>
342 +
343 +       * configure.ac: Accept openbsd*, not just openbsd.
344 +       Bump version to 3.0.4.
345 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
346 +       * libtool-version: Increment revision.
347 +       * README: Update for new release.
348 +
349 +2008-02-22  Anthony Green  <green@redhat.com>
350 +
351 +       * README: Clean up list of tested platforms.
352 +
353 +2008-02-22  Anthony Green  <green@redhat.com>
354 +
355 +       * configure.ac: Bump version to 3.0.3.
356 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
357 +       * libtool-version: Increment revision.
358 +       * README: Update for new release.  Clean up test docs.
359 +
360 +2008-02-22  Bjoern Koenig  <bkoenig@alpha-tierchen.de>
361 +           Andreas Tobler  <a.tobler@schweiz.org>
362 +
363 +       * configure.ac: Add amd64-*-freebsd* target.
364 +       * configure: Regenerate.
365 +
366 +2008-02-22  Thomas Heller <theller@ctypes.org>
367 +
368 +       * configure.ac: Add x86 OpenBSD support.
369 +       * configure: Rebuilt.
370 +
371 +2008-02-21  Thomas Heller <theller@ctypes.org>
372 +
373 +       * README: Change "make test" to "make check".
374 +
375 +2008-02-21  Anthony Green  <green@redhat.com>
376 +
377 +       * configure.ac: Bump version to 3.0.2.
378 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
379 +       * libtool-version: Increment revision.
380 +       * README: Update for new release.
381 +
382 +2008-02-21  Björn König <bkoenig@alpha-tierchen.de>
383 +
384 +       * src/x86/freebsd.S: New file.
385 +       * configure.ac: Add x86 FreeBSD support.
386 +       * Makefile.am: Ditto.
387 +
388 +2008-02-15  Anthony Green  <green@redhat.com>
389 +
390 +       * configure.ac: Bump version to 3.0.1.
391 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
392 +       * libtool-version: Increment revision.
393 +       * README: Update for new release.
394 +
395 +2008-02-15  David Daney         <ddaney@avtrex.com>
396 +
397 +       * src/mips/ffi.c: Remove extra '>' from include directive.
398 +       (ffi_prep_closure_loc): Use clear_location instead of tramp.
399 +
400 +2008-02-15  Anthony Green  <green@redhat.com>
401 +
402 +       * configure.ac: Bump version to 3.0.0.
403 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
404 +
405 +2008-02-15  David Daney         <ddaney@avtrex.com>
406 +
407 +       * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE):
408 +       Define (conditionally), and use it to include cachectl.h.
409 +       (ffi_prep_closure_loc): Fix cache flushing.
410 +       * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define.
411 +
412 +2008-02-15  Anthony Green  <green@redhat.com>
413 +
414 +        * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3:
415 +       Update dates and remove all references to ffi_prep_closure.
416 +       * configure.ac: Bump version to 2.99.9.
417 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
418 +
419 +2008-02-15  Anthony Green  <green@redhat.com>
420 +
421 +       * man/ffi_prep_closure.3: Delete.
422 +       * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3.
423 +       (man_MANS): Ditto.
424 +       * man/Makefile.in: Rebuilt.
425 +       * configure.ac: Bump version to 2.99.8.
426 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
427 +
428 +2008-02-14  Anthony Green  <green@redhat.com>
429 +
430 +       * configure.ac: Bump version to 2.99.7.
431 +       * configure, doc/stamp-vti, doc/version.texi: Rebuilt.
432 +       * include/ffi.h.in LICENSE src/debug.c src/closures.c
433 +          src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h
434 +          src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c
435 +          src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S
436 +          src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c
437 +          src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c
438 +          src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S
439 +          src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h
440 +          src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c
441 +          src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S
442 +          src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h
443 +          src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h
444 +          src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S
445 +          src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h
446 +          src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S
447 +          src/arm/ffitarget.h src/prep_cif.c: Update license text.
448 +
449 +2008-02-14  Anthony Green  <green@redhat.com>
450 +
451 +       * README: Update tested platforms.
452 +       * configure.ac: Bump version to 2.99.6.
453 +       * configure: Rebuilt.
454 +
455 +2008-02-14  Anthony Green  <green@redhat.com>
456 +
457 +       * configure.ac: Bump version to 2.99.5.
458 +       * configure: Rebuilt.
459 +       * Makefile.am (EXTRA_DIST): Add darwin64.S
460 +       * Makefile.in: Rebuilt.
461 +       * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree.
462 +       * LICENSE: Update WARRANTY.
463 +
464 +2008-02-14  Anthony Green  <green@redhat.com>
465 +
466 +       * libffi.pc.in (libdir): Fix libdir definition.
467 +       * configure.ac: Bump version to 2.99.4.
468 +       * configure: Rebuilt.
469 +
470 +2008-02-14  Anthony Green  <green@redhat.com>
471 +
472 +       * README: Update.
473 +       * libffi.info: New file.
474 +       * doc/stamp-vti: New file.
475 +       * configure.ac: Bump version to 2.99.3.
476 +       * configure: Rebuilt.
477 +
478 +2008-02-14  Anthony Green  <green@redhat.com>
479 +
480 +       * Makefile.am (SUBDIRS): Add man dir.
481 +       * Makefile.in: Rebuilt.
482 +       * configure.ac: Create Makefile.
483 +       * configure: Rebuilt.
484 +        * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3
485 +          man/Makefile.am man/Makefile.in: New files.
486 +
487 +2008-02-14  Tom Tromey  <tromey@redhat.com>
488 +
489 +       * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt.
490 +       * mdate-sh, texinfo.tex: New files.
491 +       * Makefile.am (info_TEXINFOS): New variable.
492 +       * doc/libffi.texi: New file.
493 +       * doc/version.texi: Likewise.
494 +
495 +2008-02-14  Anthony Green  <green@redhat.com>
496 +
497 +       * Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET).
498 +       (lib_LTLIBRARIES): Define.
499 +       (toolexeclib_LIBRARIES): Undefine.
500 +       * Makefile.in: Rebuilt.
501 +       * configure.ac: Reset version to 2.99.1.
502 +       * configure.in: Rebuilt.
503 +
504 +2008-02-14  Anthony Green  <green@redhat.com>
505 +
506 +       * libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@.
507 +       * configure.ac: Reset version to 2.99.1.
508 +       * configure.in: Rebuilt.
509 +       * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi.
510 +       * Makefile.in: Rebuilt.
511 +       * LICENSE: Update copyright notice.
512 +
513 +2008-02-14  Anthony Green  <green@redhat.com>
514 +
515 +       * include/Makefile.am (nodist_includes_HEADERS): Define.  Don't
516 +       distribute ffitarget.h or ffi.h from the build include dir.
517 +       * Makefile.in: Rebuilt.
518 +
519 +2008-02-14  Anthony Green  <green@redhat.com>
520 +
521 +       * include/Makefile.am (includesdir): Install headers under libdir.
522 +       (pkgconfigdir): Define. Install libffi.pc.
523 +       * include/Makefile.in: Rebuilt.
524 +       * libffi.pc.in: Create.
525 +       * libtool-version: Increment CURRENT
526 +       * configure.ac: Add libffi.pc.in
527 +       * configure: Rebuilt.
528 +
529 +2008-02-03  Anthony Green  <green@redhat.com>
530 +
531 +       * include/Makefile.am (includesdir): Fix header install with
532 +       DESTDIR.
533 +       * include/Makefile.in: Rebuilt.
534 +
535 +2008-02-03  Timothy Wall  <twall@users.sf.net>
536 +
537 +       * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return
538 +          offset based on code pointer, not data pointer.
539 +
540 +2008-02-01  Anthony Green  <green@redhat.com>
541 +
542 +       * include/Makefile.am: Fix header installs.
543 +       * Makefile.am: Ditto.
544 +       * include/Makefile.in: Rebuilt.
545 +       * Makefile.in: Ditto.
546 +
547 +2008-02-01  Anthony Green  <green@redhat.com>
548 +
549 +       * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL,
550 +       FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last
551 +       patch.
552 +
553 +2008-01-31  Anthony Green  <green@redhat.com>
554 +
555 +       * Makefile.am (EXTRA_DIST): Add missing files.
556 +       * testsuite/Makefile.am: Ditto.
557 +       * Makefile.in, testsuite/Makefile.in: Rebuilt.
558 +
559 +2008-01-31  Timothy Wall <twall@users.sf.net>
560 +
561 +       * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall
562 +       closures.
563 +       * src/x86/ffitarget.h: Increase size of trampoline for stdcall
564 +       closures.
565 +       * src/x86/win32.S: Add assembly for stdcall closure.
566 +       * src/x86/ffi.c: Initialize stdcall closure trampoline.
567 +
568 +2008-01-30  H.J. Lu <hongjiu.lu@intel.com>
569 +
570 +       PR libffi/34612
571 +       * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when
572 +       returning struct.
573 +
574 +       * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer"
575 +       tests.
576 +
577 +2008-01-30  Anthony Green  <green@redhat.com>
578 +
579 +       * Makefile.am, include/Makefile.am: Move headers to
580 +       libffi_la_SOURCES for new automake.
581 +       * Makefile.in, include/Makefile.in: Rebuilt.
582 +       
583 +       * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for 
584 +       execution outside of gcc tree.
585 +       * testsuite/lib/target-libpath.exp: Ditto.
586 +
587 +       * testsuite/lib/libffi-dg.exp: Many changes to allow for execution
588 +       outside of gcc tree.
589 +
590 Index: libffi/LICENSE
591 ===================================================================
592 --- libffi.orig/LICENSE
593 +++ libffi/LICENSE
594 @@ -1,4 +1,5 @@
595 -libffi - Copyright (c) 1996-2003  Red Hat, Inc.
596 +libffi - Copyright (c) 1996-2009  Anthony Green, Red Hat, Inc and others.  
597 +See source files for details.
598  
599  Permission is hereby granted, free of charge, to any person obtaining
600  a copy of this software and associated documentation files (the
601 @@ -11,10 +12,10 @@ the following conditions:
602  The above copyright notice and this permission notice shall be included
603  in all copies or substantial portions of the Software.
604  
605 -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
606 -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
607 +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
608 +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
609  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
610 -IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
611 -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
612 -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
613 -OTHER DEALINGS IN THE SOFTWARE.
614 +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
615 +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
616 +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
617 +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
618 Index: libffi/Makefile.am
619 ===================================================================
620 --- libffi.orig/Makefile.am
621 +++ libffi/Makefile.am
622 @@ -1,7 +1,6 @@
623  ## Process this with automake to create Makefile.in
624  
625  AUTOMAKE_OPTIONS = foreign subdir-objects
626 -ACLOCAL_AMFLAGS = -I .. -I ../config
627  
628  SUBDIRS = include testsuite man
629  
630 @@ -27,10 +26,17 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
631         src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h \
632         src/sparc/v8.S src/sparc/v9.S src/sparc/ffitarget.h \
633         src/sparc/ffi.c src/x86/darwin64.S \
634 -       src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/darwin.S \
635 +       src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/win64.S \
636 +       src/x86/darwin.S src/x86/freebsd.S \
637         src/x86/ffi64.c src/x86/unix64.S src/x86/ffitarget.h \
638         src/pa/ffitarget.h src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \
639 -       src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c
640 +       src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h \
641 +       src/dlmalloc.c \
642 +       src/moxie/ffi.c src/moxie/eabi.S \
643 +       libtool-version ChangeLog.libffi m4/libtool.m4 \
644 +       m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
645 +
646 +info_TEXINFOS = doc/libffi.texi
647  
648  ## ################################################################
649  
650 @@ -78,12 +84,17 @@ AM_MAKEFLAGS = \
651  
652  MAKEOVERRIDES=
653  
654 -toolexeclib_LTLIBRARIES = libffi.la
655 +ACLOCAL_AMFLAGS=$(ACLOCAL_AMFLAGS) -I m4
656 +
657 +lib_LTLIBRARIES = libffi.la
658  noinst_LTLIBRARIES = libffi_convenience.la
659  
660  libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \
661                 src/raw_api.c src/java_raw_api.c src/closures.c
662  
663 +pkgconfigdir = $(libdir)/pkgconfig
664 +pkgconfig_DATA = libffi.pc
665 +
666  nodist_libffi_la_SOURCES =
667  
668  if MIPS
669 @@ -167,17 +178,12 @@ nodist_libffi_convenience_la_SOURCES = $
670  
671  AM_CFLAGS = -Wall -g -fexceptions
672  
673 -LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
674 -
675  libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
676  
677  AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
678  AM_CCASFLAGS = $(AM_CPPFLAGS)
679  
680 -# Multilib support.  Automake should provide these on its own.
681 -all-recursive: all-multi
682 -install-recursive: install-multi
683 -mostlyclean-recursive: mostlyclean-multi
684 -clean-recursive: clean-multi
685 -distclean-recursive: distclean-multi
686 -maintainer-clean-recursive: maintainer-clean-multi
687 +# No install-html or install-pdf support in automake yet
688 +.PHONY: install-html install-pdf
689 +install-html:
690 +install-pdf:
691 Index: libffi/configure
692 ===================================================================
693 --- libffi.orig/configure
694 +++ libffi/configure
695 @@ -1,8 +1,8 @@
696  #! /bin/sh
697  # Guess values for system-dependent variables and create Makefiles.
698 -# Generated by GNU Autoconf 2.68 for libffi 3.0.9.
699 +# Generated by GNU Autoconf 2.68 for libffi 3.0.10rc10.
700  #
701 -# Report bugs to <http://gcc.gnu.org/bugs.html>.
702 +# Report bugs to <http://sourceware.org/libffi.html>.
703  #
704  #
705  # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
706 @@ -247,7 +247,7 @@ fi
707      $as_echo "$0: be upgraded to zsh 4.3.4 or later."
708    else
709      $as_echo "$0: Please tell bug-autoconf@gnu.org and
710 -$0: http://gcc.gnu.org/bugs.html about your system,
711 +$0: http://sourceware.org/libffi.html about your system,
712  $0: including any error possibly output before this
713  $0: message. Then install a modern shell, or manually run
714  $0: the script under such a shell if you do have one."
715 @@ -570,9 +570,9 @@ MAKEFLAGS=
716  # Identity of this package.
717  PACKAGE_NAME='libffi'
718  PACKAGE_TARNAME='libffi'
719 -PACKAGE_VERSION='3.0.9'
720 -PACKAGE_STRING='libffi 3.0.9'
721 -PACKAGE_BUGREPORT='http://gcc.gnu.org/bugs.html'
722 +PACKAGE_VERSION='3.0.10rc10'
723 +PACKAGE_STRING='libffi 3.0.10rc10'
724 +PACKAGE_BUGREPORT='http://sourceware.org/libffi.html'
725  PACKAGE_URL=''
726  
727  # Factoring default headers for most tests.
728 @@ -651,6 +651,8 @@ POWERPC_AIX_FALSE
729  POWERPC_AIX_TRUE
730  POWERPC_FALSE
731  POWERPC_TRUE
732 +MOXIE_FALSE
733 +MOXIE_TRUE
734  M68K_FALSE
735  M68K_TRUE
736  M32R_FALSE
737 @@ -758,7 +760,6 @@ build_os
738  build_vendor
739  build_cpu
740  build
741 -multi_basedir
742  target_alias
743  host_alias
744  build_alias
745 @@ -800,7 +801,6 @@ SHELL'
746  ac_subst_files=''
747  ac_user_opts='
748  enable_option_checking
749 -enable_multilib
750  enable_dependency_tracking
751  enable_shared
752  enable_static
753 @@ -1364,7 +1364,7 @@ if test "$ac_init_help" = "long"; then
754    # Omit some internal or obsolete options to make the list less imposing.
755    # This message is too long to be a string in the A/UX 3.1 sh.
756    cat <<_ACEOF
757 -\`configure' configures libffi 3.0.9 to adapt to many kinds of systems.
758 +\`configure' configures libffi 3.0.10rc10 to adapt to many kinds of systems.
759  
760  Usage: $0 [OPTION]... [VAR=VALUE]...
761  
762 @@ -1435,7 +1435,7 @@ fi
763  
764  if test -n "$ac_init_help"; then
765    case $ac_init_help in
766 -     short | recursive ) echo "Configuration of libffi 3.0.9:";;
767 +     short | recursive ) echo "Configuration of libffi 3.0.10rc10:";;
768     esac
769    cat <<\_ACEOF
770  
771 @@ -1443,7 +1443,6 @@ Optional Features:
772    --disable-option-checking  ignore unrecognized --enable/--with options
773    --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
774    --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
775 -  --enable-multilib       build many library versions (default)
776    --disable-dependency-tracking  speeds up one-time build
777    --enable-dependency-tracking   do not reject slow dependency extractors
778    --enable-shared[=PKGS]  build shared libraries [default=yes]
779 @@ -1482,7 +1481,7 @@ Some influential environment variables:
780  Use these variables to override the choices made by `configure' or to help
781  it to find libraries and programs with nonstandard names/locations.
782  
783 -Report bugs to <http://gcc.gnu.org/bugs.html>.
784 +Report bugs to <http://sourceware.org/libffi.html>.
785  _ACEOF
786  ac_status=$?
787  fi
788 @@ -1545,7 +1544,7 @@ fi
789  test -n "$ac_init_help" && exit $ac_status
790  if $ac_init_version; then
791    cat <<\_ACEOF
792 -libffi configure 3.0.9
793 +libffi configure 3.0.10rc10
794  generated by GNU Autoconf 2.68
795  
796  Copyright (C) 2010 Free Software Foundation, Inc.
797 @@ -1890,9 +1889,9 @@ $as_echo "$as_me: WARNING: $2: see the A
798  $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
799      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
800  $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
801 -( $as_echo "## ------------------------------------------- ##
802 -## Report this to http://gcc.gnu.org/bugs.html ##
803 -## ------------------------------------------- ##"
804 +( $as_echo "## ------------------------------------------------ ##
805 +## Report this to http://sourceware.org/libffi.html ##
806 +## ------------------------------------------------ ##"
807       ) | sed "s/^/$as_me: WARNING:     /" >&2
808      ;;
809  esac
810 @@ -2146,7 +2145,7 @@ cat >config.log <<_ACEOF
811  This file contains any messages produced by compilers while
812  running configure, to aid debugging if configure makes a mistake.
813  
814 -It was created by libffi $as_me 3.0.9, which was
815 +It was created by libffi $as_me 3.0.10rc10, which was
816  generated by GNU Autoconf 2.68.  Invocation command line was
817  
818    $ $0 $@
819 @@ -2497,44 +2496,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
820  ac_config_headers="$ac_config_headers fficonfig.h"
821  
822  
823 -# Default to --enable-multilib
824 -# Check whether --enable-multilib was given.
825 -if test "${enable_multilib+set}" = set; then :
826 -  enableval=$enable_multilib; case "$enableval" in
827 -  yes) multilib=yes ;;
828 -  no)  multilib=no ;;
829 -  *)   as_fn_error $? "bad value $enableval for multilib option" "$LINENO" 5 ;;
830 - esac
831 -else
832 -  multilib=yes
833 -fi
834 -
835 -
836 -# We may get other options which we leave undocumented:
837 -# --with-target-subdir, --with-multisrctop, --with-multisubdir
838 -# See config-ml.in if you want the gory details.
839 -
840 -if test "$srcdir" = "."; then
841 -  if test "$with_target_subdir" != "."; then
842 -    multi_basedir="$srcdir/$with_multisrctop../.."
843 -  else
844 -    multi_basedir="$srcdir/$with_multisrctop.."
845 -  fi
846 -else
847 -  multi_basedir="$srcdir/.."
848 -fi
849 -
850 -
851 -# Even if the default multilib is not a cross compilation,
852 -# it may be that some of the other multilibs are.
853 -if test $cross_compiling = no && test $multilib = yes \
854 -   && test "x${with_multisubdir}" != x ; then
855 -   cross_compiling=maybe
856 -fi
857 -
858 -ac_config_commands="$ac_config_commands default-1"
859 -
860 -
861  ac_aux_dir=
862  for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
863    if test -f "$ac_dir/install-sh"; then
864 @@ -3117,7 +3078,7 @@ fi
865  
866  # Define the identity of the package.
867   PACKAGE='libffi'
868 - VERSION='3.0.9'
869 + VERSION='3.0.10rc10'
870  
871  
872  cat >>confdefs.h <<_ACEOF
873 @@ -4148,6 +4109,7 @@ fi
874  
875  
876  
877 +
878  # By default we simply use the C compiler to build assembly code.
879  
880  test "${CCAS+set}" = set || CCAS=$CC
881 @@ -8326,6 +8288,10 @@ _lt_linker_boilerplate=`cat conftest.err
882  $RM -r conftest*
883  
884  
885 +## CAVEAT EMPTOR:
886 +## There is no encapsulation within the following macros, do not change
887 +## the running order or otherwise move them around unless you know exactly
888 +## what you are doing...
889  if test -n "$compiler"; then
890  
891  lt_prog_compiler_no_builtin_flag=
892 @@ -10876,14 +10842,10 @@ fi
893    # before this can be enabled.
894    hardcode_into_libs=yes
895  
896 -  # Add ABI-specific directories to the system library path.
897 -  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
898 -
899    # Append ld.so.conf contents to the search path
900    if test -f /etc/ld.so.conf; then
901      lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
902 -    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
903 -
904 +    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
905    fi
906  
907    # We used to test for /lib/ld.so.1 and disable shared libraries on
908 @@ -11865,6 +11827,7 @@ CC="$lt_save_CC"
909  
910  
911  
912 +
913  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
914  $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
915      # Check whether --enable-maintainer-mode was given.
916 @@ -12076,6 +12039,10 @@ case "$host" in
917  
918    amd64-*-freebsd* | amd64-*-openbsd*)
919         TARGET=X86_64; TARGETDIR=x86
920 +       ;;
921 +
922 +  amd64-*-freebsd*)
923 +       TARGET=X86_64; TARGETDIR=x86
924         ;;
925  
926    avr32*-*-*)
927 @@ -12291,6 +12258,14 @@ else
928    M68K_FALSE=
929  fi
930  
931 + if test x$TARGET = xMOXIE; then
932 +  MOXIE_TRUE=
933 +  MOXIE_FALSE='#'
934 +else
935 +  MOXIE_TRUE='#'
936 +  MOXIE_FALSE=
937 +fi
938 +
939   if test x$TARGET = xPOWERPC; then
940    POWERPC_TRUE=
941    POWERPC_FALSE='#'
942 @@ -13386,21 +13361,25 @@ $as_echo "#define USING_PURIFY 1" >>conf
943  fi
944  
945  
946 -if test -n "$with_cross_host" &&
947 -   test x"$with_cross_host" != x"no"; then
948 -  toolexecdir='$(exec_prefix)/$(target_alias)'
949 -  toolexeclibdir='$(toolexecdir)/lib'
950 -else
951 -  toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
952 -  toolexeclibdir='$(libdir)'
953 -fi
954 -multi_os_directory=`$CC -print-multi-os-directory`
955 -case $multi_os_directory in
956 -  .) ;; # Avoid trailing /.
957 -  *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
958 -esac
959 +# These variables are only ever used when we cross-build to X86_WIN32.
960 +# And we only support this with GCC, so...
961 +if test x"$GCC" != x"no"; then
962 +  if test -n "$with_cross_host" &&
963 +     test x"$with_cross_host" != x"no"; then
964 +    toolexecdir='$(exec_prefix)/$(target_alias)'
965 +    toolexeclibdir='$(toolexecdir)/lib'
966 +  else
967 +    toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
968 +    toolexeclibdir='$(libdir)'
969 +  fi
970 +  multi_os_directory=`$CC -print-multi-os-directory`
971 +  case $multi_os_directory in
972 +    .) ;; # Avoid trailing /.
973 +    *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
974 +  esac
975  
976  
977 +fi
978  
979  if test "${multilib}" = "yes"; then
980    multilib_arg="--enable-multilib"
981 @@ -13416,7 +13395,7 @@ ac_config_commands="$ac_config_commands 
982  ac_config_links="$ac_config_links include/ffitarget.h:src/$TARGETDIR/ffitarget.h"
983  
984  
985 -ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile"
986 +ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc"
987  
988  
989  cat >confcache <<\_ACEOF
990 @@ -13600,6 +13579,10 @@ if test -z "${M68K_TRUE}" && test -z "${
991    as_fn_error $? "conditional \"M68K\" was never defined.
992  Usually this means the macro was only invoked conditionally." "$LINENO" 5
993  fi
994 +if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then
995 +  as_fn_error $? "conditional \"MOXIE\" was never defined.
996 +Usually this means the macro was only invoked conditionally." "$LINENO" 5
997 +fi
998  if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then
999    as_fn_error $? "conditional \"POWERPC\" was never defined.
1000  Usually this means the macro was only invoked conditionally." "$LINENO" 5
1001 @@ -14070,7 +14053,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
1002  # report actual input values of CONFIG_FILES etc. instead of their
1003  # values after options handling.
1004  ac_log="
1005 -This file was extended by libffi $as_me 3.0.9, which was
1006 +This file was extended by libffi $as_me 3.0.10rc10, which was
1007  generated by GNU Autoconf 2.68.  Invocation command line was
1008  
1009    CONFIG_FILES    = $CONFIG_FILES
1010 @@ -14134,13 +14117,13 @@ $config_links
1011  Configuration commands:
1012  $config_commands
1013  
1014 -Report bugs to <http://gcc.gnu.org/bugs.html>."
1015 +Report bugs to <http://sourceware.org/libffi.html>."
1016  
1017  _ACEOF
1018  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
1019  ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
1020  ac_cs_version="\\
1021 -libffi config.status 3.0.9
1022 +libffi config.status 3.0.10rc10
1023  configured by $0, generated by GNU Autoconf 2.68,
1024    with options \\"\$ac_cs_config\\"
1025  
1026 @@ -14259,17 +14242,6 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
1027  #
1028  # INIT-COMMANDS
1029  #
1030 -
1031 -srcdir="$srcdir"
1032 -host="$host"
1033 -target="$target"
1034 -with_multisubdir="$with_multisubdir"
1035 -with_multisrctop="$with_multisrctop"
1036 -with_target_subdir="$with_target_subdir"
1037 -ac_configure_args="${multilib_arg} ${ac_configure_args}"
1038 -multi_basedir="$multi_basedir"
1039 -CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
1040 -CC="$CC"
1041  AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
1042  
1043  
1044 @@ -14559,7 +14531,6 @@ for ac_config_target in $ac_config_targe
1045  do
1046    case $ac_config_target in
1047      "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;;
1048 -    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
1049      "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
1050      "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
1051      "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;;
1052 @@ -14570,6 +14541,7 @@ do
1053      "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
1054      "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;;
1055      "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;;
1056 +    "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;;
1057  
1058    *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
1059    esac
1060 @@ -15197,14 +15169,6 @@ $as_echo "$as_me: executing $ac_file com
1061  
1062  
1063    case $ac_file$ac_mode in
1064 -    "default-1":C)
1065 -# Only add multilib support code if we just rebuilt the top-level
1066 -# Makefile.
1067 -case " $CONFIG_FILES " in
1068 - *" Makefile "*)
1069 -   ac_file=Makefile . ${multi_basedir}/config-ml.in
1070 -   ;;
1071 -esac ;;
1072      "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
1073    # Autoconf 2.62 quotes --file arguments for eval, but not when files
1074    # are listed without --file.  Let's play safe and only enable the eval
1075 Index: libffi/configure.ac
1076 ===================================================================
1077 --- libffi.orig/configure.ac
1078 +++ libffi/configure.ac
1079 @@ -1,12 +1,10 @@
1080  dnl Process this with autoconf to create configure
1081  
1082 -AC_PREREQ(2.64)
1083 +AC_PREREQ(2.63)
1084  
1085 -AC_INIT([libffi], [3.0.9], [http://gcc.gnu.org/bugs.html])
1086 +AC_INIT([libffi], [3.0.10rc10], [http://sourceware.org/libffi.html])
1087  AC_CONFIG_HEADERS([fficonfig.h])
1088  
1089 -AM_ENABLE_MULTILIB(, ..)
1090 -
1091  AC_CANONICAL_SYSTEM
1092  target_alias=${target_alias-$host_alias}
1093  
1094 @@ -22,13 +20,15 @@ AM_INIT_AUTOMAKE
1095  m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
1096  m4_define([_AC_ARG_VAR_PRECIOUS],[])
1097  AC_PROG_CC
1098 -m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
1099 +m4_undefine([_AC_ARG_VAR_PRECIOUS])
1100 +m4_rename([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
1101  
1102  AC_SUBST(CFLAGS)
1103  
1104  AM_PROG_AS
1105  AM_PROG_CC_C_O
1106  AC_PROG_LIBTOOL
1107 +AC_CONFIG_MACRO_DIR([m4])
1108  
1109  AM_MAINTAINER_MODE
1110  
1111 @@ -53,6 +53,10 @@ case "$host" in
1112  
1113    amd64-*-freebsd* | amd64-*-openbsd*)
1114         TARGET=X86_64; TARGETDIR=x86
1115 +       ;;
1116 +
1117 +  amd64-*-freebsd*)
1118 +       TARGET=X86_64; TARGETDIR=x86
1119         ;;
1120  
1121    avr32*-*-*)
1122 @@ -191,6 +195,7 @@ AM_CONDITIONAL(ALPHA, test x$TARGET = xA
1123  AM_CONDITIONAL(IA64, test x$TARGET = xIA64)
1124  AM_CONDITIONAL(M32R, test x$TARGET = xM32R)
1125  AM_CONDITIONAL(M68K, test x$TARGET = xM68K)
1126 +AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE)
1127  AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
1128  AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
1129  AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
1130 @@ -420,21 +425,25 @@ AC_ARG_ENABLE(purify-safety,
1131      AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.])
1132    fi)
1133  
1134 -if test -n "$with_cross_host" &&
1135 -   test x"$with_cross_host" != x"no"; then
1136 -  toolexecdir='$(exec_prefix)/$(target_alias)'
1137 -  toolexeclibdir='$(toolexecdir)/lib'
1138 -else
1139 -  toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
1140 -  toolexeclibdir='$(libdir)'
1141 +# These variables are only ever used when we cross-build to X86_WIN32.
1142 +# And we only support this with GCC, so...
1143 +if test x"$GCC" != x"no"; then
1144 +  if test -n "$with_cross_host" &&
1145 +     test x"$with_cross_host" != x"no"; then
1146 +    toolexecdir='$(exec_prefix)/$(target_alias)'
1147 +    toolexeclibdir='$(toolexecdir)/lib'
1148 +  else
1149 +    toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
1150 +    toolexeclibdir='$(libdir)'
1151 +  fi
1152 +  multi_os_directory=`$CC -print-multi-os-directory`
1153 +  case $multi_os_directory in
1154 +    .) ;; # Avoid trailing /.
1155 +    *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
1156 +  esac
1157 +  AC_SUBST(toolexecdir)
1158 +  AC_SUBST(toolexeclibdir)
1159  fi
1160 -multi_os_directory=`$CC -print-multi-os-directory`
1161 -case $multi_os_directory in
1162 -  .) ;; # Avoid trailing /.
1163 -  *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
1164 -esac
1165 -AC_SUBST(toolexecdir)
1166 -AC_SUBST(toolexeclibdir)
1167  
1168  if test "${multilib}" = "yes"; then
1169    multilib_arg="--enable-multilib"
1170 @@ -450,6 +459,6 @@ test -d src/$TARGETDIR || mkdir src/$TAR
1171  
1172  AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h)
1173  
1174 -AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile)
1175 +AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc)
1176  
1177  AC_OUTPUT
1178 Index: libffi/libffi.pc.in
1179 ===================================================================
1180 --- /dev/null
1181 +++ libffi/libffi.pc.in
1182 @@ -0,0 +1,10 @@
1183 +prefix=@prefix@
1184 +exec_prefix=@exec_prefix@
1185 +libdir=@libdir@
1186 +includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
1187 +
1188 +Name: @PACKAGE_NAME@
1189 +Description: Library supporting Foreign Function Interfaces
1190 +Version: @PACKAGE_VERSION@
1191 +Libs: -L${libdir} -lffi
1192 +Cflags: -I${includedir}
1193 Index: libffi/libtool-version
1194 ===================================================================
1195 --- libffi.orig/libtool-version
1196 +++ libffi/libtool-version
1197 @@ -2,5 +2,28 @@
1198  # the libtool manual to understand the meaning of the fields.  This is
1199  # a separate file so that version updates don't involve re-running
1200  # automake.
1201 +#
1202 +# Here are a set of rules to help you update your library version
1203 +# information:
1204 +# 
1205 +# 1. Start with version information of `0:0:0' for each libtool library.
1206 +#
1207 +# 2. Update the version information only immediately before a public
1208 +#    release of your software. More frequent updates are unnecessary,
1209 +#    and only guarantee that the current interface number gets larger
1210 +#    faster.
1211 +#
1212 +# 3. If the library source code has changed at all since the last
1213 +#    update, then increment revision (`c:r:a' becomes `c:r+1:a').
1214 +#
1215 +# 4. If any interfaces have been added, removed, or changed since the
1216 +#    last update, increment current, and set revision to 0.
1217 +#
1218 +# 5. If any interfaces have been added since the last public release,
1219 +#    then increment age.
1220 +#
1221 +# 6. If any interfaces have been removed since the last public
1222 +#    release, then set age to 0.
1223 +#
1224  # CURRENT:REVISION:AGE
1225 -4:1:0
1226 +5:10:0
1227 Index: libffi/mdate-sh
1228 ===================================================================
1229 --- /dev/null
1230 +++ libffi/mdate-sh
1231 @@ -0,0 +1,201 @@
1232 +#!/bin/sh
1233 +# Get modification time of a file or directory and pretty-print it.
1234 +
1235 +scriptversion=2005-06-29.22
1236 +
1237 +# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software
1238 +# Foundation, Inc.
1239 +# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
1240 +#
1241 +# This program is free software; you can redistribute it and/or modify
1242 +# it under the terms of the GNU General Public License as published by
1243 +# the Free Software Foundation; either version 2, or (at your option)
1244 +# any later version.
1245 +#
1246 +# This program is distributed in the hope that it will be useful,
1247 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
1248 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1249 +# GNU General Public License for more details.
1250 +#
1251 +# You should have received a copy of the GNU General Public License
1252 +# along with this program; if not, write to the Free Software Foundation,
1253 +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1254 +
1255 +# As a special exception to the GNU General Public License, if you
1256 +# distribute this file as part of a program that contains a
1257 +# configuration script generated by Autoconf, you may include it under
1258 +# the same distribution terms that you use for the rest of that program.
1259 +
1260 +# This file is maintained in Automake, please report
1261 +# bugs to <bug-automake@gnu.org> or send patches to
1262 +# <automake-patches@gnu.org>.
1263 +
1264 +case $1 in
1265 +  '')
1266 +     echo "$0: No file.  Try \`$0 --help' for more information." 1>&2
1267 +     exit 1;
1268 +     ;;
1269 +  -h | --h*)
1270 +    cat <<\EOF
1271 +Usage: mdate-sh [--help] [--version] FILE
1272 +
1273 +Pretty-print the modification time of FILE.
1274 +
1275 +Report bugs to <bug-automake@gnu.org>.
1276 +EOF
1277 +    exit $?
1278 +    ;;
1279 +  -v | --v*)
1280 +    echo "mdate-sh $scriptversion"
1281 +    exit $?
1282 +    ;;
1283 +esac
1284 +
1285 +# Prevent date giving response in another language.
1286 +LANG=C
1287 +export LANG
1288 +LC_ALL=C
1289 +export LC_ALL
1290 +LC_TIME=C
1291 +export LC_TIME
1292 +
1293 +# GNU ls changes its time format in response to the TIME_STYLE
1294 +# variable.  Since we cannot assume `unset' works, revert this
1295 +# variable to its documented default.
1296 +if test "${TIME_STYLE+set}" = set; then
1297 +  TIME_STYLE=posix-long-iso
1298 +  export TIME_STYLE
1299 +fi
1300 +
1301 +save_arg1=$1
1302 +
1303 +# Find out how to get the extended ls output of a file or directory.
1304 +if ls -L /dev/null 1>/dev/null 2>&1; then
1305 +  ls_command='ls -L -l -d'
1306 +else
1307 +  ls_command='ls -l -d'
1308 +fi
1309 +
1310 +# A `ls -l' line looks as follows on OS/2.
1311 +#  drwxrwx---        0 Aug 11  2001 foo
1312 +# This differs from Unix, which adds ownership information.
1313 +#  drwxrwx---   2 root  root      4096 Aug 11  2001 foo
1314 +#
1315 +# To find the date, we split the line on spaces and iterate on words
1316 +# until we find a month.  This cannot work with files whose owner is a
1317 +# user named `Jan', or `Feb', etc.  However, it's unlikely that `/'
1318 +# will be owned by a user whose name is a month.  So we first look at
1319 +# the extended ls output of the root directory to decide how many
1320 +# words should be skipped to get the date.
1321 +
1322 +# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
1323 +set x`ls -l -d /`
1324 +
1325 +# Find which argument is the month.
1326 +month=
1327 +command=
1328 +until test $month
1329 +do
1330 +  shift
1331 +  # Add another shift to the command.
1332 +  command="$command shift;"
1333 +  case $1 in
1334 +    Jan) month=January; nummonth=1;;
1335 +    Feb) month=February; nummonth=2;;
1336 +    Mar) month=March; nummonth=3;;
1337 +    Apr) month=April; nummonth=4;;
1338 +    May) month=May; nummonth=5;;
1339 +    Jun) month=June; nummonth=6;;
1340 +    Jul) month=July; nummonth=7;;
1341 +    Aug) month=August; nummonth=8;;
1342 +    Sep) month=September; nummonth=9;;
1343 +    Oct) month=October; nummonth=10;;
1344 +    Nov) month=November; nummonth=11;;
1345 +    Dec) month=December; nummonth=12;;
1346 +  esac
1347 +done
1348 +
1349 +# Get the extended ls output of the file or directory.
1350 +set dummy x`eval "$ls_command \"\$save_arg1\""`
1351 +
1352 +# Remove all preceding arguments
1353 +eval $command
1354 +
1355 +# Because of the dummy argument above, month is in $2.
1356 +#
1357 +# On a POSIX system, we should have
1358 +#
1359 +# $# = 5
1360 +# $1 = file size
1361 +# $2 = month
1362 +# $3 = day
1363 +# $4 = year or time
1364 +# $5 = filename
1365 +#
1366 +# On Darwin 7.7.0 and 7.6.0, we have
1367 +#
1368 +# $# = 4
1369 +# $1 = day
1370 +# $2 = month
1371 +# $3 = year or time
1372 +# $4 = filename
1373 +
1374 +# Get the month.
1375 +case $2 in
1376 +  Jan) month=January; nummonth=1;;
1377 +  Feb) month=February; nummonth=2;;
1378 +  Mar) month=March; nummonth=3;;
1379 +  Apr) month=April; nummonth=4;;
1380 +  May) month=May; nummonth=5;;
1381 +  Jun) month=June; nummonth=6;;
1382 +  Jul) month=July; nummonth=7;;
1383 +  Aug) month=August; nummonth=8;;
1384 +  Sep) month=September; nummonth=9;;
1385 +  Oct) month=October; nummonth=10;;
1386 +  Nov) month=November; nummonth=11;;
1387 +  Dec) month=December; nummonth=12;;
1388 +esac
1389 +
1390 +case $3 in
1391 +  ???*) day=$1;;
1392 +  *) day=$3; shift;;
1393 +esac
1394 +
1395 +# Here we have to deal with the problem that the ls output gives either
1396 +# the time of day or the year.
1397 +case $3 in
1398 +  *:*) set `date`; eval year=\$$#
1399 +       case $2 in
1400 +        Jan) nummonthtod=1;;
1401 +        Feb) nummonthtod=2;;
1402 +        Mar) nummonthtod=3;;
1403 +        Apr) nummonthtod=4;;
1404 +        May) nummonthtod=5;;
1405 +        Jun) nummonthtod=6;;
1406 +        Jul) nummonthtod=7;;
1407 +        Aug) nummonthtod=8;;
1408 +        Sep) nummonthtod=9;;
1409 +        Oct) nummonthtod=10;;
1410 +        Nov) nummonthtod=11;;
1411 +        Dec) nummonthtod=12;;
1412 +       esac
1413 +       # For the first six month of the year the time notation can also
1414 +       # be used for files modified in the last year.
1415 +       if (expr $nummonth \> $nummonthtod) > /dev/null;
1416 +       then
1417 +        year=`expr $year - 1`
1418 +       fi;;
1419 +  *) year=$3;;
1420 +esac
1421 +
1422 +# The result.
1423 +echo $day $month $year
1424 +
1425 +# Local Variables:
1426 +# mode: shell-script
1427 +# sh-indentation: 2
1428 +# eval: (add-hook 'write-file-hooks 'time-stamp)
1429 +# time-stamp-start: "scriptversion="
1430 +# time-stamp-format: "%:y-%02m-%02d.%02H"
1431 +# time-stamp-end: "$"
1432 +# End:
1433 Index: libffi/texinfo.tex
1434 ===================================================================
1435 --- /dev/null
1436 +++ libffi/texinfo.tex
1437 @@ -0,0 +1,7210 @@
1438 +% texinfo.tex -- TeX macros to handle Texinfo files.
1439 +%
1440 +% Load plain if necessary, i.e., if running under initex.
1441 +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
1442 +%
1443 +\def\texinfoversion{2005-07-05.19}
1444 +%
1445 +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
1446 +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software
1447 +% Foundation, Inc.
1448 +%
1449 +% This texinfo.tex file is free software; you can redistribute it and/or
1450 +% modify it under the terms of the GNU General Public License as
1451 +% published by the Free Software Foundation; either version 2, or (at
1452 +% your option) any later version.
1453 +%
1454 +% This texinfo.tex file is distributed in the hope that it will be
1455 +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
1456 +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1457 +% General Public License for more details.
1458 +%
1459 +% You should have received a copy of the GNU General Public License
1460 +% along with this texinfo.tex file; see the file COPYING.  If not, write
1461 +% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
1462 +% Boston, MA 02110-1301, USA.
1463 +%
1464 +% As a special exception, when this file is read by TeX when processing
1465 +% a Texinfo source document, you may use the result without
1466 +% restriction.  (This has been our intent since Texinfo was invented.)
1467 +%
1468 +% Please try the latest version of texinfo.tex before submitting bug
1469 +% reports; you can get the latest version from:
1470 +%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
1471 +%   ftp://tug.org/tex/texinfo.tex
1472 +%     (and all CTAN mirrors, see http://www.ctan.org).
1473 +% The texinfo.tex in any given distribution could well be out
1474 +% of date, so if that's what you're using, please check.
1475 +%
1476 +% Send bug reports to bug-texinfo@gnu.org.  Please include including a
1477 +% complete document in each bug report with which we can reproduce the
1478 +% problem.  Patches are, of course, greatly appreciated.
1479 +%
1480 +% To process a Texinfo manual with TeX, it's most reliable to use the
1481 +% texi2dvi shell script that comes with the distribution.  For a simple
1482 +% manual foo.texi, however, you can get away with this:
1483 +%   tex foo.texi
1484 +%   texindex foo.??
1485 +%   tex foo.texi
1486 +%   tex foo.texi
1487 +%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
1488 +% The extra TeX runs get the cross-reference information correct.
1489 +% Sometimes one run after texindex suffices, and sometimes you need more
1490 +% than two; texi2dvi does it as many times as necessary.
1491 +%
1492 +% It is possible to adapt texinfo.tex for other languages, to some
1493 +% extent.  You can get the existing language-specific files from the
1494 +% full Texinfo distribution.
1495 +%
1496 +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
1497 +
1498 +
1499 +\message{Loading texinfo [version \texinfoversion]:}
1500 +
1501 +% If in a .fmt file, print the version number
1502 +% and turn on active characters that we couldn't do earlier because
1503 +% they might have appeared in the input file name.
1504 +\everyjob{\message{[Texinfo version \texinfoversion]}%
1505 +  \catcode`+=\active \catcode`\_=\active}
1506 +
1507 +\message{Basics,}
1508 +\chardef\other=12
1509 +
1510 +% We never want plain's \outer definition of \+ in Texinfo.
1511 +% For @tex, we can use \tabalign.
1512 +\let\+ = \relax
1513 +
1514 +% Save some plain tex macros whose names we will redefine.
1515 +\let\ptexb=\b
1516 +\let\ptexbullet=\bullet
1517 +\let\ptexc=\c
1518 +\let\ptexcomma=\,
1519 +\let\ptexdot=\.
1520 +\let\ptexdots=\dots
1521 +\let\ptexend=\end
1522 +\let\ptexequiv=\equiv
1523 +\let\ptexexclam=\!
1524 +\let\ptexfootnote=\footnote
1525 +\let\ptexgtr=>
1526 +\let\ptexhat=^
1527 +\let\ptexi=\i
1528 +\let\ptexindent=\indent
1529 +\let\ptexinsert=\insert
1530 +\let\ptexlbrace=\{
1531 +\let\ptexless=<
1532 +\let\ptexnewwrite\newwrite
1533 +\let\ptexnoindent=\noindent
1534 +\let\ptexplus=+
1535 +\let\ptexrbrace=\}
1536 +\let\ptexslash=\/
1537 +\let\ptexstar=\*
1538 +\let\ptext=\t
1539 +
1540 +% If this character appears in an error message or help string, it
1541 +% starts a new line in the output.
1542 +\newlinechar = `^^J
1543 +
1544 +% Use TeX 3.0's \inputlineno to get the line number, for better error
1545 +% messages, but if we're using an old version of TeX, don't do anything.
1546 +%
1547 +\ifx\inputlineno\thisisundefined
1548 +  \let\linenumber = \empty % Pre-3.0.
1549 +\else
1550 +  \def\linenumber{l.\the\inputlineno:\space}
1551 +\fi
1552 +
1553 +% Set up fixed words for English if not already set.
1554 +\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
1555 +\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
1556 +\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
1557 +\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
1558 +\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
1559 +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
1560 +\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
1561 +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
1562 +\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
1563 +\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
1564 +\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
1565 +\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
1566 +\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
1567 +\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
1568 +\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
1569 +\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
1570 +\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
1571 +\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
1572 +\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
1573 +%
1574 +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
1575 +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
1576 +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
1577 +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
1578 +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
1579 +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
1580 +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
1581 +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
1582 +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
1583 +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
1584 +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
1585 +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
1586 +%
1587 +\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
1588 +\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
1589 +\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
1590 +\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
1591 +\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
1592 +
1593 +% In some macros, we cannot use the `\? notation---the left quote is
1594 +% in some cases the escape char.
1595 +\chardef\backChar  = `\\
1596 +\chardef\colonChar = `\:
1597 +\chardef\commaChar = `\,
1598 +\chardef\dotChar   = `\.
1599 +\chardef\exclamChar= `\!
1600 +\chardef\plusChar  = `\+
1601 +\chardef\questChar = `\?
1602 +\chardef\semiChar  = `\;
1603 +\chardef\underChar = `\_
1604 +
1605 +\chardef\spaceChar = `\ %
1606 +\chardef\spacecat = 10
1607 +\def\spaceisspace{\catcode\spaceChar=\spacecat}
1608 +
1609 +{% for help with debugging.
1610 + % example usage: \expandafter\show\activebackslash
1611 + \catcode`\! = 0 \catcode`\\ = \active
1612 + !global!def!activebackslash{\}
1613 +}
1614 +
1615 +% Ignore a token.
1616 +%
1617 +\def\gobble#1{}
1618 +
1619 +% The following is used inside several \edef's.
1620 +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
1621 +
1622 +% Hyphenation fixes.
1623 +\hyphenation{
1624 +  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
1625 +  ap-pen-dix bit-map bit-maps
1626 +  data-base data-bases eshell fall-ing half-way long-est man-u-script
1627 +  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
1628 +  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
1629 +  spell-ing spell-ings
1630 +  stand-alone strong-est time-stamp time-stamps which-ever white-space
1631 +  wide-spread wrap-around
1632 +}
1633 +
1634 +% Margin to add to right of even pages, to left of odd pages.
1635 +\newdimen\bindingoffset
1636 +\newdimen\normaloffset
1637 +\newdimen\pagewidth \newdimen\pageheight
1638 +
1639 +% For a final copy, take out the rectangles
1640 +% that mark overfull boxes (in case you have decided
1641 +% that the text looks ok even though it passes the margin).
1642 +%
1643 +\def\finalout{\overfullrule=0pt}
1644 +
1645 +% @| inserts a changebar to the left of the current line.  It should
1646 +% surround any changed text.  This approach does *not* work if the
1647 +% change spans more than two lines of output.  To handle that, we would
1648 +% have adopt a much more difficult approach (putting marks into the main
1649 +% vertical list for the beginning and end of each change).
1650 +%
1651 +\def\|{%
1652 +  % \vadjust can only be used in horizontal mode.
1653 +  \leavevmode
1654 +  %
1655 +  % Append this vertical mode material after the current line in the output.
1656 +  \vadjust{%
1657 +    % We want to insert a rule with the height and depth of the current
1658 +    % leading; that is exactly what \strutbox is supposed to record.
1659 +    \vskip-\baselineskip
1660 +    %
1661 +    % \vadjust-items are inserted at the left edge of the type.  So
1662 +    % the \llap here moves out into the left-hand margin.
1663 +    \llap{%
1664 +      %
1665 +      % For a thicker or thinner bar, change the `1pt'.
1666 +      \vrule height\baselineskip width1pt
1667 +      %
1668 +      % This is the space between the bar and the text.
1669 +      \hskip 12pt
1670 +    }%
1671 +  }%
1672 +}
1673 +
1674 +% Sometimes it is convenient to have everything in the transcript file
1675 +% and nothing on the terminal.  We don't just call \tracingall here,
1676 +% since that produces some useless output on the terminal.  We also make
1677 +% some effort to order the tracing commands to reduce output in the log
1678 +% file; cf. trace.sty in LaTeX.
1679 +%
1680 +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
1681 +\def\loggingall{%
1682 +  \tracingstats2
1683 +  \tracingpages1
1684 +  \tracinglostchars2  % 2 gives us more in etex
1685 +  \tracingparagraphs1
1686 +  \tracingoutput1
1687 +  \tracingmacros2
1688 +  \tracingrestores1
1689 +  \showboxbreadth\maxdimen \showboxdepth\maxdimen
1690 +  \ifx\eTeXversion\undefined\else % etex gives us more logging
1691 +    \tracingscantokens1
1692 +    \tracingifs1
1693 +    \tracinggroups1
1694 +    \tracingnesting2
1695 +    \tracingassigns1
1696 +  \fi
1697 +  \tracingcommands3  % 3 gives us more in etex
1698 +  \errorcontextlines16
1699 +}%
1700 +
1701 +% add check for \lastpenalty to plain's definitions.  If the last thing
1702 +% we did was a \nobreak, we don't want to insert more space.
1703 +%
1704 +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
1705 +  \removelastskip\penalty-50\smallskip\fi\fi}
1706 +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
1707 +  \removelastskip\penalty-100\medskip\fi\fi}
1708 +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
1709 +  \removelastskip\penalty-200\bigskip\fi\fi}
1710 +
1711 +% For @cropmarks command.
1712 +% Do @cropmarks to get crop marks.
1713 +%
1714 +\newif\ifcropmarks
1715 +\let\cropmarks = \cropmarkstrue
1716 +%
1717 +% Dimensions to add cropmarks at corners.
1718 +% Added by P. A. MacKay, 12 Nov. 1986
1719 +%
1720 +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
1721 +\newdimen\cornerlong  \cornerlong=1pc
1722 +\newdimen\cornerthick \cornerthick=.3pt
1723 +\newdimen\topandbottommargin \topandbottommargin=.75in
1724 +
1725 +% Main output routine.
1726 +\chardef\PAGE = 255
1727 +\output = {\onepageout{\pagecontents\PAGE}}
1728 +
1729 +\newbox\headlinebox
1730 +\newbox\footlinebox
1731 +
1732 +% \onepageout takes a vbox as an argument.  Note that \pagecontents
1733 +% does insertions, but you have to call it yourself.
1734 +\def\onepageout#1{%
1735 +  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
1736 +  %
1737 +  \ifodd\pageno  \advance\hoffset by \bindingoffset
1738 +  \else \advance\hoffset by -\bindingoffset\fi
1739 +  %
1740 +  % Do this outside of the \shipout so @code etc. will be expanded in
1741 +  % the headline as they should be, not taken literally (outputting ''code).
1742 +  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
1743 +  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
1744 +  %
1745 +  {%
1746 +    % Have to do this stuff outside the \shipout because we want it to
1747 +    % take effect in \write's, yet the group defined by the \vbox ends
1748 +    % before the \shipout runs.
1749 +    %
1750 +    \indexdummies         % don't expand commands in the output.
1751 +    \shipout\vbox{%
1752 +      % Do this early so pdf references go to the beginning of the page.
1753 +      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
1754 +      %
1755 +      \ifcropmarks \vbox to \outervsize\bgroup
1756 +        \hsize = \outerhsize
1757 +        \vskip-\topandbottommargin
1758 +        \vtop to0pt{%
1759 +          \line{\ewtop\hfil\ewtop}%
1760 +          \nointerlineskip
1761 +          \line{%
1762 +            \vbox{\moveleft\cornerthick\nstop}%
1763 +            \hfill
1764 +            \vbox{\moveright\cornerthick\nstop}%
1765 +          }%
1766 +          \vss}%
1767 +        \vskip\topandbottommargin
1768 +        \line\bgroup
1769 +          \hfil % center the page within the outer (page) hsize.
1770 +          \ifodd\pageno\hskip\bindingoffset\fi
1771 +          \vbox\bgroup
1772 +      \fi
1773 +      %
1774 +      \unvbox\headlinebox
1775 +      \pagebody{#1}%
1776 +      \ifdim\ht\footlinebox > 0pt
1777 +        % Only leave this space if the footline is nonempty.
1778 +        % (We lessened \vsize for it in \oddfootingxxx.)
1779 +        % The \baselineskip=24pt in plain's \makefootline has no effect.
1780 +        \vskip 2\baselineskip
1781 +        \unvbox\footlinebox
1782 +      \fi
1783 +      %
1784 +      \ifcropmarks
1785 +          \egroup % end of \vbox\bgroup
1786 +        \hfil\egroup % end of (centering) \line\bgroup
1787 +        \vskip\topandbottommargin plus1fill minus1fill
1788 +        \boxmaxdepth = \cornerthick
1789 +        \vbox to0pt{\vss
1790 +          \line{%
1791 +            \vbox{\moveleft\cornerthick\nsbot}%
1792 +            \hfill
1793 +            \vbox{\moveright\cornerthick\nsbot}%
1794 +          }%
1795 +          \nointerlineskip
1796 +          \line{\ewbot\hfil\ewbot}%
1797 +        }%
1798 +      \egroup % \vbox from first cropmarks clause
1799 +      \fi
1800 +    }% end of \shipout\vbox
1801 +  }% end of group with \indexdummies
1802 +  \advancepageno
1803 +  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
1804 +}
1805 +
1806 +\newinsert\margin \dimen\margin=\maxdimen
1807 +
1808 +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
1809 +{\catcode`\@ =11
1810 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
1811 +% marginal hacks, juha@viisa.uucp (Juha Takala)
1812 +\ifvoid\margin\else % marginal info is present
1813 +  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
1814 +\dimen@=\dp#1 \unvbox#1
1815 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
1816 +\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
1817 +}
1818 +
1819 +% Here are the rules for the cropmarks.  Note that they are
1820 +% offset so that the space between them is truly \outerhsize or \outervsize
1821 +% (P. A. MacKay, 12 November, 1986)
1822 +%
1823 +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
1824 +\def\nstop{\vbox
1825 +  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
1826 +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
1827 +\def\nsbot{\vbox
1828 +  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
1829 +
1830 +% Parse an argument, then pass it to #1.  The argument is the rest of
1831 +% the input line (except we remove a trailing comment).  #1 should be a
1832 +% macro which expects an ordinary undelimited TeX argument.
1833 +%
1834 +\def\parsearg{\parseargusing{}}
1835 +\def\parseargusing#1#2{%
1836 +  \def\next{#2}%
1837 +  \begingroup
1838 +    \obeylines
1839 +    \spaceisspace
1840 +    #1%
1841 +    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
1842 +}
1843 +
1844 +{\obeylines %
1845 +  \gdef\parseargline#1^^M{%
1846 +    \endgroup % End of the group started in \parsearg.
1847 +    \argremovecomment #1\comment\ArgTerm%
1848 +  }%
1849 +}
1850 +
1851 +% First remove any @comment, then any @c comment.
1852 +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
1853 +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
1854 +
1855 +% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
1856 +%
1857 +% \argremovec might leave us with trailing space, e.g.,
1858 +%    @end itemize  @c foo
1859 +% This space token undergoes the same procedure and is eventually removed
1860 +% by \finishparsearg.
1861 +%
1862 +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
1863 +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
1864 +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
1865 +  \def\temp{#3}%
1866 +  \ifx\temp\empty
1867 +    % We cannot use \next here, as it holds the macro to run;
1868 +    % thus we reuse \temp.
1869 +    \let\temp\finishparsearg
1870 +  \else
1871 +    \let\temp\argcheckspaces
1872 +  \fi
1873 +  % Put the space token in:
1874 +  \temp#1 #3\ArgTerm
1875 +}
1876 +
1877 +% If a _delimited_ argument is enclosed in braces, they get stripped; so
1878 +% to get _exactly_ the rest of the line, we had to prevent such situation.
1879 +% We prepended an \empty token at the very beginning and we expand it now,
1880 +% just before passing the control to \next.
1881 +% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
1882 +% either the null string, or it ends with \^^M---thus there is no danger
1883 +% that a pair of braces would be stripped.
1884 +%
1885 +% But first, we have to remove the trailing space token.
1886 +%
1887 +\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
1888 +
1889 +% \parseargdef\foo{...}
1890 +%      is roughly equivalent to
1891 +% \def\foo{\parsearg\Xfoo}
1892 +% \def\Xfoo#1{...}
1893 +%
1894 +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
1895 +% favourite TeX trick.  --kasal, 16nov03
1896 +
1897 +\def\parseargdef#1{%
1898 +  \expandafter \doparseargdef \csname\string#1\endcsname #1%
1899 +}
1900 +\def\doparseargdef#1#2{%
1901 +  \def#2{\parsearg#1}%
1902 +  \def#1##1%
1903 +}
1904 +
1905 +% Several utility definitions with active space:
1906 +{
1907 +  \obeyspaces
1908 +  \gdef\obeyedspace{ }
1909 +
1910 +  % Make each space character in the input produce a normal interword
1911 +  % space in the output.  Don't allow a line break at this space, as this
1912 +  % is used only in environments like @example, where each line of input
1913 +  % should produce a line of output anyway.
1914 +  %
1915 +  \gdef\sepspaces{\obeyspaces\let =\tie}
1916 +
1917 +  % If an index command is used in an @example environment, any spaces
1918 +  % therein should become regular spaces in the raw index file, not the
1919 +  % expansion of \tie (\leavevmode \penalty \@M \ ).
1920 +  \gdef\unsepspaces{\let =\space}
1921 +}
1922 +
1923 +
1924 +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
1925 +
1926 +% Define the framework for environments in texinfo.tex.  It's used like this:
1927 +%
1928 +%   \envdef\foo{...}
1929 +%   \def\Efoo{...}
1930 +%
1931 +% It's the responsibility of \envdef to insert \begingroup before the
1932 +% actual body; @end closes the group after calling \Efoo.  \envdef also
1933 +% defines \thisenv, so the current environment is known; @end checks
1934 +% whether the environment name matches.  The \checkenv macro can also be
1935 +% used to check whether the current environment is the one expected.
1936 +%
1937 +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
1938 +% are not treated as enviroments; they don't open a group.  (The
1939 +% implementation of @end takes care not to call \endgroup in this
1940 +% special case.)
1941 +
1942 +
1943 +% At runtime, environments start with this:
1944 +\def\startenvironment#1{\begingroup\def\thisenv{#1}}
1945 +% initialize
1946 +\let\thisenv\empty
1947 +
1948 +% ... but they get defined via ``\envdef\foo{...}'':
1949 +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
1950 +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
1951 +
1952 +% Check whether we're in the right environment:
1953 +\def\checkenv#1{%
1954 +  \def\temp{#1}%
1955 +  \ifx\thisenv\temp
1956 +  \else
1957 +    \badenverr
1958 +  \fi
1959 +}
1960 +
1961 +% Evironment mismatch, #1 expected:
1962 +\def\badenverr{%
1963 +  \errhelp = \EMsimple
1964 +  \errmessage{This command can appear only \inenvironment\temp,
1965 +    not \inenvironment\thisenv}%
1966 +}
1967 +\def\inenvironment#1{%
1968 +  \ifx#1\empty
1969 +    out of any environment%
1970 +  \else
1971 +    in environment \expandafter\string#1%
1972 +  \fi
1973 +}
1974 +
1975 +% @end foo executes the definition of \Efoo.
1976 +% But first, it executes a specialized version of \checkenv
1977 +%
1978 +\parseargdef\end{%
1979 +  \if 1\csname iscond.#1\endcsname
1980 +  \else
1981 +    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
1982 +    \expandafter\checkenv\csname#1\endcsname
1983 +    \csname E#1\endcsname
1984 +    \endgroup
1985 +  \fi
1986 +}
1987 +
1988 +\newhelp\EMsimple{Press RETURN to continue.}
1989 +
1990 +
1991 +%% Simple single-character @ commands
1992 +
1993 +% @@ prints an @
1994 +% Kludge this until the fonts are right (grr).
1995 +\def\@{{\tt\char64}}
1996 +
1997 +% This is turned off because it was never documented
1998 +% and you can use @w{...} around a quote to suppress ligatures.
1999 +%% Define @` and @' to be the same as ` and '
2000 +%% but suppressing ligatures.
2001 +%\def\`{{`}}
2002 +%\def\'{{'}}
2003 +
2004 +% Used to generate quoted braces.
2005 +\def\mylbrace {{\tt\char123}}
2006 +\def\myrbrace {{\tt\char125}}
2007 +\let\{=\mylbrace
2008 +\let\}=\myrbrace
2009 +\begingroup
2010 +  % Definitions to produce \{ and \} commands for indices,
2011 +  % and @{ and @} for the aux/toc files.
2012 +  \catcode`\{ = \other \catcode`\} = \other
2013 +  \catcode`\[ = 1 \catcode`\] = 2
2014 +  \catcode`\! = 0 \catcode`\\ = \other
2015 +  !gdef!lbracecmd[\{]%
2016 +  !gdef!rbracecmd[\}]%
2017 +  !gdef!lbraceatcmd[@{]%
2018 +  !gdef!rbraceatcmd[@}]%
2019 +!endgroup
2020 +
2021 +% @comma{} to avoid , parsing problems.
2022 +\let\comma = ,
2023 +
2024 +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
2025 +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
2026 +\let\, = \c
2027 +\let\dotaccent = \.
2028 +\def\ringaccent#1{{\accent23 #1}}
2029 +\let\tieaccent = \t
2030 +\let\ubaraccent = \b
2031 +\let\udotaccent = \d
2032 +
2033 +% Other special characters: @questiondown @exclamdown @ordf @ordm
2034 +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
2035 +\def\questiondown{?`}
2036 +\def\exclamdown{!`}
2037 +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
2038 +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
2039 +
2040 +% Dotless i and dotless j, used for accents.
2041 +\def\imacro{i}
2042 +\def\jmacro{j}
2043 +\def\dotless#1{%
2044 +  \def\temp{#1}%
2045 +  \ifx\temp\imacro \ptexi
2046 +  \else\ifx\temp\jmacro \j
2047 +  \else \errmessage{@dotless can be used only with i or j}%
2048 +  \fi\fi
2049 +}
2050 +
2051 +% The \TeX{} logo, as in plain, but resetting the spacing so that a
2052 +% period following counts as ending a sentence.  (Idea found in latex.)
2053 +%
2054 +\edef\TeX{\TeX \spacefactor=1000 }
2055 +
2056 +% @LaTeX{} logo.  Not quite the same results as the definition in
2057 +% latex.ltx, since we use a different font for the raised A; it's most
2058 +% convenient for us to use an explicitly smaller font, rather than using
2059 +% the \scriptstyle font (since we don't reset \scriptstyle and
2060 +% \scriptscriptstyle).
2061 +%
2062 +\def\LaTeX{%
2063 +  L\kern-.36em
2064 +  {\setbox0=\hbox{T}%
2065 +   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
2066 +  \kern-.15em
2067 +  \TeX
2068 +}
2069 +
2070 +% Be sure we're in horizontal mode when doing a tie, since we make space
2071 +% equivalent to this in @example-like environments. Otherwise, a space
2072 +% at the beginning of a line will start with \penalty -- and
2073 +% since \penalty is valid in vertical mode, we'd end up putting the
2074 +% penalty on the vertical list instead of in the new paragraph.
2075 +{\catcode`@ = 11
2076 + % Avoid using \@M directly, because that causes trouble
2077 + % if the definition is written into an index file.
2078 + \global\let\tiepenalty = \@M
2079 + \gdef\tie{\leavevmode\penalty\tiepenalty\ }
2080 +}
2081 +
2082 +% @: forces normal size whitespace following.
2083 +\def\:{\spacefactor=1000 }
2084 +
2085 +% @* forces a line break.
2086 +\def\*{\hfil\break\hbox{}\ignorespaces}
2087 +
2088 +% @/ allows a line break.
2089 +\let\/=\allowbreak
2090 +
2091 +% @. is an end-of-sentence period.
2092 +\def\.{.\spacefactor=\endofsentencespacefactor\space}
2093 +
2094 +% @! is an end-of-sentence bang.
2095 +\def\!{!\spacefactor=\endofsentencespacefactor\space}
2096 +
2097 +% @? is an end-of-sentence query.
2098 +\def\?{?\spacefactor=\endofsentencespacefactor\space}
2099 +
2100 +% @frenchspacing on|off  says whether to put extra space after punctuation.
2101 +% 
2102 +\def\onword{on}
2103 +\def\offword{off}
2104 +%
2105 +\parseargdef\frenchspacing{%
2106 +  \def\temp{#1}%
2107 +  \ifx\temp\onword \plainfrenchspacing
2108 +  \else\ifx\temp\offword \plainnonfrenchspacing
2109 +  \else
2110 +    \errhelp = \EMsimple
2111 +    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
2112 +  \fi\fi
2113 +}
2114 +
2115 +% @w prevents a word break.  Without the \leavevmode, @w at the
2116 +% beginning of a paragraph, when TeX is still in vertical mode, would
2117 +% produce a whole line of output instead of starting the paragraph.
2118 +\def\w#1{\leavevmode\hbox{#1}}
2119 +
2120 +% @group ... @end group forces ... to be all on one page, by enclosing
2121 +% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
2122 +% to keep its height that of a normal line.  According to the rules for
2123 +% \topskip (p.114 of the TeXbook), the glue inserted is
2124 +% max (\topskip - \ht (first item), 0).  If that height is large,
2125 +% therefore, no glue is inserted, and the space between the headline and
2126 +% the text is small, which looks bad.
2127 +%
2128 +% Another complication is that the group might be very large.  This can
2129 +% cause the glue on the previous page to be unduly stretched, because it
2130 +% does not have much material.  In this case, it's better to add an
2131 +% explicit \vfill so that the extra space is at the bottom.  The
2132 +% threshold for doing this is if the group is more than \vfilllimit
2133 +% percent of a page (\vfilllimit can be changed inside of @tex).
2134 +%
2135 +\newbox\groupbox
2136 +\def\vfilllimit{0.7}
2137 +%
2138 +\envdef\group{%
2139 +  \ifnum\catcode`\^^M=\active \else
2140 +    \errhelp = \groupinvalidhelp
2141 +    \errmessage{@group invalid in context where filling is enabled}%
2142 +  \fi
2143 +  \startsavinginserts
2144 +  %
2145 +  \setbox\groupbox = \vtop\bgroup
2146 +    % Do @comment since we are called inside an environment such as
2147 +    % @example, where each end-of-line in the input causes an
2148 +    % end-of-line in the output.  We don't want the end-of-line after
2149 +    % the `@group' to put extra space in the output.  Since @group
2150 +    % should appear on a line by itself (according to the Texinfo
2151 +    % manual), we don't worry about eating any user text.
2152 +    \comment
2153 +}
2154 +%
2155 +% The \vtop produces a box with normal height and large depth; thus, TeX puts
2156 +% \baselineskip glue before it, and (when the next line of text is done)
2157 +% \lineskip glue after it.  Thus, space below is not quite equal to space
2158 +% above.  But it's pretty close.
2159 +\def\Egroup{%
2160 +    % To get correct interline space between the last line of the group
2161 +    % and the first line afterwards, we have to propagate \prevdepth.
2162 +    \endgraf % Not \par, as it may have been set to \lisppar.
2163 +    \global\dimen1 = \prevdepth
2164 +  \egroup           % End the \vtop.
2165 +  % \dimen0 is the vertical size of the group's box.
2166 +  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
2167 +  % \dimen2 is how much space is left on the page (more or less).
2168 +  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
2169 +  % if the group doesn't fit on the current page, and it's a big big
2170 +  % group, force a page break.
2171 +  \ifdim \dimen0 > \dimen2
2172 +    \ifdim \pagetotal < \vfilllimit\pageheight
2173 +      \page
2174 +    \fi
2175 +  \fi
2176 +  \box\groupbox
2177 +  \prevdepth = \dimen1
2178 +  \checkinserts
2179 +}
2180 +%
2181 +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
2182 +% message, so this ends up printing `@group can only ...'.
2183 +%
2184 +\newhelp\groupinvalidhelp{%
2185 +group can only be used in environments such as @example,^^J%
2186 +where each line of input produces a line of output.}
2187 +
2188 +% @need space-in-mils
2189 +% forces a page break if there is not space-in-mils remaining.
2190 +
2191 +\newdimen\mil  \mil=0.001in
2192 +
2193 +% Old definition--didn't work.
2194 +%\parseargdef\need{\par %
2195 +%% This method tries to make TeX break the page naturally
2196 +%% if the depth of the box does not fit.
2197 +%{\baselineskip=0pt%
2198 +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
2199 +%\prevdepth=-1000pt
2200 +%}}
2201 +
2202 +\parseargdef\need{%
2203 +  % Ensure vertical mode, so we don't make a big box in the middle of a
2204 +  % paragraph.
2205 +  \par
2206 +  %
2207 +  % If the @need value is less than one line space, it's useless.
2208 +  \dimen0 = #1\mil
2209 +  \dimen2 = \ht\strutbox
2210 +  \advance\dimen2 by \dp\strutbox
2211 +  \ifdim\dimen0 > \dimen2
2212 +    %
2213 +    % Do a \strut just to make the height of this box be normal, so the
2214 +    % normal leading is inserted relative to the preceding line.
2215 +    % And a page break here is fine.
2216 +    \vtop to #1\mil{\strut\vfil}%
2217 +    %
2218 +    % TeX does not even consider page breaks if a penalty added to the
2219 +    % main vertical list is 10000 or more.  But in order to see if the
2220 +    % empty box we just added fits on the page, we must make it consider
2221 +    % page breaks.  On the other hand, we don't want to actually break the
2222 +    % page after the empty box.  So we use a penalty of 9999.
2223 +    %
2224 +    % There is an extremely small chance that TeX will actually break the
2225 +    % page at this \penalty, if there are no other feasible breakpoints in
2226 +    % sight.  (If the user is using lots of big @group commands, which
2227 +    % almost-but-not-quite fill up a page, TeX will have a hard time doing
2228 +    % good page breaking, for example.)  However, I could not construct an
2229 +    % example where a page broke at this \penalty; if it happens in a real
2230 +    % document, then we can reconsider our strategy.
2231 +    \penalty9999
2232 +    %
2233 +    % Back up by the size of the box, whether we did a page break or not.
2234 +    \kern -#1\mil
2235 +    %
2236 +    % Do not allow a page break right after this kern.
2237 +    \nobreak
2238 +  \fi
2239 +}
2240 +
2241 +% @br   forces paragraph break (and is undocumented).
2242 +
2243 +\let\br = \par
2244 +
2245 +% @page forces the start of a new page.
2246 +%
2247 +\def\page{\par\vfill\supereject}
2248 +
2249 +% @exdent text....
2250 +% outputs text on separate line in roman font, starting at standard page margin
2251 +
2252 +% This records the amount of indent in the innermost environment.
2253 +% That's how much \exdent should take out.
2254 +\newskip\exdentamount
2255 +
2256 +% This defn is used inside fill environments such as @defun.
2257 +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
2258 +
2259 +% This defn is used inside nofill environments such as @example.
2260 +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
2261 +  \leftline{\hskip\leftskip{\rm#1}}}}
2262 +
2263 +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
2264 +% paragraph.  For more general purposes, use the \margin insertion
2265 +% class.  WHICH is `l' or `r'.
2266 +%
2267 +\newskip\inmarginspacing \inmarginspacing=1cm
2268 +\def\strutdepth{\dp\strutbox}
2269 +%
2270 +\def\doinmargin#1#2{\strut\vadjust{%
2271 +  \nobreak
2272 +  \kern-\strutdepth
2273 +  \vtop to \strutdepth{%
2274 +    \baselineskip=\strutdepth
2275 +    \vss
2276 +    % if you have multiple lines of stuff to put here, you'll need to
2277 +    % make the vbox yourself of the appropriate size.
2278 +    \ifx#1l%
2279 +      \llap{\ignorespaces #2\hskip\inmarginspacing}%
2280 +    \else
2281 +      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
2282 +    \fi
2283 +    \null
2284 +  }%
2285 +}}
2286 +\def\inleftmargin{\doinmargin l}
2287 +\def\inrightmargin{\doinmargin r}
2288 +%
2289 +% @inmargin{TEXT [, RIGHT-TEXT]}
2290 +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
2291 +% else use TEXT for both).
2292 +%
2293 +\def\inmargin#1{\parseinmargin #1,,\finish}
2294 +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
2295 +  \setbox0 = \hbox{\ignorespaces #2}%
2296 +  \ifdim\wd0 > 0pt
2297 +    \def\lefttext{#1}%  have both texts
2298 +    \def\righttext{#2}%
2299 +  \else
2300 +    \def\lefttext{#1}%  have only one text
2301 +    \def\righttext{#1}%
2302 +  \fi
2303 +  %
2304 +  \ifodd\pageno
2305 +    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
2306 +  \else
2307 +    \def\temp{\inleftmargin\lefttext}%
2308 +  \fi
2309 +  \temp
2310 +}
2311 +
2312 +% @include file    insert text of that file as input.
2313 +%
2314 +\def\include{\parseargusing\filenamecatcodes\includezzz}
2315 +\def\includezzz#1{%
2316 +  \pushthisfilestack
2317 +  \def\thisfile{#1}%
2318 +  {%
2319 +    \makevalueexpandable
2320 +    \def\temp{\input #1 }%
2321 +    \expandafter
2322 +  }\temp
2323 +  \popthisfilestack
2324 +}
2325 +\def\filenamecatcodes{%
2326 +  \catcode`\\=\other
2327 +  \catcode`~=\other
2328 +  \catcode`^=\other
2329 +  \catcode`_=\other
2330 +  \catcode`|=\other
2331 +  \catcode`<=\other
2332 +  \catcode`>=\other
2333 +  \catcode`+=\other
2334 +  \catcode`-=\other
2335 +}
2336 +
2337 +\def\pushthisfilestack{%
2338 +  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
2339 +}
2340 +\def\pushthisfilestackX{%
2341 +  \expandafter\pushthisfilestackY\thisfile\StackTerm
2342 +}
2343 +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
2344 +  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
2345 +}
2346 +
2347 +\def\popthisfilestack{\errthisfilestackempty}
2348 +\def\errthisfilestackempty{\errmessage{Internal error:
2349 +  the stack of filenames is empty.}}
2350 +
2351 +\def\thisfile{}
2352 +
2353 +% @center line
2354 +% outputs that line, centered.
2355 +%
2356 +\parseargdef\center{%
2357 +  \ifhmode
2358 +    \let\next\centerH
2359 +  \else
2360 +    \let\next\centerV
2361 +  \fi
2362 +  \next{\hfil \ignorespaces#1\unskip \hfil}%
2363 +}
2364 +\def\centerH#1{%
2365 +  {%
2366 +    \hfil\break
2367 +    \advance\hsize by -\leftskip
2368 +    \advance\hsize by -\rightskip
2369 +    \line{#1}%
2370 +    \break
2371 +  }%
2372 +}
2373 +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
2374 +
2375 +% @sp n   outputs n lines of vertical space
2376 +
2377 +\parseargdef\sp{\vskip #1\baselineskip}
2378 +
2379 +% @comment ...line which is ignored...
2380 +% @c is the same as @comment
2381 +% @ignore ... @end ignore  is another way to write a comment
2382 +
2383 +\def\comment{\begingroup \catcode`\^^M=\other%
2384 +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
2385 +\commentxxx}
2386 +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
2387 +
2388 +\let\c=\comment
2389 +
2390 +% @paragraphindent NCHARS
2391 +% We'll use ems for NCHARS, close enough.
2392 +% NCHARS can also be the word `asis' or `none'.
2393 +% We cannot feasibly implement @paragraphindent asis, though.
2394 +%
2395 +\def\asisword{asis} % no translation, these are keywords
2396 +\def\noneword{none}
2397 +%
2398 +\parseargdef\paragraphindent{%
2399 +  \def\temp{#1}%
2400 +  \ifx\temp\asisword
2401 +  \else
2402 +    \ifx\temp\noneword
2403 +      \defaultparindent = 0pt
2404 +    \else
2405 +      \defaultparindent = #1em
2406 +    \fi
2407 +  \fi
2408 +  \parindent = \defaultparindent
2409 +}
2410 +
2411 +% @exampleindent NCHARS
2412 +% We'll use ems for NCHARS like @paragraphindent.
2413 +% It seems @exampleindent asis isn't necessary, but
2414 +% I preserve it to make it similar to @paragraphindent.
2415 +\parseargdef\exampleindent{%
2416 +  \def\temp{#1}%
2417 +  \ifx\temp\asisword
2418 +  \else
2419 +    \ifx\temp\noneword
2420 +      \lispnarrowing = 0pt
2421 +    \else
2422 +      \lispnarrowing = #1em
2423 +    \fi
2424 +  \fi
2425 +}
2426 +
2427 +% @firstparagraphindent WORD
2428 +% If WORD is `none', then suppress indentation of the first paragraph
2429 +% after a section heading.  If WORD is `insert', then do indent at such
2430 +% paragraphs.
2431 +%
2432 +% The paragraph indentation is suppressed or not by calling
2433 +% \suppressfirstparagraphindent, which the sectioning commands do.
2434 +% We switch the definition of this back and forth according to WORD.
2435 +% By default, we suppress indentation.
2436 +%
2437 +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
2438 +\def\insertword{insert}
2439 +%
2440 +\parseargdef\firstparagraphindent{%
2441 +  \def\temp{#1}%
2442 +  \ifx\temp\noneword
2443 +    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
2444 +  \else\ifx\temp\insertword
2445 +    \let\suppressfirstparagraphindent = \relax
2446 +  \else
2447 +    \errhelp = \EMsimple
2448 +    \errmessage{Unknown @firstparagraphindent option `\temp'}%
2449 +  \fi\fi
2450 +}
2451 +
2452 +% Here is how we actually suppress indentation.  Redefine \everypar to
2453 +% \kern backwards by \parindent, and then reset itself to empty.
2454 +%
2455 +% We also make \indent itself not actually do anything until the next
2456 +% paragraph.
2457 +%
2458 +\gdef\dosuppressfirstparagraphindent{%
2459 +  \gdef\indent{%
2460 +    \restorefirstparagraphindent
2461 +    \indent
2462 +  }%
2463 +  \gdef\noindent{%
2464 +    \restorefirstparagraphindent
2465 +    \noindent
2466 +  }%
2467 +  \global\everypar = {%
2468 +    \kern -\parindent
2469 +    \restorefirstparagraphindent
2470 +  }%
2471 +}
2472 +
2473 +\gdef\restorefirstparagraphindent{%
2474 +  \global \let \indent = \ptexindent
2475 +  \global \let \noindent = \ptexnoindent
2476 +  \global \everypar = {}%
2477 +}
2478 +
2479 +
2480 +% @asis just yields its argument.  Used with @table, for example.
2481 +%
2482 +\def\asis#1{#1}
2483 +
2484 +% @math outputs its argument in math mode.
2485 +%
2486 +% One complication: _ usually means subscripts, but it could also mean
2487 +% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
2488 +% _ active, and distinguish by seeing if the current family is \slfam,
2489 +% which is what @var uses.
2490 +{
2491 +  \catcode\underChar = \active
2492 +  \gdef\mathunderscore{%
2493 +    \catcode\underChar=\active
2494 +    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
2495 +  }
2496 +}
2497 +% Another complication: we want \\ (and @\) to output a \ character.
2498 +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
2499 +% this is not advertised and we don't care.  Texinfo does not
2500 +% otherwise define @\.
2501 +%
2502 +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
2503 +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
2504 +%
2505 +\def\math{%
2506 +  \tex
2507 +  \mathunderscore
2508 +  \let\\ = \mathbackslash
2509 +  \mathactive
2510 +  $\finishmath
2511 +}
2512 +\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
2513 +
2514 +% Some active characters (such as <) are spaced differently in math.
2515 +% We have to reset their definitions in case the @math was an argument
2516 +% to a command which sets the catcodes (such as @item or @section).
2517 +%
2518 +{
2519 +  \catcode`^ = \active
2520 +  \catcode`< = \active
2521 +  \catcode`> = \active
2522 +  \catcode`+ = \active
2523 +  \gdef\mathactive{%
2524 +    \let^ = \ptexhat
2525 +    \let< = \ptexless
2526 +    \let> = \ptexgtr
2527 +    \let+ = \ptexplus
2528 +  }
2529 +}
2530 +
2531 +% @bullet and @minus need the same treatment as @math, just above.
2532 +\def\bullet{$\ptexbullet$}
2533 +\def\minus{$-$}
2534 +
2535 +% @dots{} outputs an ellipsis using the current font.
2536 +% We do .5em per period so that it has the same spacing in a typewriter
2537 +% font as three actual period characters.
2538 +%
2539 +\def\dots{%
2540 +  \leavevmode
2541 +  \hbox to 1.5em{%
2542 +    \hskip 0pt plus 0.25fil
2543 +    .\hfil.\hfil.%
2544 +    \hskip 0pt plus 0.5fil
2545 +  }%
2546 +}
2547 +
2548 +% @enddots{} is an end-of-sentence ellipsis.
2549 +%
2550 +\def\enddots{%
2551 +  \dots
2552 +  \spacefactor=\endofsentencespacefactor
2553 +}
2554 +
2555 +% @comma{} is so commas can be inserted into text without messing up
2556 +% Texinfo's parsing.
2557 +%
2558 +\let\comma = ,
2559 +
2560 +% @refill is a no-op.
2561 +\let\refill=\relax
2562 +
2563 +% If working on a large document in chapters, it is convenient to
2564 +% be able to disable indexing, cross-referencing, and contents, for test runs.
2565 +% This is done with @novalidate (before @setfilename).
2566 +%
2567 +\newif\iflinks \linkstrue % by default we want the aux files.
2568 +\let\novalidate = \linksfalse
2569 +
2570 +% @setfilename is done at the beginning of every texinfo file.
2571 +% So open here the files we need to have open while reading the input.
2572 +% This makes it possible to make a .fmt file for texinfo.
2573 +\def\setfilename{%
2574 +   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
2575 +   \iflinks
2576 +     \tryauxfile
2577 +     % Open the new aux file.  TeX will close it automatically at exit.
2578 +     \immediate\openout\auxfile=\jobname.aux
2579 +   \fi % \openindices needs to do some work in any case.
2580 +   \openindices
2581 +   \let\setfilename=\comment % Ignore extra @setfilename cmds.
2582 +   %
2583 +   % If texinfo.cnf is present on the system, read it.
2584 +   % Useful for site-wide @afourpaper, etc.
2585 +   \openin 1 texinfo.cnf
2586 +   \ifeof 1 \else \input texinfo.cnf \fi
2587 +   \closein 1
2588 +   %
2589 +   \comment % Ignore the actual filename.
2590 +}
2591 +
2592 +% Called from \setfilename.
2593 +%
2594 +\def\openindices{%
2595 +  \newindex{cp}%
2596 +  \newcodeindex{fn}%
2597 +  \newcodeindex{vr}%
2598 +  \newcodeindex{tp}%
2599 +  \newcodeindex{ky}%
2600 +  \newcodeindex{pg}%
2601 +}
2602 +
2603 +% @bye.
2604 +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
2605 +
2606 +
2607 +\message{pdf,}
2608 +% adobe `portable' document format
2609 +\newcount\tempnum
2610 +\newcount\lnkcount
2611 +\newtoks\filename
2612 +\newcount\filenamelength
2613 +\newcount\pgn
2614 +\newtoks\toksA
2615 +\newtoks\toksB
2616 +\newtoks\toksC
2617 +\newtoks\toksD
2618 +\newbox\boxA
2619 +\newcount\countA
2620 +\newif\ifpdf
2621 +\newif\ifpdfmakepagedest
2622 +
2623 +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
2624 +% can be set).  So we test for \relax and 0 as well as \undefined,
2625 +% borrowed from ifpdf.sty.
2626 +\ifx\pdfoutput\undefined
2627 +\else
2628 +  \ifx\pdfoutput\relax
2629 +  \else
2630 +    \ifcase\pdfoutput
2631 +    \else
2632 +      \pdftrue
2633 +    \fi
2634 +  \fi
2635 +\fi
2636 +
2637 +% PDF uses PostScript string constants for the names of xref targets, to
2638 +% for display in the outlines, and in other places.  Thus, we have to
2639 +% double any backslashes.  Otherwise, a name like "\node" will be
2640 +% interpreted as a newline (\n), followed by o, d, e.  Not good.
2641 +% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
2642 +% (and related messages, the final outcome is that it is up to the TeX
2643 +% user to double the backslashes and otherwise make the string valid, so
2644 +% that's we do).
2645 +
2646 +% double active backslashes.
2647 +% 
2648 +{\catcode`\@=0 \catcode`\\=\active
2649 + @gdef@activebackslash{@catcode`@\=@active @otherbackslash}
2650 + @gdef@activebackslashdouble{%
2651 +   @catcode@backChar=@active
2652 +   @let\=@doublebackslash}
2653 +}
2654 +
2655 +% To handle parens, we must adopt a different approach, since parens are
2656 +% not active characters.  hyperref.dtx (which has the same problem as
2657 +% us) handles it with this amazing macro to replace tokens.  I've
2658 +% tinkered with it a little for texinfo, but it's definitely from there.
2659 +% 
2660 +% #1 is the tokens to replace.
2661 +% #2 is the replacement.
2662 +% #3 is the control sequence with the string.
2663 +% 
2664 +\def\HyPsdSubst#1#2#3{%
2665 +  \def\HyPsdReplace##1#1##2\END{%
2666 +    ##1%
2667 +    \ifx\\##2\\%
2668 +    \else
2669 +      #2%
2670 +      \HyReturnAfterFi{%
2671 +        \HyPsdReplace##2\END
2672 +      }%
2673 +    \fi
2674 +  }%
2675 +  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
2676 +}
2677 +\long\def\HyReturnAfterFi#1\fi{\fi#1}
2678 +
2679 +% #1 is a control sequence in which to do the replacements.
2680 +\def\backslashparens#1{%
2681 +  \xdef#1{#1}% redefine it as its expansion; the definition is simply
2682 +             % \lastnode when called from \setref -> \pdfmkdest.
2683 +  \HyPsdSubst{(}{\backslashlparen}{#1}%
2684 +  \HyPsdSubst{)}{\backslashrparen}{#1}%
2685 +}
2686 +
2687 +{\catcode\exclamChar = 0 \catcode\backChar = \other
2688 + !gdef!backslashlparen{\(}%
2689 + !gdef!backslashrparen{\)}%
2690 +}
2691 +
2692 +\ifpdf
2693 +  \input pdfcolor
2694 +  \pdfcatalog{/PageMode /UseOutlines}%
2695 +  \def\dopdfimage#1#2#3{%
2696 +    \def\imagewidth{#2}%
2697 +    \def\imageheight{#3}%
2698 +    % without \immediate, pdftex seg faults when the same image is
2699 +    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
2700 +    \ifnum\pdftexversion < 14
2701 +      \immediate\pdfimage
2702 +    \else
2703 +      \immediate\pdfximage
2704 +    \fi
2705 +      \ifx\empty\imagewidth\else width \imagewidth \fi
2706 +      \ifx\empty\imageheight\else height \imageheight \fi
2707 +      \ifnum\pdftexversion<13
2708 +         #1.pdf%
2709 +       \else
2710 +         {#1.pdf}%
2711 +       \fi
2712 +    \ifnum\pdftexversion < 14 \else
2713 +      \pdfrefximage \pdflastximage
2714 +    \fi}
2715 +  \def\pdfmkdest#1{{%
2716 +    % We have to set dummies so commands such as @code, and characters
2717 +    % such as \, aren't expanded when present in a section title.
2718 +    \atdummies
2719 +    \activebackslashdouble
2720 +    \def\pdfdestname{#1}%
2721 +    \backslashparens\pdfdestname
2722 +    \pdfdest name{\pdfdestname} xyz%
2723 +  }}%
2724 +  %
2725 +  % used to mark target names; must be expandable.
2726 +  \def\pdfmkpgn#1{#1}%
2727 +  %
2728 +  \let\linkcolor = \Blue  % was Cyan, but that seems light?
2729 +  \def\endlink{\Black\pdfendlink}
2730 +  % Adding outlines to PDF; macros for calculating structure of outlines
2731 +  % come from Petr Olsak
2732 +  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
2733 +    \else \csname#1\endcsname \fi}
2734 +  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
2735 +    \advance\tempnum by 1
2736 +    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
2737 +  %
2738 +  % #1 is the section text, which is what will be displayed in the
2739 +  % outline by the pdf viewer.  #2 is the pdf expression for the number
2740 +  % of subentries (or empty, for subsubsections).  #3 is the node text,
2741 +  % which might be empty if this toc entry had no corresponding node.
2742 +  % #4 is the page number
2743 +  %
2744 +  \def\dopdfoutline#1#2#3#4{%
2745 +    % Generate a link to the node text if that exists; else, use the
2746 +    % page number.  We could generate a destination for the section
2747 +    % text in the case where a section has no node, but it doesn't
2748 +    % seem worth the trouble, since most documents are normally structured.
2749 +    \def\pdfoutlinedest{#3}%
2750 +    \ifx\pdfoutlinedest\empty
2751 +      \def\pdfoutlinedest{#4}%
2752 +    \else
2753 +      % Doubled backslashes in the name.
2754 +      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
2755 +       \backslashparens\pdfoutlinedest}%
2756 +    \fi
2757 +    %
2758 +    % Also double the backslashes in the display string.
2759 +    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
2760 +     \backslashparens\pdfoutlinetext}%
2761 +    %
2762 +    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
2763 +  }
2764 +  %
2765 +  \def\pdfmakeoutlines{%
2766 +    \begingroup
2767 +      % Thanh's hack / proper braces in bookmarks
2768 +      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
2769 +      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
2770 +      %
2771 +      % Read toc silently, to get counts of subentries for \pdfoutline.
2772 +      \def\numchapentry##1##2##3##4{%
2773 +       \def\thischapnum{##2}%
2774 +       \def\thissecnum{0}%
2775 +       \def\thissubsecnum{0}%
2776 +      }%
2777 +      \def\numsecentry##1##2##3##4{%
2778 +       \advancenumber{chap\thischapnum}%
2779 +       \def\thissecnum{##2}%
2780 +       \def\thissubsecnum{0}%
2781 +      }%
2782 +      \def\numsubsecentry##1##2##3##4{%
2783 +       \advancenumber{sec\thissecnum}%
2784 +       \def\thissubsecnum{##2}%
2785 +      }%
2786 +      \def\numsubsubsecentry##1##2##3##4{%
2787 +       \advancenumber{subsec\thissubsecnum}%
2788 +      }%
2789 +      \def\thischapnum{0}%
2790 +      \def\thissecnum{0}%
2791 +      \def\thissubsecnum{0}%
2792 +      %
2793 +      % use \def rather than \let here because we redefine \chapentry et
2794 +      % al. a second time, below.
2795 +      \def\appentry{\numchapentry}%
2796 +      \def\appsecentry{\numsecentry}%
2797 +      \def\appsubsecentry{\numsubsecentry}%
2798 +      \def\appsubsubsecentry{\numsubsubsecentry}%
2799 +      \def\unnchapentry{\numchapentry}%
2800 +      \def\unnsecentry{\numsecentry}%
2801 +      \def\unnsubsecentry{\numsubsecentry}%
2802 +      \def\unnsubsubsecentry{\numsubsubsecentry}%
2803 +      \readdatafile{toc}%
2804 +      %
2805 +      % Read toc second time, this time actually producing the outlines.
2806 +      % The `-' means take the \expnumber as the absolute number of
2807 +      % subentries, which we calculated on our first read of the .toc above.
2808 +      %
2809 +      % We use the node names as the destinations.
2810 +      \def\numchapentry##1##2##3##4{%
2811 +        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
2812 +      \def\numsecentry##1##2##3##4{%
2813 +        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
2814 +      \def\numsubsecentry##1##2##3##4{%
2815 +        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
2816 +      \def\numsubsubsecentry##1##2##3##4{% count is always zero
2817 +        \dopdfoutline{##1}{}{##3}{##4}}%
2818 +      %
2819 +      % PDF outlines are displayed using system fonts, instead of
2820 +      % document fonts.  Therefore we cannot use special characters,
2821 +      % since the encoding is unknown.  For example, the eogonek from
2822 +      % Latin 2 (0xea) gets translated to a | character.  Info from
2823 +      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
2824 +      %
2825 +      % xx to do this right, we have to translate 8-bit characters to
2826 +      % their "best" equivalent, based on the @documentencoding.  Right
2827 +      % now, I guess we'll just let the pdf reader have its way.
2828 +      \indexnofonts
2829 +      \setupdatafile
2830 +      \activebackslash
2831 +      \input \jobname.toc
2832 +    \endgroup
2833 +  }
2834 +  %
2835 +  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
2836 +    \ifx\PP\D\let\nextsp\relax
2837 +    \else\let\nextsp\skipspaces
2838 +      \ifx\p\space\else\addtokens{\filename}{\PP}%
2839 +        \advance\filenamelength by 1
2840 +      \fi
2841 +    \fi
2842 +    \nextsp}
2843 +  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
2844 +  \ifnum\pdftexversion < 14
2845 +    \let \startlink \pdfannotlink
2846 +  \else
2847 +    \let \startlink \pdfstartlink
2848 +  \fi
2849 +  \def\pdfurl#1{%
2850 +    \begingroup
2851 +      \normalturnoffactive\def\@{@}%
2852 +      \makevalueexpandable
2853 +      \leavevmode\Red
2854 +      \startlink attr{/Border [0 0 0]}%
2855 +        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
2856 +    \endgroup}
2857 +  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
2858 +  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
2859 +  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
2860 +  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
2861 +  \def\maketoks{%
2862 +    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
2863 +    \ifx\first0\adn0
2864 +    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
2865 +    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
2866 +    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
2867 +    \else
2868 +      \ifnum0=\countA\else\makelink\fi
2869 +      \ifx\first.\let\next=\done\else
2870 +        \let\next=\maketoks
2871 +        \addtokens{\toksB}{\the\toksD}
2872 +        \ifx\first,\addtokens{\toksB}{\space}\fi
2873 +      \fi
2874 +    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
2875 +    \next}
2876 +  \def\makelink{\addtokens{\toksB}%
2877 +    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
2878 +  \def\pdflink#1{%
2879 +    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
2880 +    \linkcolor #1\endlink}
2881 +  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
2882 +\else
2883 +  \let\pdfmkdest = \gobble
2884 +  \let\pdfurl = \gobble
2885 +  \let\endlink = \relax
2886 +  \let\linkcolor = \relax
2887 +  \let\pdfmakeoutlines = \relax
2888 +\fi  % \ifx\pdfoutput
2889 +
2890 +
2891 +\message{fonts,}
2892 +
2893 +% Change the current font style to #1, remembering it in \curfontstyle.
2894 +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
2895 +% italics, not bold italics.
2896 +%
2897 +\def\setfontstyle#1{%
2898 +  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
2899 +  \csname ten#1\endcsname  % change the current font
2900 +}
2901 +
2902 +% Select #1 fonts with the current style.
2903 +%
2904 +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
2905 +
2906 +\def\rm{\fam=0 \setfontstyle{rm}}
2907 +\def\it{\fam=\itfam \setfontstyle{it}}
2908 +\def\sl{\fam=\slfam \setfontstyle{sl}}
2909 +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
2910 +\def\tt{\fam=\ttfam \setfontstyle{tt}}
2911 +
2912 +% Texinfo sort of supports the sans serif font style, which plain TeX does not.
2913 +% So we set up a \sf.
2914 +\newfam\sffam
2915 +\def\sf{\fam=\sffam \setfontstyle{sf}}
2916 +\let\li = \sf % Sometimes we call it \li, not \sf.
2917 +
2918 +% We don't need math for this font style.
2919 +\def\ttsl{\setfontstyle{ttsl}}
2920 +
2921 +% Default leading.
2922 +\newdimen\textleading  \textleading = 13.2pt
2923 +
2924 +% Set the baselineskip to #1, and the lineskip and strut size
2925 +% correspondingly.  There is no deep meaning behind these magic numbers
2926 +% used as factors; they just match (closely enough) what Knuth defined.
2927 +%
2928 +\def\lineskipfactor{.08333}
2929 +\def\strutheightpercent{.70833}
2930 +\def\strutdepthpercent {.29167}
2931 +%
2932 +\def\setleading#1{%
2933 +  \normalbaselineskip = #1\relax
2934 +  \normallineskip = \lineskipfactor\normalbaselineskip
2935 +  \normalbaselines
2936 +  \setbox\strutbox =\hbox{%
2937 +    \vrule width0pt height\strutheightpercent\baselineskip
2938 +                    depth \strutdepthpercent \baselineskip
2939 +  }%
2940 +}
2941 +
2942 +% Set the font macro #1 to the font named #2, adding on the
2943 +% specified font prefix (normally `cm').
2944 +% #3 is the font's design size, #4 is a scale factor
2945 +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
2946 +
2947 +% Use cm as the default font prefix.
2948 +% To specify the font prefix, you must define \fontprefix
2949 +% before you read in texinfo.tex.
2950 +\ifx\fontprefix\undefined
2951 +\def\fontprefix{cm}
2952 +\fi
2953 +% Support font families that don't use the same naming scheme as CM.
2954 +\def\rmshape{r}
2955 +\def\rmbshape{bx}               %where the normal face is bold
2956 +\def\bfshape{b}
2957 +\def\bxshape{bx}
2958 +\def\ttshape{tt}
2959 +\def\ttbshape{tt}
2960 +\def\ttslshape{sltt}
2961 +\def\itshape{ti}
2962 +\def\itbshape{bxti}
2963 +\def\slshape{sl}
2964 +\def\slbshape{bxsl}
2965 +\def\sfshape{ss}
2966 +\def\sfbshape{ss}
2967 +\def\scshape{csc}
2968 +\def\scbshape{csc}
2969 +
2970 +% Text fonts (11.2pt, magstep1).
2971 +\def\textnominalsize{11pt}
2972 +\edef\mainmagstep{\magstephalf}
2973 +\setfont\textrm\rmshape{10}{\mainmagstep}
2974 +\setfont\texttt\ttshape{10}{\mainmagstep}
2975 +\setfont\textbf\bfshape{10}{\mainmagstep}
2976 +\setfont\textit\itshape{10}{\mainmagstep}
2977 +\setfont\textsl\slshape{10}{\mainmagstep}
2978 +\setfont\textsf\sfshape{10}{\mainmagstep}
2979 +\setfont\textsc\scshape{10}{\mainmagstep}
2980 +\setfont\textttsl\ttslshape{10}{\mainmagstep}
2981 +\font\texti=cmmi10 scaled \mainmagstep
2982 +\font\textsy=cmsy10 scaled \mainmagstep
2983 +
2984 +% A few fonts for @defun names and args.
2985 +\setfont\defbf\bfshape{10}{\magstep1}
2986 +\setfont\deftt\ttshape{10}{\magstep1}
2987 +\setfont\defttsl\ttslshape{10}{\magstep1}
2988 +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
2989 +
2990 +% Fonts for indices, footnotes, small examples (9pt).
2991 +\def\smallnominalsize{9pt}
2992 +\setfont\smallrm\rmshape{9}{1000}
2993 +\setfont\smalltt\ttshape{9}{1000}
2994 +\setfont\smallbf\bfshape{10}{900}
2995 +\setfont\smallit\itshape{9}{1000}
2996 +\setfont\smallsl\slshape{9}{1000}
2997 +\setfont\smallsf\sfshape{9}{1000}
2998 +\setfont\smallsc\scshape{10}{900}
2999 +\setfont\smallttsl\ttslshape{10}{900}
3000 +\font\smalli=cmmi9
3001 +\font\smallsy=cmsy9
3002 +
3003 +% Fonts for small examples (8pt).
3004 +\def\smallernominalsize{8pt}
3005 +\setfont\smallerrm\rmshape{8}{1000}
3006 +\setfont\smallertt\ttshape{8}{1000}
3007 +\setfont\smallerbf\bfshape{10}{800}
3008 +\setfont\smallerit\itshape{8}{1000}
3009 +\setfont\smallersl\slshape{8}{1000}
3010 +\setfont\smallersf\sfshape{8}{1000}
3011 +\setfont\smallersc\scshape{10}{800}
3012 +\setfont\smallerttsl\ttslshape{10}{800}
3013 +\font\smalleri=cmmi8
3014 +\font\smallersy=cmsy8
3015 +
3016 +% Fonts for title page (20.4pt):
3017 +\def\titlenominalsize{20pt}
3018 +\setfont\titlerm\rmbshape{12}{\magstep3}
3019 +\setfont\titleit\itbshape{10}{\magstep4}
3020 +\setfont\titlesl\slbshape{10}{\magstep4}
3021 +\setfont\titlett\ttbshape{12}{\magstep3}
3022 +\setfont\titlettsl\ttslshape{10}{\magstep4}
3023 +\setfont\titlesf\sfbshape{17}{\magstep1}
3024 +\let\titlebf=\titlerm
3025 +\setfont\titlesc\scbshape{10}{\magstep4}
3026 +\font\titlei=cmmi12 scaled \magstep3
3027 +\font\titlesy=cmsy10 scaled \magstep4
3028 +\def\authorrm{\secrm}
3029 +\def\authortt{\sectt}
3030 +
3031 +% Chapter (and unnumbered) fonts (17.28pt).
3032 +\def\chapnominalsize{17pt}
3033 +\setfont\chaprm\rmbshape{12}{\magstep2}
3034 +\setfont\chapit\itbshape{10}{\magstep3}
3035 +\setfont\chapsl\slbshape{10}{\magstep3}
3036 +\setfont\chaptt\ttbshape{12}{\magstep2}
3037 +\setfont\chapttsl\ttslshape{10}{\magstep3}
3038 +\setfont\chapsf\sfbshape{17}{1000}
3039 +\let\chapbf=\chaprm
3040 +\setfont\chapsc\scbshape{10}{\magstep3}
3041 +\font\chapi=cmmi12 scaled \magstep2
3042 +\font\chapsy=cmsy10 scaled \magstep3
3043 +
3044 +% Section fonts (14.4pt).
3045 +\def\secnominalsize{14pt}
3046 +\setfont\secrm\rmbshape{12}{\magstep1}
3047 +\setfont\secit\itbshape{10}{\magstep2}
3048 +\setfont\secsl\slbshape{10}{\magstep2}
3049 +\setfont\sectt\ttbshape{12}{\magstep1}
3050 +\setfont\secttsl\ttslshape{10}{\magstep2}
3051 +\setfont\secsf\sfbshape{12}{\magstep1}
3052 +\let\secbf\secrm
3053 +\setfont\secsc\scbshape{10}{\magstep2}
3054 +\font\seci=cmmi12 scaled \magstep1
3055 +\font\secsy=cmsy10 scaled \magstep2
3056 +
3057 +% Subsection fonts (13.15pt).
3058 +\def\ssecnominalsize{13pt}
3059 +\setfont\ssecrm\rmbshape{12}{\magstephalf}
3060 +\setfont\ssecit\itbshape{10}{1315}
3061 +\setfont\ssecsl\slbshape{10}{1315}
3062 +\setfont\ssectt\ttbshape{12}{\magstephalf}
3063 +\setfont\ssecttsl\ttslshape{10}{1315}
3064 +\setfont\ssecsf\sfbshape{12}{\magstephalf}
3065 +\let\ssecbf\ssecrm
3066 +\setfont\ssecsc\scbshape{10}{1315}
3067 +\font\sseci=cmmi12 scaled \magstephalf
3068 +\font\ssecsy=cmsy10 scaled 1315
3069 +
3070 +% Reduced fonts for @acro in text (10pt).
3071 +\def\reducednominalsize{10pt}
3072 +\setfont\reducedrm\rmshape{10}{1000}
3073 +\setfont\reducedtt\ttshape{10}{1000}
3074 +\setfont\reducedbf\bfshape{10}{1000}
3075 +\setfont\reducedit\itshape{10}{1000}
3076 +\setfont\reducedsl\slshape{10}{1000}
3077 +\setfont\reducedsf\sfshape{10}{1000}
3078 +\setfont\reducedsc\scshape{10}{1000}
3079 +\setfont\reducedttsl\ttslshape{10}{1000}
3080 +\font\reducedi=cmmi10
3081 +\font\reducedsy=cmsy10
3082 +
3083 +% In order for the font changes to affect most math symbols and letters,
3084 +% we have to define the \textfont of the standard families.  Since
3085 +% texinfo doesn't allow for producing subscripts and superscripts except
3086 +% in the main text, we don't bother to reset \scriptfont and
3087 +% \scriptscriptfont (which would also require loading a lot more fonts).
3088 +%
3089 +\def\resetmathfonts{%
3090 +  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
3091 +  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
3092 +  \textfont\ttfam=\tentt \textfont\sffam=\tensf
3093 +}
3094 +
3095 +% The font-changing commands redefine the meanings of \tenSTYLE, instead
3096 +% of just \STYLE.  We do this because \STYLE needs to also set the
3097 +% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
3098 +% \tenSTYLE to set the current font.
3099 +%
3100 +% Each font-changing command also sets the names \lsize (one size lower)
3101 +% and \lllsize (three sizes lower).  These relative commands are used in
3102 +% the LaTeX logo and acronyms.
3103 +%
3104 +% This all needs generalizing, badly.
3105 +%
3106 +\def\textfonts{%
3107 +  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
3108 +  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
3109 +  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
3110 +  \let\tenttsl=\textttsl
3111 +  \def\curfontsize{text}%
3112 +  \def\lsize{reduced}\def\lllsize{smaller}%
3113 +  \resetmathfonts \setleading{\textleading}}
3114 +\def\titlefonts{%
3115 +  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
3116 +  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
3117 +  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
3118 +  \let\tenttsl=\titlettsl
3119 +  \def\curfontsize{title}%
3120 +  \def\lsize{chap}\def\lllsize{subsec}%
3121 +  \resetmathfonts \setleading{25pt}}
3122 +\def\titlefont#1{{\titlefonts\rm #1}}
3123 +\def\chapfonts{%
3124 +  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
3125 +  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
3126 +  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
3127 +  \let\tenttsl=\chapttsl
3128 +  \def\curfontsize{chap}%
3129 +  \def\lsize{sec}\def\lllsize{text}%
3130 +  \resetmathfonts \setleading{19pt}}
3131 +\def\secfonts{%
3132 +  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
3133 +  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
3134 +  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
3135 +  \let\tenttsl=\secttsl
3136 +  \def\curfontsize{sec}%
3137 +  \def\lsize{subsec}\def\lllsize{reduced}%
3138 +  \resetmathfonts \setleading{16pt}}
3139 +\def\subsecfonts{%
3140 +  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
3141 +  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
3142 +  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
3143 +  \let\tenttsl=\ssecttsl
3144 +  \def\curfontsize{ssec}%
3145 +  \def\lsize{text}\def\lllsize{small}%
3146 +  \resetmathfonts \setleading{15pt}}
3147 +\let\subsubsecfonts = \subsecfonts
3148 +\def\reducedfonts{%
3149 +  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
3150 +  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
3151 +  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
3152 +  \let\tenttsl=\reducedttsl
3153 +  \def\curfontsize{reduced}%
3154 +  \def\lsize{small}\def\lllsize{smaller}%
3155 +  \resetmathfonts \setleading{10.5pt}}
3156 +\def\smallfonts{%
3157 +  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
3158 +  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
3159 +  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
3160 +  \let\tenttsl=\smallttsl
3161 +  \def\curfontsize{small}%
3162 +  \def\lsize{smaller}\def\lllsize{smaller}%
3163 +  \resetmathfonts \setleading{10.5pt}}
3164 +\def\smallerfonts{%
3165 +  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
3166 +  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
3167 +  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
3168 +  \let\tenttsl=\smallerttsl
3169 +  \def\curfontsize{smaller}%
3170 +  \def\lsize{smaller}\def\lllsize{smaller}%
3171 +  \resetmathfonts \setleading{9.5pt}}
3172 +
3173 +% Set the fonts to use with the @small... environments.
3174 +\let\smallexamplefonts = \smallfonts
3175 +
3176 +% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
3177 +% can fit this many characters:
3178 +%   8.5x11=86   smallbook=72  a4=90  a5=69
3179 +% If we use \scriptfonts (8pt), then we can fit this many characters:
3180 +%   8.5x11=90+  smallbook=80  a4=90+  a5=77
3181 +% For me, subjectively, the few extra characters that fit aren't worth
3182 +% the additional smallness of 8pt.  So I'm making the default 9pt.
3183 +%
3184 +% By the way, for comparison, here's what fits with @example (10pt):
3185 +%   8.5x11=71  smallbook=60  a4=75  a5=58
3186 +%
3187 +% I wish the USA used A4 paper.
3188 +% --karl, 24jan03.
3189 +
3190 +
3191 +% Set up the default fonts, so we can use them for creating boxes.
3192 +%
3193 +\textfonts \rm
3194 +
3195 +% Define these so they can be easily changed for other fonts.
3196 +\def\angleleft{$\langle$}
3197 +\def\angleright{$\rangle$}
3198 +
3199 +% Count depth in font-changes, for error checks
3200 +\newcount\fontdepth \fontdepth=0
3201 +
3202 +% Fonts for short table of contents.
3203 +\setfont\shortcontrm\rmshape{12}{1000}
3204 +\setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
3205 +\setfont\shortcontsl\slshape{12}{1000}
3206 +\setfont\shortconttt\ttshape{12}{1000}
3207 +
3208 +%% Add scribe-like font environments, plus @l for inline lisp (usually sans
3209 +%% serif) and @ii for TeX italic
3210 +
3211 +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
3212 +% unless the following character is such as not to need one.
3213 +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
3214 +                    \ptexslash\fi\fi\fi}
3215 +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
3216 +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
3217 +
3218 +% like \smartslanted except unconditionally uses \ttsl.
3219 +% @var is set to this for defun arguments.
3220 +\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
3221 +
3222 +% like \smartslanted except unconditionally use \sl.  We never want
3223 +% ttsl for book titles, do we?
3224 +\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
3225 +
3226 +\let\i=\smartitalic
3227 +\let\slanted=\smartslanted
3228 +\let\var=\smartslanted
3229 +\let\dfn=\smartslanted
3230 +\let\emph=\smartitalic
3231 +
3232 +% @b, explicit bold.
3233 +\def\b#1{{\bf #1}}
3234 +\let\strong=\b
3235 +
3236 +% @sansserif, explicit sans.
3237 +\def\sansserif#1{{\sf #1}}
3238 +
3239 +% We can't just use \exhyphenpenalty, because that only has effect at
3240 +% the end of a paragraph.  Restore normal hyphenation at the end of the
3241 +% group within which \nohyphenation is presumably called.
3242 +%
3243 +\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
3244 +\def\restorehyphenation{\hyphenchar\font = `- }
3245 +
3246 +% Set sfcode to normal for the chars that usually have another value.
3247 +% Can't use plain's \frenchspacing because it uses the `\x notation, and
3248 +% sometimes \x has an active definition that messes things up.
3249 +%
3250 +\catcode`@=11
3251 +  \def\plainfrenchspacing{%
3252 +    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
3253 +    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
3254 +    \def\endofsentencespacefactor{1000}% for @. and friends
3255 +  }
3256 +  \def\plainnonfrenchspacing{%
3257 +    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
3258 +    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
3259 +    \def\endofsentencespacefactor{3000}% for @. and friends
3260 +  }
3261 +\catcode`@=\other
3262 +\def\endofsentencespacefactor{3000}% default
3263 +
3264 +\def\t#1{%
3265 +  {\tt \rawbackslash \plainfrenchspacing #1}%
3266 +  \null
3267 +}
3268 +\def\samp#1{`\tclose{#1}'\null}
3269 +\setfont\keyrm\rmshape{8}{1000}
3270 +\font\keysy=cmsy9
3271 +\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
3272 +  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
3273 +    \vbox{\hrule\kern-0.4pt
3274 +     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
3275 +    \kern-0.4pt\hrule}%
3276 +  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
3277 +% The old definition, with no lozenge:
3278 +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
3279 +\def\ctrl #1{{\tt \rawbackslash \hat}#1}
3280 +
3281 +% @file, @option are the same as @samp.
3282 +\let\file=\samp
3283 +\let\option=\samp
3284 +
3285 +% @code is a modification of @t,
3286 +% which makes spaces the same size as normal in the surrounding text.
3287 +\def\tclose#1{%
3288 +  {%
3289 +    % Change normal interword space to be same as for the current font.
3290 +    \spaceskip = \fontdimen2\font
3291 +    %
3292 +    % Switch to typewriter.
3293 +    \tt
3294 +    %
3295 +    % But `\ ' produces the large typewriter interword space.
3296 +    \def\ {{\spaceskip = 0pt{} }}%
3297 +    %
3298 +    % Turn off hyphenation.
3299 +    \nohyphenation
3300 +    %
3301 +    \rawbackslash
3302 +    \plainfrenchspacing
3303 +    #1%
3304 +  }%
3305 +  \null
3306 +}
3307 +
3308 +% We *must* turn on hyphenation at `-' and `_' in @code.
3309 +% Otherwise, it is too hard to avoid overfull hboxes
3310 +% in the Emacs manual, the Library manual, etc.
3311 +
3312 +% Unfortunately, TeX uses one parameter (\hyphenchar) to control
3313 +% both hyphenation at - and hyphenation within words.
3314 +% We must therefore turn them both off (\tclose does that)
3315 +% and arrange explicitly to hyphenate at a dash.
3316 +%  -- rms.
3317 +{
3318 +  \catcode`\-=\active
3319 +  \catcode`\_=\active
3320 +  %
3321 +  \global\def\code{\begingroup
3322 +    \catcode`\-=\active  \catcode`\_=\active
3323 +    \ifallowcodebreaks
3324 +     \let-\codedash
3325 +     \let_\codeunder
3326 +    \else
3327 +     \let-\realdash
3328 +     \let_\realunder
3329 +    \fi
3330 +    \codex
3331 +  }
3332 +}
3333 +
3334 +\def\realdash{-}
3335 +\def\codedash{-\discretionary{}{}{}}
3336 +\def\codeunder{%
3337 +  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
3338 +  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
3339 +  % will therefore expand the active definition of _, which is us
3340 +  % (inside @code that is), therefore an endless loop.
3341 +  \ifusingtt{\ifmmode
3342 +               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
3343 +             \else\normalunderscore \fi
3344 +             \discretionary{}{}{}}%
3345 +            {\_}%
3346 +}
3347 +\def\codex #1{\tclose{#1}\endgroup}
3348 +
3349 +% An additional complication: the above will allow breaks after, e.g.,
3350 +% each of the four underscores in __typeof__.  This is undesirable in
3351 +% some manuals, especially if they don't have long identifiers in
3352 +% general.  @allowcodebreaks provides a way to control this.
3353 +% 
3354 +\newif\ifallowcodebreaks  \allowcodebreakstrue
3355 +
3356 +\def\keywordtrue{true}
3357 +\def\keywordfalse{false}
3358 +
3359 +\parseargdef\allowcodebreaks{%
3360 +  \def\txiarg{#1}%
3361 +  \ifx\txiarg\keywordtrue
3362 +    \allowcodebreakstrue
3363 +  \else\ifx\txiarg\keywordfalse
3364 +    \allowcodebreaksfalse
3365 +  \else
3366 +    \errhelp = \EMsimple
3367 +    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
3368 +  \fi\fi
3369 +}
3370 +
3371 +% @kbd is like @code, except that if the argument is just one @key command,
3372 +% then @kbd has no effect.
3373 +
3374 +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
3375 +%   `example' (@kbd uses ttsl only inside of @example and friends),
3376 +%   or `code' (@kbd uses normal tty font always).
3377 +\parseargdef\kbdinputstyle{%
3378 +  \def\txiarg{#1}%
3379 +  \ifx\txiarg\worddistinct
3380 +    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
3381 +  \else\ifx\txiarg\wordexample
3382 +    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
3383 +  \else\ifx\txiarg\wordcode
3384 +    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
3385 +  \else
3386 +    \errhelp = \EMsimple
3387 +    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
3388 +  \fi\fi\fi
3389 +}
3390 +\def\worddistinct{distinct}
3391 +\def\wordexample{example}
3392 +\def\wordcode{code}
3393 +
3394 +% Default is `distinct.'
3395 +\kbdinputstyle distinct
3396 +
3397 +\def\xkey{\key}
3398 +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
3399 +\ifx\one\xkey\ifx\threex\three \key{#2}%
3400 +\else{\tclose{\kbdfont\look}}\fi
3401 +\else{\tclose{\kbdfont\look}}\fi}
3402 +
3403 +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
3404 +\let\indicateurl=\code
3405 +\let\env=\code
3406 +\let\command=\code
3407 +
3408 +% @uref (abbreviation for `urlref') takes an optional (comma-separated)
3409 +% second argument specifying the text to display and an optional third
3410 +% arg as text to display instead of (rather than in addition to) the url
3411 +% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
3412 +% a hypertex \special here.
3413 +%
3414 +\def\uref#1{\douref #1,,,\finish}
3415 +\def\douref#1,#2,#3,#4\finish{\begingroup
3416 +  \unsepspaces
3417 +  \pdfurl{#1}%
3418 +  \setbox0 = \hbox{\ignorespaces #3}%
3419 +  \ifdim\wd0 > 0pt
3420 +    \unhbox0 % third arg given, show only that
3421 +  \else
3422 +    \setbox0 = \hbox{\ignorespaces #2}%
3423 +    \ifdim\wd0 > 0pt
3424 +      \ifpdf
3425 +        \unhbox0             % PDF: 2nd arg given, show only it
3426 +      \else
3427 +        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
3428 +      \fi
3429 +    \else
3430 +      \code{#1}% only url given, so show it
3431 +    \fi
3432 +  \fi
3433 +  \endlink
3434 +\endgroup}
3435 +
3436 +% @url synonym for @uref, since that's how everyone uses it.
3437 +%
3438 +\let\url=\uref
3439 +
3440 +% rms does not like angle brackets --karl, 17may97.
3441 +% So now @email is just like @uref, unless we are pdf.
3442 +%
3443 +%\def\email#1{\angleleft{\tt #1}\angleright}
3444 +\ifpdf
3445 +  \def\email#1{\doemail#1,,\finish}
3446 +  \def\doemail#1,#2,#3\finish{\begingroup
3447 +    \unsepspaces
3448 +    \pdfurl{mailto:#1}%
3449 +    \setbox0 = \hbox{\ignorespaces #2}%
3450 +    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
3451 +    \endlink
3452 +  \endgroup}
3453 +\else
3454 +  \let\email=\uref
3455 +\fi
3456 +
3457 +% Check if we are currently using a typewriter font.  Since all the
3458 +% Computer Modern typewriter fonts have zero interword stretch (and
3459 +% shrink), and it is reasonable to expect all typewriter fonts to have
3460 +% this property, we can check that font parameter.
3461 +%
3462 +\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
3463 +
3464 +% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
3465 +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
3466 +%
3467 +\def\dmn#1{\thinspace #1}
3468 +
3469 +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
3470 +
3471 +% @l was never documented to mean ``switch to the Lisp font'',
3472 +% and it is not used as such in any manual I can find.  We need it for
3473 +% Polish suppressed-l.  --karl, 22sep96.
3474 +%\def\l#1{{\li #1}\null}
3475 +
3476 +% Explicit font changes: @r, @sc, undocumented @ii.
3477 +\def\r#1{{\rm #1}}              % roman font
3478 +\def\sc#1{{\smallcaps#1}}       % smallcaps font
3479 +\def\ii#1{{\it #1}}             % italic font
3480 +
3481 +% @acronym for "FBI", "NATO", and the like.
3482 +% We print this one point size smaller, since it's intended for
3483 +% all-uppercase.
3484 +% 
3485 +\def\acronym#1{\doacronym #1,,\finish}
3486 +\def\doacronym#1,#2,#3\finish{%
3487 +  {\selectfonts\lsize #1}%
3488 +  \def\temp{#2}%
3489 +  \ifx\temp\empty \else
3490 +    \space ({\unsepspaces \ignorespaces \temp \unskip})%
3491 +  \fi
3492 +}
3493 +
3494 +% @abbr for "Comput. J." and the like.
3495 +% No font change, but don't do end-of-sentence spacing.
3496 +% 
3497 +\def\abbr#1{\doabbr #1,,\finish}
3498 +\def\doabbr#1,#2,#3\finish{%
3499 +  {\plainfrenchspacing #1}%
3500 +  \def\temp{#2}%
3501 +  \ifx\temp\empty \else
3502 +    \space ({\unsepspaces \ignorespaces \temp \unskip})%
3503 +  \fi
3504 +}
3505 +
3506 +% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
3507 +%
3508 +\def\pounds{{\it\$}}
3509 +
3510 +% @euro{} comes from a separate font, depending on the current style.
3511 +% We use the free feym* fonts from the eurosym package by Henrik
3512 +% Theiling, which support regular, slanted, bold and bold slanted (and
3513 +% "outlined" (blackboard board, sort of) versions, which we don't need).
3514 +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
3515 +% 
3516 +% Although only regular is the truly official Euro symbol, we ignore
3517 +% that.  The Euro is designed to be slightly taller than the regular
3518 +% font height.
3519 +% 
3520 +% feymr - regular
3521 +% feymo - slanted
3522 +% feybr - bold
3523 +% feybo - bold slanted
3524 +% 
3525 +% There is no good (free) typewriter version, to my knowledge.
3526 +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
3527 +% Hmm.
3528 +% 
3529 +% Also doesn't work in math.  Do we need to do math with euro symbols?
3530 +% Hope not.
3531 +% 
3532 +% 
3533 +\def\euro{{\eurofont e}}
3534 +\def\eurofont{%
3535 +  % We set the font at each command, rather than predefining it in
3536 +  % \textfonts and the other font-switching commands, so that
3537 +  % installations which never need the symbol don't have to have the
3538 +  % font installed.
3539 +  % 
3540 +  % There is only one designed size (nominal 10pt), so we always scale
3541 +  % that to the current nominal size.
3542 +  % 
3543 +  % By the way, simply using "at 1em" works for cmr10 and the like, but
3544 +  % does not work for cmbx10 and other extended/shrunken fonts.
3545 +  % 
3546 +  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
3547 +  %
3548 +  \ifx\curfontstyle\bfstylename 
3549 +    % bold:
3550 +    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
3551 +  \else 
3552 +    % regular:
3553 +    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
3554 +  \fi
3555 +  \thiseurofont
3556 +}
3557 +
3558 +% @registeredsymbol - R in a circle.  The font for the R should really
3559 +% be smaller yet, but lllsize is the best we can do for now.
3560 +% Adapted from the plain.tex definition of \copyright.
3561 +%
3562 +\def\registeredsymbol{%
3563 +  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
3564 +               \hfil\crcr\Orb}}%
3565 +    }$%
3566 +}
3567 +
3568 +% Laurent Siebenmann reports \Orb undefined with:
3569 +%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
3570 +% so we'll define it if necessary.
3571 +% 
3572 +\ifx\Orb\undefined
3573 +\def\Orb{\mathhexbox20D}
3574 +\fi
3575 +
3576 +
3577 +\message{page headings,}
3578 +
3579 +\newskip\titlepagetopglue \titlepagetopglue = 1.5in
3580 +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
3581 +
3582 +% First the title page.  Must do @settitle before @titlepage.
3583 +\newif\ifseenauthor
3584 +\newif\iffinishedtitlepage
3585 +
3586 +% Do an implicit @contents or @shortcontents after @end titlepage if the
3587 +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
3588 +%
3589 +\newif\ifsetcontentsaftertitlepage
3590 + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
3591 +\newif\ifsetshortcontentsaftertitlepage
3592 + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
3593 +
3594 +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
3595 +        \endgroup\page\hbox{}\page}
3596 +
3597 +\envdef\titlepage{%
3598 +  % Open one extra group, as we want to close it in the middle of \Etitlepage.
3599 +  \begingroup
3600 +    \parindent=0pt \textfonts
3601 +    % Leave some space at the very top of the page.
3602 +    \vglue\titlepagetopglue
3603 +    % No rule at page bottom unless we print one at the top with @title.
3604 +    \finishedtitlepagetrue
3605 +    %
3606 +    % Most title ``pages'' are actually two pages long, with space
3607 +    % at the top of the second.  We don't want the ragged left on the second.
3608 +    \let\oldpage = \page
3609 +    \def\page{%
3610 +      \iffinishedtitlepage\else
3611 +        \finishtitlepage
3612 +      \fi
3613 +      \let\page = \oldpage
3614 +      \page
3615 +      \null
3616 +    }%
3617 +}
3618 +
3619 +\def\Etitlepage{%
3620 +    \iffinishedtitlepage\else
3621 +       \finishtitlepage
3622 +    \fi
3623 +    % It is important to do the page break before ending the group,
3624 +    % because the headline and footline are only empty inside the group.
3625 +    % If we use the new definition of \page, we always get a blank page
3626 +    % after the title page, which we certainly don't want.
3627 +    \oldpage
3628 +  \endgroup
3629 +  %
3630 +  % Need this before the \...aftertitlepage checks so that if they are
3631 +  % in effect the toc pages will come out with page numbers.
3632 +  \HEADINGSon
3633 +  %
3634 +  % If they want short, they certainly want long too.
3635 +  \ifsetshortcontentsaftertitlepage
3636 +    \shortcontents
3637 +    \contents
3638 +    \global\let\shortcontents = \relax
3639 +    \global\let\contents = \relax
3640 +  \fi
3641 +  %
3642 +  \ifsetcontentsaftertitlepage
3643 +    \contents
3644 +    \global\let\contents = \relax
3645 +    \global\let\shortcontents = \relax
3646 +  \fi
3647 +}
3648 +
3649 +\def\finishtitlepage{%
3650 +  \vskip4pt \hrule height 2pt width \hsize
3651 +  \vskip\titlepagebottomglue
3652 +  \finishedtitlepagetrue
3653 +}
3654 +
3655 +%%% Macros to be used within @titlepage:
3656 +
3657 +\let\subtitlerm=\tenrm
3658 +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
3659 +
3660 +\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
3661 +               \let\tt=\authortt}
3662 +
3663 +\parseargdef\title{%
3664 +  \checkenv\titlepage
3665 +  \leftline{\titlefonts\rm #1}
3666 +  % print a rule at the page bottom also.
3667 +  \finishedtitlepagefalse
3668 +  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
3669 +}
3670 +
3671 +\parseargdef\subtitle{%
3672 +  \checkenv\titlepage
3673 +  {\subtitlefont \rightline{#1}}%
3674 +}
3675 +
3676 +% @author should come last, but may come many times.
3677 +% It can also be used inside @quotation.
3678 +%
3679 +\parseargdef\author{%
3680 +  \def\temp{\quotation}%
3681 +  \ifx\thisenv\temp
3682 +    \def\quotationauthor{#1}% printed in \Equotation.
3683 +  \else
3684 +    \checkenv\titlepage
3685 +    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
3686 +    {\authorfont \leftline{#1}}%
3687 +  \fi
3688 +}
3689 +
3690 +
3691 +%%% Set up page headings and footings.
3692 +
3693 +\let\thispage=\folio
3694 +
3695 +\newtoks\evenheadline    % headline on even pages
3696 +\newtoks\oddheadline     % headline on odd pages
3697 +\newtoks\evenfootline    % footline on even pages
3698 +\newtoks\oddfootline     % footline on odd pages
3699 +
3700 +% Now make TeX use those variables
3701 +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
3702 +                            \else \the\evenheadline \fi}}
3703 +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
3704 +                            \else \the\evenfootline \fi}\HEADINGShook}
3705 +\let\HEADINGShook=\relax
3706 +
3707 +% Commands to set those variables.
3708 +% For example, this is what  @headings on  does
3709 +% @evenheading @thistitle|@thispage|@thischapter
3710 +% @oddheading @thischapter|@thispage|@thistitle
3711 +% @evenfooting @thisfile||
3712 +% @oddfooting ||@thisfile
3713 +
3714 +
3715 +\def\evenheading{\parsearg\evenheadingxxx}
3716 +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
3717 +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
3718 +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3719 +
3720 +\def\oddheading{\parsearg\oddheadingxxx}
3721 +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
3722 +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
3723 +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3724 +
3725 +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
3726 +
3727 +\def\evenfooting{\parsearg\evenfootingxxx}
3728 +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
3729 +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
3730 +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3731 +
3732 +\def\oddfooting{\parsearg\oddfootingxxx}
3733 +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
3734 +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
3735 +  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
3736 +  %
3737 +  % Leave some space for the footline.  Hopefully ok to assume
3738 +  % @evenfooting will not be used by itself.
3739 +  \global\advance\pageheight by -\baselineskip
3740 +  \global\advance\vsize by -\baselineskip
3741 +}
3742 +
3743 +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
3744 +
3745 +
3746 +% @headings double      turns headings on for double-sided printing.
3747 +% @headings single      turns headings on for single-sided printing.
3748 +% @headings off         turns them off.
3749 +% @headings on          same as @headings double, retained for compatibility.
3750 +% @headings after       turns on double-sided headings after this page.
3751 +% @headings doubleafter turns on double-sided headings after this page.
3752 +% @headings singleafter turns on single-sided headings after this page.
3753 +% By default, they are off at the start of a document,
3754 +% and turned `on' after @end titlepage.
3755 +
3756 +\def\headings #1 {\csname HEADINGS#1\endcsname}
3757 +
3758 +\def\HEADINGSoff{%
3759 +\global\evenheadline={\hfil} \global\evenfootline={\hfil}
3760 +\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
3761 +\HEADINGSoff
3762 +% When we turn headings on, set the page number to 1.
3763 +% For double-sided printing, put current file name in lower left corner,
3764 +% chapter name on inside top of right hand pages, document
3765 +% title on inside top of left hand pages, and page numbers on outside top
3766 +% edge of all pages.
3767 +\def\HEADINGSdouble{%
3768 +\global\pageno=1
3769 +\global\evenfootline={\hfil}
3770 +\global\oddfootline={\hfil}
3771 +\global\evenheadline={\line{\folio\hfil\thistitle}}
3772 +\global\oddheadline={\line{\thischapter\hfil\folio}}
3773 +\global\let\contentsalignmacro = \chapoddpage
3774 +}
3775 +\let\contentsalignmacro = \chappager
3776 +
3777 +% For single-sided printing, chapter title goes across top left of page,
3778 +% page number on top right.
3779 +\def\HEADINGSsingle{%
3780 +\global\pageno=1
3781 +\global\evenfootline={\hfil}
3782 +\global\oddfootline={\hfil}
3783 +\global\evenheadline={\line{\thischapter\hfil\folio}}
3784 +\global\oddheadline={\line{\thischapter\hfil\folio}}
3785 +\global\let\contentsalignmacro = \chappager
3786 +}
3787 +\def\HEADINGSon{\HEADINGSdouble}
3788 +
3789 +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
3790 +\let\HEADINGSdoubleafter=\HEADINGSafter
3791 +\def\HEADINGSdoublex{%
3792 +\global\evenfootline={\hfil}
3793 +\global\oddfootline={\hfil}
3794 +\global\evenheadline={\line{\folio\hfil\thistitle}}
3795 +\global\oddheadline={\line{\thischapter\hfil\folio}}
3796 +\global\let\contentsalignmacro = \chapoddpage
3797 +}
3798 +
3799 +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
3800 +\def\HEADINGSsinglex{%
3801 +\global\evenfootline={\hfil}
3802 +\global\oddfootline={\hfil}
3803 +\global\evenheadline={\line{\thischapter\hfil\folio}}
3804 +\global\oddheadline={\line{\thischapter\hfil\folio}}
3805 +\global\let\contentsalignmacro = \chappager
3806 +}
3807 +
3808 +% Subroutines used in generating headings
3809 +% This produces Day Month Year style of output.
3810 +% Only define if not already defined, in case a txi-??.tex file has set
3811 +% up a different format (e.g., txi-cs.tex does this).
3812 +\ifx\today\undefined
3813 +\def\today{%
3814 +  \number\day\space
3815 +  \ifcase\month
3816 +  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
3817 +  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
3818 +  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
3819 +  \fi
3820 +  \space\number\year}
3821 +\fi
3822 +
3823 +% @settitle line...  specifies the title of the document, for headings.
3824 +% It generates no output of its own.
3825 +\def\thistitle{\putwordNoTitle}
3826 +\def\settitle{\parsearg{\gdef\thistitle}}
3827 +
3828 +
3829 +\message{tables,}
3830 +% Tables -- @table, @ftable, @vtable, @item(x).
3831 +
3832 +% default indentation of table text
3833 +\newdimen\tableindent \tableindent=.8in
3834 +% default indentation of @itemize and @enumerate text
3835 +\newdimen\itemindent  \itemindent=.3in
3836 +% margin between end of table item and start of table text.
3837 +\newdimen\itemmargin  \itemmargin=.1in
3838 +
3839 +% used internally for \itemindent minus \itemmargin
3840 +\newdimen\itemmax
3841 +
3842 +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
3843 +% these defs.
3844 +% They also define \itemindex
3845 +% to index the item name in whatever manner is desired (perhaps none).
3846 +
3847 +\newif\ifitemxneedsnegativevskip
3848 +
3849 +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
3850 +
3851 +\def\internalBitem{\smallbreak \parsearg\itemzzz}
3852 +\def\internalBitemx{\itemxpar \parsearg\itemzzz}
3853 +
3854 +\def\itemzzz #1{\begingroup %
3855 +  \advance\hsize by -\rightskip
3856 +  \advance\hsize by -\tableindent
3857 +  \setbox0=\hbox{\itemindicate{#1}}%
3858 +  \itemindex{#1}%
3859 +  \nobreak % This prevents a break before @itemx.
3860 +  %
3861 +  % If the item text does not fit in the space we have, put it on a line
3862 +  % by itself, and do not allow a page break either before or after that
3863 +  % line.  We do not start a paragraph here because then if the next
3864 +  % command is, e.g., @kindex, the whatsit would get put into the
3865 +  % horizontal list on a line by itself, resulting in extra blank space.
3866 +  \ifdim \wd0>\itemmax
3867 +    %
3868 +    % Make this a paragraph so we get the \parskip glue and wrapping,
3869 +    % but leave it ragged-right.
3870 +    \begingroup
3871 +      \advance\leftskip by-\tableindent
3872 +      \advance\hsize by\tableindent
3873 +      \advance\rightskip by0pt plus1fil
3874 +      \leavevmode\unhbox0\par
3875 +    \endgroup
3876 +    %
3877 +    % We're going to be starting a paragraph, but we don't want the
3878 +    % \parskip glue -- logically it's part of the @item we just started.
3879 +    \nobreak \vskip-\parskip
3880 +    %
3881 +    % Stop a page break at the \parskip glue coming up.  However, if
3882 +    % what follows is an environment such as @example, there will be no
3883 +    % \parskip glue; then the negative vskip we just inserted would
3884 +    % cause the example and the item to crash together.  So we use this
3885 +    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
3886 +    % \parskip glue after all.  Section titles are handled this way also.
3887 +    % 
3888 +    \penalty 10001
3889 +    \endgroup
3890 +    \itemxneedsnegativevskipfalse
3891 +  \else
3892 +    % The item text fits into the space.  Start a paragraph, so that the
3893 +    % following text (if any) will end up on the same line.
3894 +    \noindent
3895 +    % Do this with kerns and \unhbox so that if there is a footnote in
3896 +    % the item text, it can migrate to the main vertical list and
3897 +    % eventually be printed.
3898 +    \nobreak\kern-\tableindent
3899 +    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
3900 +    \unhbox0
3901 +    \nobreak\kern\dimen0
3902 +    \endgroup
3903 +    \itemxneedsnegativevskiptrue
3904 +  \fi
3905 +}
3906 +
3907 +\def\item{\errmessage{@item while not in a list environment}}
3908 +\def\itemx{\errmessage{@itemx while not in a list environment}}
3909 +
3910 +% @table, @ftable, @vtable.
3911 +\envdef\table{%
3912 +  \let\itemindex\gobble
3913 +  \tablecheck{table}%
3914 +}
3915 +\envdef\ftable{%
3916 +  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
3917 +  \tablecheck{ftable}%
3918 +}
3919 +\envdef\vtable{%
3920 +  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
3921 +  \tablecheck{vtable}%
3922 +}
3923 +\def\tablecheck#1{%
3924 +  \ifnum \the\catcode`\^^M=\active
3925 +    \endgroup
3926 +    \errmessage{This command won't work in this context; perhaps the problem is
3927 +      that we are \inenvironment\thisenv}%
3928 +    \def\next{\doignore{#1}}%
3929 +  \else
3930 +    \let\next\tablex
3931 +  \fi
3932 +  \next
3933 +}
3934 +\def\tablex#1{%
3935 +  \def\itemindicate{#1}%
3936 +  \parsearg\tabley
3937 +}
3938 +\def\tabley#1{%
3939 +  {%
3940 +    \makevalueexpandable
3941 +    \edef\temp{\noexpand\tablez #1\space\space\space}%
3942 +    \expandafter
3943 +  }\temp \endtablez
3944 +}
3945 +\def\tablez #1 #2 #3 #4\endtablez{%
3946 +  \aboveenvbreak
3947 +  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
3948 +  \ifnum 0#2>0 \tableindent=#2\mil \fi
3949 +  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
3950 +  \itemmax=\tableindent
3951 +  \advance \itemmax by -\itemmargin
3952 +  \advance \leftskip by \tableindent
3953 +  \exdentamount=\tableindent
3954 +  \parindent = 0pt
3955 +  \parskip = \smallskipamount
3956 +  \ifdim \parskip=0pt \parskip=2pt \fi
3957 +  \let\item = \internalBitem
3958 +  \let\itemx = \internalBitemx
3959 +}
3960 +\def\Etable{\endgraf\afterenvbreak}
3961 +\let\Eftable\Etable
3962 +\let\Evtable\Etable
3963 +\let\Eitemize\Etable
3964 +\let\Eenumerate\Etable
3965 +
3966 +% This is the counter used by @enumerate, which is really @itemize
3967 +
3968 +\newcount \itemno
3969 +
3970 +\envdef\itemize{\parsearg\doitemize}
3971 +
3972 +\def\doitemize#1{%
3973 +  \aboveenvbreak
3974 +  \itemmax=\itemindent
3975 +  \advance\itemmax by -\itemmargin
3976 +  \advance\leftskip by \itemindent
3977 +  \exdentamount=\itemindent
3978 +  \parindent=0pt
3979 +  \parskip=\smallskipamount
3980 +  \ifdim\parskip=0pt \parskip=2pt \fi
3981 +  \def\itemcontents{#1}%
3982 +  % @itemize with no arg is equivalent to @itemize @bullet.
3983 +  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
3984 +  \let\item=\itemizeitem
3985 +}
3986 +
3987 +% Definition of @item while inside @itemize and @enumerate.
3988 +%
3989 +\def\itemizeitem{%
3990 +  \advance\itemno by 1  % for enumerations
3991 +  {\let\par=\endgraf \smallbreak}% reasonable place to break
3992 +  {%
3993 +   % If the document has an @itemize directly after a section title, a
3994 +   % \nobreak will be last on the list, and \sectionheading will have
3995 +   % done a \vskip-\parskip.  In that case, we don't want to zero
3996 +   % parskip, or the item text will crash with the heading.  On the
3997 +   % other hand, when there is normal text preceding the item (as there
3998 +   % usually is), we do want to zero parskip, or there would be too much
3999 +   % space.  In that case, we won't have a \nobreak before.  At least
4000 +   % that's the theory.
4001 +   \ifnum\lastpenalty<10000 \parskip=0in \fi
4002 +   \noindent
4003 +   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
4004 +   \vadjust{\penalty 1200}}% not good to break after first line of item.
4005 +  \flushcr
4006 +}
4007 +
4008 +% \splitoff TOKENS\endmark defines \first to be the first token in
4009 +% TOKENS, and \rest to be the remainder.
4010 +%
4011 +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
4012 +
4013 +% Allow an optional argument of an uppercase letter, lowercase letter,
4014 +% or number, to specify the first label in the enumerated list.  No
4015 +% argument is the same as `1'.
4016 +%
4017 +\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
4018 +\def\enumeratey #1 #2\endenumeratey{%
4019 +  % If we were given no argument, pretend we were given `1'.
4020 +  \def\thearg{#1}%
4021 +  \ifx\thearg\empty \def\thearg{1}\fi
4022 +  %
4023 +  % Detect if the argument is a single token.  If so, it might be a
4024 +  % letter.  Otherwise, the only valid thing it can be is a number.
4025 +  % (We will always have one token, because of the test we just made.
4026 +  % This is a good thing, since \splitoff doesn't work given nothing at
4027 +  % all -- the first parameter is undelimited.)
4028 +  \expandafter\splitoff\thearg\endmark
4029 +  \ifx\rest\empty
4030 +    % Only one token in the argument.  It could still be anything.
4031 +    % A ``lowercase letter'' is one whose \lccode is nonzero.
4032 +    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
4033 +    %   not equal to itself.
4034 +    % Otherwise, we assume it's a number.
4035 +    %
4036 +    % We need the \relax at the end of the \ifnum lines to stop TeX from
4037 +    % continuing to look for a <number>.
4038 +    %
4039 +    \ifnum\lccode\expandafter`\thearg=0\relax
4040 +      \numericenumerate % a number (we hope)
4041 +    \else
4042 +      % It's a letter.
4043 +      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
4044 +        \lowercaseenumerate % lowercase letter
4045 +      \else
4046 +        \uppercaseenumerate % uppercase letter
4047 +      \fi
4048 +    \fi
4049 +  \else
4050 +    % Multiple tokens in the argument.  We hope it's a number.
4051 +    \numericenumerate
4052 +  \fi
4053 +}
4054 +
4055 +% An @enumerate whose labels are integers.  The starting integer is
4056 +% given in \thearg.
4057 +%
4058 +\def\numericenumerate{%
4059 +  \itemno = \thearg
4060 +  \startenumeration{\the\itemno}%
4061 +}
4062 +
4063 +% The starting (lowercase) letter is in \thearg.
4064 +\def\lowercaseenumerate{%
4065 +  \itemno = \expandafter`\thearg
4066 +  \startenumeration{%
4067 +    % Be sure we're not beyond the end of the alphabet.
4068 +    \ifnum\itemno=0
4069 +      \errmessage{No more lowercase letters in @enumerate; get a bigger
4070 +                  alphabet}%
4071 +    \fi
4072 +    \char\lccode\itemno
4073 +  }%
4074 +}
4075 +
4076 +% The starting (uppercase) letter is in \thearg.
4077 +\def\uppercaseenumerate{%
4078 +  \itemno = \expandafter`\thearg
4079 +  \startenumeration{%
4080 +    % Be sure we're not beyond the end of the alphabet.
4081 +    \ifnum\itemno=0
4082 +      \errmessage{No more uppercase letters in @enumerate; get a bigger
4083 +                  alphabet}
4084 +    \fi
4085 +    \char\uccode\itemno
4086 +  }%
4087 +}
4088 +
4089 +% Call \doitemize, adding a period to the first argument and supplying the
4090 +% common last two arguments.  Also subtract one from the initial value in
4091 +% \itemno, since @item increments \itemno.
4092 +%
4093 +\def\startenumeration#1{%
4094 +  \advance\itemno by -1
4095 +  \doitemize{#1.}\flushcr
4096 +}
4097 +
4098 +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
4099 +% to @enumerate.
4100 +%
4101 +\def\alphaenumerate{\enumerate{a}}
4102 +\def\capsenumerate{\enumerate{A}}
4103 +\def\Ealphaenumerate{\Eenumerate}
4104 +\def\Ecapsenumerate{\Eenumerate}
4105 +
4106 +
4107 +% @multitable macros
4108 +% Amy Hendrickson, 8/18/94, 3/6/96
4109 +%
4110 +% @multitable ... @end multitable will make as many columns as desired.
4111 +% Contents of each column will wrap at width given in preamble.  Width
4112 +% can be specified either with sample text given in a template line,
4113 +% or in percent of \hsize, the current width of text on page.
4114 +
4115 +% Table can continue over pages but will only break between lines.
4116 +
4117 +% To make preamble:
4118 +%
4119 +% Either define widths of columns in terms of percent of \hsize:
4120 +%   @multitable @columnfractions .25 .3 .45
4121 +%   @item ...
4122 +%
4123 +%   Numbers following @columnfractions are the percent of the total
4124 +%   current hsize to be used for each column. You may use as many
4125 +%   columns as desired.
4126 +
4127 +
4128 +% Or use a template:
4129 +%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
4130 +%   @item ...
4131 +%   using the widest term desired in each column.
4132 +
4133 +% Each new table line starts with @item, each subsequent new column
4134 +% starts with @tab. Empty columns may be produced by supplying @tab's
4135 +% with nothing between them for as many times as empty columns are needed,
4136 +% ie, @tab@tab@tab will produce two empty columns.
4137 +
4138 +% @item, @tab do not need to be on their own lines, but it will not hurt
4139 +% if they are.
4140 +
4141 +% Sample multitable:
4142 +
4143 +%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
4144 +%   @item first col stuff @tab second col stuff @tab third col
4145 +%   @item
4146 +%   first col stuff
4147 +%   @tab
4148 +%   second col stuff
4149 +%   @tab
4150 +%   third col
4151 +%   @item first col stuff @tab second col stuff
4152 +%   @tab Many paragraphs of text may be used in any column.
4153 +%
4154 +%         They will wrap at the width determined by the template.
4155 +%   @item@tab@tab This will be in third column.
4156 +%   @end multitable
4157 +
4158 +% Default dimensions may be reset by user.
4159 +% @multitableparskip is vertical space between paragraphs in table.
4160 +% @multitableparindent is paragraph indent in table.
4161 +% @multitablecolmargin is horizontal space to be left between columns.
4162 +% @multitablelinespace is space to leave between table items, baseline
4163 +%                                                            to baseline.
4164 +%   0pt means it depends on current normal line spacing.
4165 +%
4166 +\newskip\multitableparskip
4167 +\newskip\multitableparindent
4168 +\newdimen\multitablecolspace
4169 +\newskip\multitablelinespace
4170 +\multitableparskip=0pt
4171 +\multitableparindent=6pt
4172 +\multitablecolspace=12pt
4173 +\multitablelinespace=0pt
4174 +
4175 +% Macros used to set up halign preamble:
4176 +%
4177 +\let\endsetuptable\relax
4178 +\def\xendsetuptable{\endsetuptable}
4179 +\let\columnfractions\relax
4180 +\def\xcolumnfractions{\columnfractions}
4181 +\newif\ifsetpercent
4182 +
4183 +% #1 is the @columnfraction, usually a decimal number like .5, but might
4184 +% be just 1.  We just use it, whatever it is.
4185 +%
4186 +\def\pickupwholefraction#1 {%
4187 +  \global\advance\colcount by 1
4188 +  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
4189 +  \setuptable
4190 +}
4191 +
4192 +\newcount\colcount
4193 +\def\setuptable#1{%
4194 +  \def\firstarg{#1}%
4195 +  \ifx\firstarg\xendsetuptable
4196 +    \let\go = \relax
4197 +  \else
4198 +    \ifx\firstarg\xcolumnfractions
4199 +      \global\setpercenttrue
4200 +    \else
4201 +      \ifsetpercent
4202 +         \let\go\pickupwholefraction
4203 +      \else
4204 +         \global\advance\colcount by 1
4205 +         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
4206 +                   % separator; typically that is always in the input, anyway.
4207 +         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
4208 +      \fi
4209 +    \fi
4210 +    \ifx\go\pickupwholefraction
4211 +      % Put the argument back for the \pickupwholefraction call, so
4212 +      % we'll always have a period there to be parsed.
4213 +      \def\go{\pickupwholefraction#1}%
4214 +    \else
4215 +      \let\go = \setuptable
4216 +    \fi%
4217 +  \fi
4218 +  \go
4219 +}
4220 +
4221 +% multitable-only commands.
4222 +%
4223 +% @headitem starts a heading row, which we typeset in bold.
4224 +% Assignments have to be global since we are inside the implicit group
4225 +% of an alignment entry.  Note that \everycr resets \everytab.
4226 +\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
4227 +%
4228 +% A \tab used to include \hskip1sp.  But then the space in a template
4229 +% line is not enough.  That is bad.  So let's go back to just `&' until
4230 +% we encounter the problem it was intended to solve again.
4231 +%                                      --karl, nathan@acm.org, 20apr99.
4232 +\def\tab{\checkenv\multitable &\the\everytab}%
4233 +
4234 +% @multitable ... @end multitable definitions:
4235 +%
4236 +\newtoks\everytab  % insert after every tab.
4237 +%
4238 +\envdef\multitable{%
4239 +  \vskip\parskip
4240 +  \startsavinginserts
4241 +  %
4242 +  % @item within a multitable starts a normal row.
4243 +  % We use \def instead of \let so that if one of the multitable entries
4244 +  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
4245 +  % \endtemplate) expanding \doitemize.
4246 +  \def\item{\crcr}%
4247 +  %
4248 +  \tolerance=9500
4249 +  \hbadness=9500
4250 +  \setmultitablespacing
4251 +  \parskip=\multitableparskip
4252 +  \parindent=\multitableparindent
4253 +  \overfullrule=0pt
4254 +  \global\colcount=0
4255 +  %
4256 +  \everycr = {%
4257 +    \noalign{%
4258 +      \global\everytab={}%
4259 +      \global\colcount=0 % Reset the column counter.
4260 +      % Check for saved footnotes, etc.
4261 +      \checkinserts
4262 +      % Keeps underfull box messages off when table breaks over pages.
4263 +      %\filbreak
4264 +       % Maybe so, but it also creates really weird page breaks when the
4265 +       % table breaks over pages. Wouldn't \vfil be better?  Wait until the
4266 +       % problem manifests itself, so it can be fixed for real --karl.
4267 +    }%
4268 +  }%
4269 +  %
4270 +  \parsearg\domultitable
4271 +}
4272 +\def\domultitable#1{%
4273 +  % To parse everything between @multitable and @item:
4274 +  \setuptable#1 \endsetuptable
4275 +  %
4276 +  % This preamble sets up a generic column definition, which will
4277 +  % be used as many times as user calls for columns.
4278 +  % \vtop will set a single line and will also let text wrap and
4279 +  % continue for many paragraphs if desired.
4280 +  \halign\bgroup &%
4281 +    \global\advance\colcount by 1
4282 +    \multistrut
4283 +    \vtop{%
4284 +      % Use the current \colcount to find the correct column width:
4285 +      \hsize=\expandafter\csname col\the\colcount\endcsname
4286 +      %
4287 +      % In order to keep entries from bumping into each other
4288 +      % we will add a \leftskip of \multitablecolspace to all columns after
4289 +      % the first one.
4290 +      %
4291 +      % If a template has been used, we will add \multitablecolspace
4292 +      % to the width of each template entry.
4293 +      %
4294 +      % If the user has set preamble in terms of percent of \hsize we will
4295 +      % use that dimension as the width of the column, and the \leftskip
4296 +      % will keep entries from bumping into each other.  Table will start at
4297 +      % left margin and final column will justify at right margin.
4298 +      %
4299 +      % Make sure we don't inherit \rightskip from the outer environment.
4300 +      \rightskip=0pt
4301 +      \ifnum\colcount=1
4302 +       % The first column will be indented with the surrounding text.
4303 +       \advance\hsize by\leftskip
4304 +      \else
4305 +       \ifsetpercent \else
4306 +         % If user has not set preamble in terms of percent of \hsize
4307 +         % we will advance \hsize by \multitablecolspace.
4308 +         \advance\hsize by \multitablecolspace
4309 +       \fi
4310 +       % In either case we will make \leftskip=\multitablecolspace:
4311 +      \leftskip=\multitablecolspace
4312 +      \fi
4313 +      % Ignoring space at the beginning and end avoids an occasional spurious
4314 +      % blank line, when TeX decides to break the line at the space before the
4315 +      % box from the multistrut, so the strut ends up on a line by itself.
4316 +      % For example:
4317 +      % @multitable @columnfractions .11 .89
4318 +      % @item @code{#}
4319 +      % @tab Legal holiday which is valid in major parts of the whole country.
4320 +      % Is automatically provided with highlighting sequences respectively
4321 +      % marking characters.
4322 +      \noindent\ignorespaces##\unskip\multistrut
4323 +    }\cr
4324 +}
4325 +\def\Emultitable{%
4326 +  \crcr
4327 +  \egroup % end the \halign
4328 +  \global\setpercentfalse
4329 +}
4330 +
4331 +\def\setmultitablespacing{%
4332 +  \def\multistrut{\strut}% just use the standard line spacing
4333 +  %
4334 +  % Compute \multitablelinespace (if not defined by user) for use in
4335 +  % \multitableparskip calculation.  We used define \multistrut based on
4336 +  % this, but (ironically) that caused the spacing to be off.
4337 +  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
4338 +\ifdim\multitablelinespace=0pt
4339 +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
4340 +\global\advance\multitablelinespace by-\ht0
4341 +\fi
4342 +%% Test to see if parskip is larger than space between lines of
4343 +%% table. If not, do nothing.
4344 +%%        If so, set to same dimension as multitablelinespace.
4345 +\ifdim\multitableparskip>\multitablelinespace
4346 +\global\multitableparskip=\multitablelinespace
4347 +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
4348 +                                      %% than skip between lines in the table.
4349 +\fi%
4350 +\ifdim\multitableparskip=0pt
4351 +\global\multitableparskip=\multitablelinespace
4352 +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
4353 +                                      %% than skip between lines in the table.
4354 +\fi}
4355 +
4356 +
4357 +\message{conditionals,}
4358 +
4359 +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
4360 +% @ifnotxml always succeed.  They currently do nothing; we don't
4361 +% attempt to check whether the conditionals are properly nested.  But we
4362 +% have to remember that they are conditionals, so that @end doesn't
4363 +% attempt to close an environment group.
4364 +%
4365 +\def\makecond#1{%
4366 +  \expandafter\let\csname #1\endcsname = \relax
4367 +  \expandafter\let\csname iscond.#1\endcsname = 1
4368 +}
4369 +\makecond{iftex}
4370 +\makecond{ifnotdocbook}
4371 +\makecond{ifnothtml}
4372 +\makecond{ifnotinfo}
4373 +\makecond{ifnotplaintext}
4374 +\makecond{ifnotxml}
4375 +
4376 +% Ignore @ignore, @ifhtml, @ifinfo, and the like.
4377 +%
4378 +\def\direntry{\doignore{direntry}}
4379 +\def\documentdescription{\doignore{documentdescription}}
4380 +\def\docbook{\doignore{docbook}}
4381 +\def\html{\doignore{html}}
4382 +\def\ifdocbook{\doignore{ifdocbook}}
4383 +\def\ifhtml{\doignore{ifhtml}}
4384 +\def\ifinfo{\doignore{ifinfo}}
4385 +\def\ifnottex{\doignore{ifnottex}}
4386 +\def\ifplaintext{\doignore{ifplaintext}}
4387 +\def\ifxml{\doignore{ifxml}}
4388 +\def\ignore{\doignore{ignore}}
4389 +\def\menu{\doignore{menu}}
4390 +\def\xml{\doignore{xml}}
4391 +
4392 +% Ignore text until a line `@end #1', keeping track of nested conditionals.
4393 +%
4394 +% A count to remember the depth of nesting.
4395 +\newcount\doignorecount
4396 +
4397 +\def\doignore#1{\begingroup
4398 +  % Scan in ``verbatim'' mode:
4399 +  \catcode`\@ = \other
4400 +  \catcode`\{ = \other
4401 +  \catcode`\} = \other
4402 +  %
4403 +  % Make sure that spaces turn into tokens that match what \doignoretext wants.
4404 +  \spaceisspace
4405 +  %
4406 +  % Count number of #1's that we've seen.
4407 +  \doignorecount = 0
4408 +  %
4409 +  % Swallow text until we reach the matching `@end #1'.
4410 +  \dodoignore{#1}%
4411 +}
4412 +
4413 +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
4414 +  \obeylines %
4415 +  %
4416 +  \gdef\dodoignore#1{%
4417 +    % #1 contains the command name as a string, e.g., `ifinfo'.
4418 +    %
4419 +    % Define a command to find the next `@end #1', which must be on a line
4420 +    % by itself.
4421 +    \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
4422 +    % And this command to find another #1 command, at the beginning of a
4423 +    % line.  (Otherwise, we would consider a line `@c @ifset', for
4424 +    % example, to count as an @ifset for nesting.)
4425 +    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
4426 +    %
4427 +    % And now expand that command.
4428 +    \obeylines %
4429 +    \doignoretext ^^M%
4430 +  }%
4431 +}
4432 +
4433 +\def\doignoreyyy#1{%
4434 +  \def\temp{#1}%
4435 +  \ifx\temp\empty                      % Nothing found.
4436 +    \let\next\doignoretextzzz
4437 +  \else                                        % Found a nested condition, ...
4438 +    \advance\doignorecount by 1
4439 +    \let\next\doignoretextyyy          % ..., look for another.
4440 +    % If we're here, #1 ends with ^^M\ifinfo (for example).
4441 +  \fi
4442 +  \next #1% the token \_STOP_ is present just after this macro.
4443 +}
4444 +
4445 +% We have to swallow the remaining "\_STOP_".
4446 +%
4447 +\def\doignoretextzzz#1{%
4448 +  \ifnum\doignorecount = 0     % We have just found the outermost @end.
4449 +    \let\next\enddoignore
4450 +  \else                                % Still inside a nested condition.
4451 +    \advance\doignorecount by -1
4452 +    \let\next\doignoretext      % Look for the next @end.
4453 +  \fi
4454 +  \next
4455 +}
4456 +
4457 +% Finish off ignored text.
4458 +\def\enddoignore{\endgroup\ignorespaces}
4459 +
4460 +
4461 +% @set VAR sets the variable VAR to an empty value.
4462 +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
4463 +%
4464 +% Since we want to separate VAR from REST-OF-LINE (which might be
4465 +% empty), we can't just use \parsearg; we have to insert a space of our
4466 +% own to delimit the rest of the line, and then take it out again if we
4467 +% didn't need it.
4468 +% We rely on the fact that \parsearg sets \catcode`\ =10.
4469 +%
4470 +\parseargdef\set{\setyyy#1 \endsetyyy}
4471 +\def\setyyy#1 #2\endsetyyy{%
4472 +  {%
4473 +    \makevalueexpandable
4474 +    \def\temp{#2}%
4475 +    \edef\next{\gdef\makecsname{SET#1}}%
4476 +    \ifx\temp\empty
4477 +      \next{}%
4478 +    \else
4479 +      \setzzz#2\endsetzzz
4480 +    \fi
4481 +  }%
4482 +}
4483 +% Remove the trailing space \setxxx inserted.
4484 +\def\setzzz#1 \endsetzzz{\next{#1}}
4485 +
4486 +% @clear VAR clears (i.e., unsets) the variable VAR.
4487 +%
4488 +\parseargdef\clear{%
4489 +  {%
4490 +    \makevalueexpandable
4491 +    \global\expandafter\let\csname SET#1\endcsname=\relax
4492 +  }%
4493 +}
4494 +
4495 +% @value{foo} gets the text saved in variable foo.
4496 +\def\value{\begingroup\makevalueexpandable\valuexxx}
4497 +\def\valuexxx#1{\expandablevalue{#1}\endgroup}
4498 +{
4499 +  \catcode`\- = \active \catcode`\_ = \active
4500 +  %
4501 +  \gdef\makevalueexpandable{%
4502 +    \let\value = \expandablevalue
4503 +    % We don't want these characters active, ...
4504 +    \catcode`\-=\other \catcode`\_=\other
4505 +    % ..., but we might end up with active ones in the argument if
4506 +    % we're called from @code, as @code{@value{foo-bar_}}, though.
4507 +    % So \let them to their normal equivalents.
4508 +    \let-\realdash \let_\normalunderscore
4509 +  }
4510 +}
4511 +
4512 +% We have this subroutine so that we can handle at least some @value's
4513 +% properly in indexes (we call \makevalueexpandable in \indexdummies).
4514 +% The command has to be fully expandable (if the variable is set), since
4515 +% the result winds up in the index file.  This means that if the
4516 +% variable's value contains other Texinfo commands, it's almost certain
4517 +% it will fail (although perhaps we could fix that with sufficient work
4518 +% to do a one-level expansion on the result, instead of complete).
4519 +%
4520 +\def\expandablevalue#1{%
4521 +  \expandafter\ifx\csname SET#1\endcsname\relax
4522 +    {[No value for ``#1'']}%
4523 +    \message{Variable `#1', used in @value, is not set.}%
4524 +  \else
4525 +    \csname SET#1\endcsname
4526 +  \fi
4527 +}
4528 +
4529 +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
4530 +% with @set.
4531 +%
4532 +% To get special treatment of `@end ifset,' call \makeond and the redefine.
4533 +%
4534 +\makecond{ifset}
4535 +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
4536 +\def\doifset#1#2{%
4537 +  {%
4538 +    \makevalueexpandable
4539 +    \let\next=\empty
4540 +    \expandafter\ifx\csname SET#2\endcsname\relax
4541 +      #1% If not set, redefine \next.
4542 +    \fi
4543 +    \expandafter
4544 +  }\next
4545 +}
4546 +\def\ifsetfail{\doignore{ifset}}
4547 +
4548 +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
4549 +% defined with @set, or has been undefined with @clear.
4550 +%
4551 +% The `\else' inside the `\doifset' parameter is a trick to reuse the
4552 +% above code: if the variable is not set, do nothing, if it is set,
4553 +% then redefine \next to \ifclearfail.
4554 +%
4555 +\makecond{ifclear}
4556 +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
4557 +\def\ifclearfail{\doignore{ifclear}}
4558 +
4559 +% @dircategory CATEGORY  -- specify a category of the dir file
4560 +% which this file should belong to.  Ignore this in TeX.
4561 +\let\dircategory=\comment
4562 +
4563 +% @defininfoenclose.